将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第16篇,我尽量每周四篇 5.2OpenMIPS 对数据相关问题的解决措施 OpenMIPS 处理器采用数据前推的方法来解决流水线数据相关问题。通过补充完善图 4-4 原始的数据流图,添加部分信号使得可以完成数
将陆续上传本人写的新书《自己动手写CPU》(尚未出版),今天是第16篇,我尽量每周四篇
5.2 OpenMIPS 对数据相关问题的解决措施
OpenMIPS 处理器采用数据前推的方法来解决流水线数据相关问题。通过补充完善图 4-4 原始的数据流图,添加部分信号使得可以完成数据前推的工作,如图 5-7 所示。主要是将执行阶段的结果、访存阶段的结果前推到译码阶段,参与译码阶段选择运算源操作数的过程。
图 5-8 给出了为实现数据前推而对 OpenMIPS 系统结构所做的修改。有两个方面。
( 1 )将处于流水线执行阶段的指令的运算结果,包括:是否要写目的寄存器 wreg_o 、要写的目的寄存器地址 wd_o 、要写入目的寄存器的数据 wdata_o 等信息送到译码阶段,如图 5-8 中虚线所示。
( 2 )将处于流水线访存阶段的指令的运算结果,包括:是否要写目的寄存器 wreg_o 、要写的目的寄存器地址 wd_o 、要写入目的寄存器的数据 wdata_o 等信息送到译码阶段。
为此,译码阶段的 ID 模块要增加如表 5-1 所示的接口。
译码阶段的 ID 模块会依据送入的信息,进行综合判断,解决数据相关,给出最后要参与运算的操作数。 ID 模块的代码要做如下修改,其中主要修改部分使用加粗、斜体表示。修改后的代码位于本书光盘的 Code\ Chapter5_1目录下的 id.v 文件。
module id( ...... //处于执行阶段的指令的运算结果 input wire ex_wreg_i, input wire[`RegBus] ex_wdata_i, input wire[`RegAddrBus] ex_wd_i, //处于访存阶段的指令的运算结果 input wire mem_wreg_i, input wire[`RegBus] mem_wdata_i, input wire[`RegAddrBus] mem_wd_i, ...... //送到执行阶段的源操作数1、源操作数2 output reg[`RegBus] reg1_o, output reg[`RegBus] reg2_o, ...... ); ...... //给reg1_o赋值的过程增加了两种情况: //1、如果Regfile模块读端口1要读取的寄存器就是执行阶段要写的目的寄存器, // 那么直接把执行阶段的结果ex_wdata_i作为reg1_o的值; //2、如果Regfile模块读端口1要读取的寄存器就是访存阶段要写的目的寄存器, // 那么直接把访存阶段的结果mem_wdata_i作为reg1_o的值; always @ (*) begin if(rst == `RstEnable) begin reg1_o
除了修改译码阶段 ID 模块的代码,还要修改顶层模块 OpenMIPS 对应的代码,在其中增加图 5-8 所示的连接关系。具体修改过程不在书中列出,读者可以参考本书附带光盘的 Code\ Chapter5_1目录下的 openmips.v 文件。(代码会在稍后上传)
5.3 测试数据相关问题解决效果
测试程序如下,其中存在 5.1 节讨论的 RAW 相关的三种情况,源文件是本书附带光盘 Code\ Chapter5_1\AsmTest 目录下的 inst_rom.S 文件。
.org 0x0 .global _start .set noat _start: ori $1,$0,0x1100 # $1 = $0 | 0x1100 = 0x1100 ori $1,$1,0x0020 # $1 = $1 | 0x0020 = 0x1120 ori $1,$1,0x4400 # $1 = $1 | 0x4400 = 0x5520 ori $1,$1,0x0044 # $1 = $1 | 0x0044 = 0x5564
指令的注释给出了预期执行效果。将上述 inst_rom.S 文件,与第 4 章实现的 Bin2Mem.exe 、 Makefile 、 ram.ld 这三个文件拷贝到 Ubuntu 虚拟机中的同一个目录下,打开终端,使用 cd 命令进入该目录,然后输入 make all ,即可得到能够用于 ModelSim 仿真的 inst_rom.data 文件。
在 ModelSim 中新建一个工程,添加本书附带光盘 Code\ Chapter5_1目录下的所有 .v 文件,然后可以编译。再复制上面得到的 inst_rom.data 文件到 ModelSim 工程的目录下,就可以进行仿真了。 ModelSim 中新建工程、仿真的详细步骤可以参考第 2 章。
运行仿真,观察寄存器 $1 值的变化,如图 5-9 所示, $1 的变化符合预期,所以修改后的 OpenMIPS 正确解决了数据相关问题。
下一步将实现逻辑、移位、空指令,敬请关注!
查看更多关于自己动手写CPU之第五阶段(2)OpenMIPS对数据相关问题的解决的详细内容...