购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.6 第二条及后续指令的读取过程分析

3.6.1 复位信号无效后的第二个时钟周期的上升沿

1.GENPC模块的信号变化

参考3.5.1节中的代码,此时icpu_cycstb_o保持为1(复杂情况我们暂不讨论),pcreg_default变为pc,也就是0x104,pcreg也变为0x104,pc加4,变为0x108,是第三条指令的地址。从这里我们可以归纳得出:GENPC模块的变量pc,始终保存着下一条指令的地址,而pcreg保存着刚刚取到的指令地址,该指令还没有进入流水线的译码阶段。

2.IF模块的信号变化

变化的信号不影响系统的执行,暂时不考虑。

3.QMEM模块的信号变化

在QMEM中,变量state会保持为OR1200_QMEMFSM_FETCH,同时持qmem_iack保为1。

将地址信号addr寄存到变量addr_reg,此时addr为0x104。

3.6.2 复位信号无效后的第二个时钟周期的组合逻辑阶段

同3.5.3节。

再往后取第三条、第四条等后续指令都是一样的过程。这就是一种理想的取指情况:即icpu_adr_o值依次增加,也就依次读出QMEM中的指令,这也是Wishbone总线规范中块读周期的过程,如图3.20所示。

图3.20 理想的取指过程

但实际情况是复杂的,比如:在上面的分析中认为GENPC的icpu_cycstb_o始终为1,重复列出该信号定义如下。

当genpc_freeze为1,或者pre_branch_op不为0时,都会导致icpu_cycstb_o为0,此时指令Wishbone总线就处于无效状态,也就不会读出指令。在分析转移指令的时候就会发生这种情况。

再比如:在上面分析的时候认为icpu_adr_o值依次增加,在每个时钟加4,但实际上icpu_adr_o的值是一个复杂的变量,受很多因素的影响,重复列出该信号如下。

很多因素我们都没有考虑,是不是在这里考虑所有的因素呢?这样看起来似乎会更加完善。笔者不这么认为,OR1200是一个系统,一个整体,各个模块之间的联系很紧密,相互影响,比如:在3.5.1节分析icpu_rty_i值的时候就要通过多个模块才能确定其值。此处如果考虑所有的情况,比如:列出什么时候icpu_adr_o加4,什么时候不加4,什么时候保持不变,这样做的工作量实在是很庞大,笔者没有这个能力保证所有的读者都听得懂,所以此处只给出了一种理想情况,也是OR1200大部分时候的运行情况,在后面当分析到某些指令、某些场景的时候,会具体分析这些指令、场景是如何影响这个理想的取指过程的。比如:当我们分析系统调用指令l.sys的时候,就会介绍l.sys对这个取指过程的影响,分析转移指令l.bf的时候就会介绍l.bf对这个取指过程的影响,分析特殊寄存器读指令l.mfspr的时候就会介绍l.mfspr对这个取指过程的影响。通过这样一步一步的探索,由简到繁,由不求甚解到全面了解,最后揭示得出结论,而不是直接给出结论,再分析得出这个结论的理由。笔者认为前者更符合我们认识事物的规律。 wiDlSp9Irmpl9zDu/uKiKqaAvCQPi33kVnnQbCKzYc8BpxQNmzaiuJFLwfxdrqkZ

点击中间区域
呼出菜单
上一章
目录
下一章
×