失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【五级流水线CPU】—— 3. 逻辑 移位与空指令 + 数据冒险RAM解决

【五级流水线CPU】—— 3. 逻辑 移位与空指令 + 数据冒险RAM解决

时间:2023-07-06 03:14:05

相关推荐

【五级流水线CPU】—— 3. 逻辑 移位与空指令 + 数据冒险RAM解决

文章目录

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解决》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。