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

3.5 复位后取第一条指令的过程分析

假如宇宙始于一次大爆炸,那么我们的OR1200就始于加电的那一刻,但此刻还是一片混沌(内部还没有初始化),所以需要一个复位信号,复位之后,OR1200的世界就进入一个确定性的世界了,会依次取得指令并执行,本节分析取得第一条指令的过程。

3.5.1 复位信号有效阶段

复位信号有效阶段指的是OR1200的输入信号rst为1的时期。

通过图3.8可知CPU中的GENPC模块产生指令地址(icpu_adr_o),以及指令Wishbone总线周期的开始信号(icpu_cycstb_o),从QMEM取得的指令(icpu_dat_i)送入IF模块。所以我们的关注点就是GENPC模块、IF模块和QMEM模块。

1.GENPC模块的信号变化

在GENPC模块中有如下代码,确定指令Wishbone总线的总线周期开始信号icpu_cycstb_o、地址信号icpu_adr_o的值。

上式中很多信号都是外部输入到GENPC的,通过or1200_cpu.vsd可以很清楚地知道信号的来源(再次强调多使用光盘中的or1200_top.vsd、or1200_cpu.vsd,会给我们带来很大的方便),以no_more_dslot为例,该信号来自CTRL模块的输出no_more_dslot,在CTRL模块中有如下代码。

所以no_more_dslot在复位的时候为0。使用同样的步骤可以发现在复位的时候except_start、spr_pc_wr、genp_freeze、pre_branch_op都为0,所以复位的时候GENPC的icpu_cycstb_o信号为1。但是变量icpu_rty_i不同,通过分析可以得出图3.14,从中可知icpu_rty_i的值最终取决于WB_BIU模块中的icbiu_ack_o、icbiu_err_o。

图3.14 GENPC模块的icpu_rty_i信号与WB_BIU模块有关

在WB_BIU模块中,icbiu_ack_o、icbiu_err_o的值如下。

复位的时候biu_ack_o、biu_err_o都为0,所以GENPC的icpu_rty_i为1,导致GENPC模块的输出icpu_adr_o等于icpu_adr_i。

参考图3.8可知GENPC的icpu_adr_i来自IMMU模块,是IMMU的输出icpu_adr_o,IMMU中有如下代码。

从上述代码可知在复位的时候IMMU的输出信号icpu_adr_o为0x100,所以复位的时候GENPC的输入icpu_adr_i就是0x100。此时GENPC的输出icpu_adr_o等于icpu_adr_i,所以GENCP的输出icpu_adr_o是0x100。

通过上面的分析可知在复位的时候GENPC的输出icpu_adr_o为0x100、icpu_cycstb_o为1,对照Wishbone总线的规范可知,也就是主设备的输出CYCSTB_O有效,表示总线操作开始,主设备的输出ADR_O为0x100。

此外在GENPC模块内部也有一些信号变化,其代码如下。

ModelSim仿真波形如图3.15所示,可验证复位信号有效阶段GENPC的信号确如上面的分析。

图3.15 ModelSim仿真显示GENPC模块在复位信号有效阶段的信号值

2.IF模块的信号变化

QMEM的输出数据送到IF的icpu_dat_i,但该数据不一定就是下一步需要执行的指令,在IF模块中变量if_insn表示下一步需要执行的指令,其定义如下。

在复位的时候no_more_dslot、rfe、if_bypass和saved都为0,读者可以自行分析原因,icpu_ack_i来自QMEM的输出qmemicpu_ack_o,通过分析,在复位阶段icpu_ack_i的值最终由WB_BIU模块中的icbiu_ack_o确定,如图3.16所示。

图3.16 GENPC模块的icpu_ack_i信号与WB_BIU有关

在复位的时候WB_BIU模块icbiu_ack_o为0,所以IF的输入icpu_ack_i为0。从而if_insn为{`OR1200_OR32_NOP, 26’h061_0000},这里OR1200_OR32_NOP的值就是6’b000101,所以if_insn为0x14610000。

综合对GENPC、IF模块的分析,可以得出在复位信号有效阶段,CPU、QMEM之间的指令Wishbone总线的信号如图3.17所示,此处还是从主设备的角度观察信号,即观察CPU侧的信号情况。从图中可以了解到总线操作周期开始了(CYCSTB_O为1),地址也送出去了,但是还没有收到从设备的响应(ACK_I为0)。

图3.17 复位信号有效阶段CPU、QMEM之间Wishbone总线的信号

3.QMEM模块的信号变化

对QMEM模块重点分析其内部RAM的接口信号,如3.4节的分析,主要是qmem_en、qmem_we和qmem_addr。

qmem_we、qmem_addr的值取决于qmemdmmu_cycstb_i的值,从图3.11中可知该信号连接到CPU内部的LSU模块的dcpu_cycstb_o,在LSU中有如下代码。

从上面的代码可知在复位的时候dcpu_cycstb_o为0,所以QMEM中RAM的qmem_we为0,qmem_addr为qmemimmu_adr_i,即指令Wishbone总线输入的地址,此时是0x100。

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

1.GENPC模块的信号变化

复位信号无效指的是OR1200的输入rst为0的时期。

参考3.5.1节中的内容,此时pcreg_select变为0。

2.IF模块的信号变化

IF模块中有变化的信号不影响系统执行,暂时不考虑。

3.QMEM模块的信号变化

在QMEM中的变量state会变为OR1200_QMEMFSM_FETCH,同时qmem_icak为1。

在上述分析知道QMEM内部RAM的片选信号ce为1,地址信号addr为qmem_addr[12:2],也就是0x40,写信号we为0,所以此时会寄存地址信号,addr_reg变为0x40。

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

1.QMEM模块的信号变化

QMEM的内部RAM会给出第一条指令,位于mem[0x40]处。

由QMEM内部RAM的例化语句可知doq连接到QMEM的qmem_do,并且此时qmem_iack为1,所以qmemicpu_dat_o为qmem_do,也就是第一条指令的值,同时qmemicpu_ack_o为1。

参考图3.8可知qmemicpu_ack_o输出到IF模块的接口icpu_ack_i,qmemicpu_dat_o输出到IF模块的接口icpu_dat_i。

2.IF模块的信号变化

IF模块的icpu_ack_i为1,会将QMEM读出的第一条指令icpu_dat_i赋值给变量if_insn,此时从Wishbone总线的角度观察,icpu_ack_i为1表示从设备响应了主设备,图3.18是ModelSim仿真显示此时指令Wishbone总线的信号。

图3.18 复位信号无效后的第一个时钟周期CPU、QMEM之间Wishbone总线信号

3.GENPC模块的信号变化

参考3.5.1节中的内容,此时pcreg变为0x40,pc还是0x104,icpu_rty_o为0,不考虑ex_branch_taken、spr_pc_we,认为两者都是0,所以icpu_adr_o变为pc的值,代码如下。

icpu_adr_o会变为0x104,也就是第二条指令的地址。图3.19给出了通过ModelSim仿真得到的复位信号无效后第一个时钟周期的信号变化。通过分析可知在这第一个时钟周期完成了第一条指令的获取,同时也做好了获取下一条指令的准备。

图3.19 ModelSim仿真显示在复位信号无效后的第一个时钟周期取到第一条指令 wiDlSp9Irmpl9zDu/uKiKqaAvCQPi33kVnnQbCKzYc8BpxQNmzaiuJFLwfxdrqkZ

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