文章目录
1. 数据冒险RAM解决分析解决2. 实现逻辑、移位指令2.1 修改ID模块2.2 修改EX模块3. 测试3.2 测试3 逻辑操作指令3.2 测试4 移位操作指令1. 数据冒险RAM解决
分析
一般是有三种情况:RAW,WAR,WAW(导致寄存器的值不是最新值)
但是所有指令在流水线回写阶段才会写寄存器,因此没有WRW问题;又因为只能在译码阶段读寄存器,回写阶段写寄存器,不存在WAR问题。所以只需要考虑RAW问题
两个冲突的指令相邻0、1条都不行,相邻两条才可以(如下图)
解决
采用数据转发的方法(下图),分别对应间隔0、1条指令两种情况,把执行、访存阶段的EX、MEM模块的结果直接返回译码阶段的寄存器中
对应代码,对译码阶段ID模块接口的修改;对顶层模块openmips.v的连接进行修改
下面对于修改的结果进行测试:
对于下面四条指令,是存在RAW问题的,但是通过数据转发解决了
2. 实现逻辑、移位指令
修改译码阶段的ID,实现对新指令的译码修改执行阶段的EX,按照译码结果运算2.1 修改ID模块
对于SPECIAL类的指令,依次判断指令的6~10bit(op2)和0~5bit(op3),确定指令类型。对于其它指令,直接由指令26 ~31bit(op)判断注意SLL\SRL\SRA指令的单独处理:先判断指令的21~31位是否全为0,如果全为0,再根据op3判断类型下面以AND指令为例,讲一下详细的译码过程
(1)读取的寄存器:读取rs、rt寄存器,所以reg1_read_o、reg2_read_o都要设置为1,reg1_addr_o的值默认21~25bit,正对应rs,不用设置,reg2_addr_o同理
(2)执行的运算:逻辑与,所以设置 alusel_o 为 EXE_RES_LOGIC,aluop_o 为 EXE_AND_OP
(3)写入的目的寄存器:需要写入目的寄存器,所以wreg_o 设置为WriteEnable,wd_o默认指令的11~15bit,正好对应rd位置,不用设置
其它指令类似,如果不需要寄存器,则把reg1_addr_o 或者wd_o的值修改为指令对应的位数即可
2.2 修改EX模块
相应扩展逻辑和移位的运算即可
3. 测试
3.2 测试3 逻辑操作指令
主要看寄存器 $1 ~ 4的变化情况,正确✔
3.2 测试4 移位操作指令
主要看寄存器$2的变化情况,正确✔
如果觉得《【五级流水线CPU】—— 3. 逻辑 移位与空指令 + 数据冒险RAM解决》对你有帮助,请点赞、收藏,并留下你的观点哦!