首页 > 代码库 > 自己动手写CPU之第九阶段(5)——实现加载存储指令2(修改执行阶段)

自己动手写CPU之第九阶段(5)——实现加载存储指令2(修改执行阶段)

将陆续上传新书《自己动手写CPU》,今天是第42篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈。

开展晒书评送书活动,在亚马逊、京东、当当三大图书网站上,发表《自己动手写CPU》书评的前十名读者,均可获赠《步步惊芯——软核处理器内部设计分析》一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30

 

9.3.2 修改执行阶段

      1、修改EX模块

      在执行阶段的EX模块会计算加载存储的目的地址,参考图9-19可知,EX模块会增加部分接口,如表9-3所示。

     修改执行阶段的EX模块如下。完整代码位于本书附带光盘Code\Chapter9_1目录下的ex.v文件。

module ex(  ......  //新增输入接口inst_i,其值就是当前处于执行阶段的指令  input wire[`RegBus]           inst_i,  ......  //下面新增的几个输出接口是为加载、存储指令准备的  output wire[`AluOpBus]        aluop_o,  output wire[`RegBus]          mem_addr_o,  output wire[`RegBus]          reg2_o,  ......);  ......  //aluop_o会传递到访存阶段,届时将利用其确定加载、存储类型  assign aluop_o = aluop_i;  //mem_addr_o会传递到访存阶段,是加载、存储指令对应的存储器地址,此处的reg1_i   //就是加载、存储指令中地址为base的通用寄存器的值,inst_i[15:0]就是指令中的  //offset。通过mem_addr_o的计算,读者也可以明白为何要在译码阶段ID模块新增输  //出接口inst_o  assign mem_addr_o = reg1_i + {{16{inst_i[15]}},inst_i[15:0]};  //reg2_i是存储指令要存储的数据,或者lwl、lwr指令要加载到的目的寄存器的原始值,  //将该值通过reg2_o接口传递到访存阶段  assign reg2_o = reg2_i;  ......


 

      2、修改EX/MEM模块

      参考图9-19可知,EX/MEM模块会增加部分接口,用于将EX模块新增的输出传递到访存阶段,增加的接口描述如表9-4所示。

      修改执行阶段的EX/MEM模块如下,只是一个简单的传递操作,当流水线的执行阶段没有被暂停时,将来自执行阶段EX模块的输出传递到访存阶段。完整代码请参考本书附带光盘Code\Chapter9_1目录下的ex_mem.v文件。

module ex_mem(   ...... 	   //为实现加载、存储指令而添加的输入接口   input wire[`AluOpBus]        ex_aluop,   input wire[`RegBus]          ex_mem_addr,   input wire[`RegBus]          ex_reg2,   ......   //为实现加载、存储指令而添加的输出接口   output reg[`AluOpBus]        mem_aluop,   output reg[`RegBus]          mem_mem_addr,   output reg[`RegBus]          mem_reg2,		   ......);   always @ (posedge clk) begin     if(rst == `RstEnable) begin        ......        mem_aluop    <= `EXE_NOP_OP;        mem_mem_addr <= `ZeroWord;        mem_reg2     <= `ZeroWord;     end else if(stall[3] == `Stop && stall[4] == `NoStop) begin        ......        mem_aluop    <= `EXE_NOP_OP;        mem_mem_addr <= `ZeroWord;        mem_reg2     <= `ZeroWord;      end else if(stall[3] == `NoStop) begin         ......        mem_aluop    <= ex_aluop;        mem_mem_addr <= ex_mem_addr;        mem_reg2     <= ex_reg2;     end else begin        ......     end  endendmodule


接下来将修改访存阶段。

自己动手写CPU之第九阶段(5)——实现加载存储指令2(修改执行阶段)