自己动手写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
  end

endmodule

接下来将修改访存阶段。

时间: 2024-10-12 13:47:56

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

自己动手写CPU之第九阶段(4)——加载存储指令实现思路

将陆续上传新书<自己动手写CPU>,今天是第40篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30 9.2 加载存储指令实现思路 9.2.1 实现思路 本节介绍除ll.sc之外的加载存储指令的实现思路,ll.sc指令的实现思路

自己动手写CPU之第九阶段(9)——修改OpenMIPS以实现ll、sc指令

将陆续上传新书<自己动手写CPU>,今天是第48篇. 9.8 修改OpenMIPS以实现ll.sc指令 9.8.1 LLbit寄存器的实现 LLbit寄存器在LLbit模块中实现,模块接口如图9-30所示,各接口描述如表9-8所示. LLbit寄存器的代码如下,源文件是本书光盘Code\Chapter9_2目录下的LLbit_reg.v文件. module LLbit_reg( input wire clk, input wire rst, // 异常是否发生,为1表示异常发生,为0表示没有异

自己动手写CPU之第九阶段(1)——加载存储指令说明2(lwl、lwr)

将陆续上传新书<自己动手写CPU>,今天是第38篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-20 今天继续对MIPS32中加载存储指令进行说明(主要是lwl.lwr),上次已经介绍一些其他的加载存储指令,大家可以回顾. 9.

自己动手写CPU之第九阶段(6)——修改最小SOPC

将陆续上传新书<自己动手写CPU>,今天是第45篇. 这几天事情多,好久没更新了 前几篇实现了加载存储指令,今天将修改最小SOPC,用以测试加载存储指令是否实现正确.闲话少说,进入正题. 9.4 修改最小SOPC 为了验证上一节添加的加载存储指令是否实现正确,需要修改在第4章中设计的最小SOPC,为其添加数据存储器RAM. 9.4.1 添加数据存储器RAM 数据存储器RAM的接口如图9-24所示,还是采用左边是输入接口,右边是输出接口的方式绘制,这样便于理解.接口含义如表9-7所示. 数据存储

自己动手写CPU之第九阶段(3)——加载存储指令说明2(swl、swr)

将陆续上传新书<自己动手写CPU>,今天是第39篇,我尽量每周四篇,但是最近已经很久没有实现这个目标了,一直都有事,不好意思哈. 开展晒书评送书活动,在亚马逊.京东.当当三大图书网站上,发表<自己动手写CPU>书评的前十名读者,均可获赠<步步惊芯--软核处理器内部设计分析>一书,大家踊跃参与吧!活动时间:2014-9-11至2014-10-30 今天继续对MIPS32中加载存储指令进行说明(主要是swl.swr),上次已经介绍一些其他的加载存储指令,大家可以回顾. 9.

自己动手写CPU之第九阶段(7)——MIPS32中的LL、SC指令说明

将陆续上传新书<自己动手写CPU>,今天是第46篇. 在MIPS32指令集中有两条特殊的存储加载指令:链接加载指令LL.条件存储指令SC,本次将介绍这两条指令,在后续将实现这两条指令. 9.6 链接加载指令ll.条件存储指令sc说明 在本章前面的部分,笔者花费很多笔墨介绍了OpenMIPS中除ll.sc之外的加载.存储指令的实现过程,本节至9.9节将专门介绍链接加载指令ll.条件存储指令sc的实现过程.ll.sc指令是MIPS32指令集架构中比较特殊的加载存储指令,用来实现信号量机制. 在多线

自己动手写CPU之第九阶段(8)——MIPS32中的LL、SC指令说明

将陆续上传新书<自己动手写CPU>,今天是第47篇. 9.7 ll.sc指令实现思路 9.7.1 实现思路 这2条指令都涉及到访问链接状态位LLbit,可以将LLbit当做寄存器处理,ll指令需要写该寄存器,sc指令需要读该寄存器,同时,与对通用寄存器的访问一样,对LLbit寄存器的写操作也放在回写阶段进行. ll指令在访存阶段要读取数据存储器中指定地址的数据,还要设置对LLbit寄存器的写操作,写入的值为1,这个写操作会通过MEM/WB模块传递到回写阶段,最终实现对LLbit寄存器的写. s

自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)

将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9%AC%E9%80%8A&ie=utf-8&src=se_lighten_f" style="color:rgb(51,102,153); text-decoration:none; font-family:Arial; font-size:14px; line-heigh

自己写CPU第九阶段(3)——加载存储指令说明2(swl、swr)

我们会继续上传新书<q=%E8%87%AA%E5%B7%B1%E5%8A%A8%E6%89%8B%E5%86%99CPU&ie=utf-8&src=se_lighten_quotes_f" style="color:rgb(0,0,240); text-decoration:none; position:static; display:inline">自己动手写CPU>,今天是第39篇,我尽量每周四篇.可是近期已经非常久没有实现这个目标了,一