BUAA计组p6_Pipeline_复习tips
p6
乘除模块的start
一、 乘除模块
(一)mdu要求
- 执行乘法的时间为5个cycle,包含写入内部的HI和LO
- 执行除法的时间为10个cycle,包含写入内部的HI和LO
- 通过有效一个cycle的start信号启动乘除法运算
- 通过busy输出标志反映延迟
(二)相关指令
- mult、multu、div、divu
- mfhi、mflo、mthi、mtlo
(三)模块设计
-
input:clk, reset, A[31:0], B[31:0], start, busy
-
output: HI[31:0], LO[31:0]
-
instr控制control_2内start==1,control_mdu[2:0]控制计算类型
-
识别start为1,busy置1,且开始计数,计数大小由control_mdu决定取值
-
识别到start时,计算结果始终存在两个pre寄存器内,当busy计数至目标值时转存给HI和LO
-
注意busy和start为1时,instr_01为乘除法指令时一律阻塞
-
同时注意乘除法指令与其他指令的冲突关系
二、指令练习
(一)计算类指令
- madd、maddu、msub、msubu
- 注意busy在对应乘除条件下的初始值
(二) 访存类指令
- lhs
- 注意与lh指令的区别:
- 不考虑异常时,lh对于2'b10和2'b11同操作,对2'b00和2'b01同操作
- lhs指令仅在2'b00和2'b10条件下写寄存器,否则不写入寄存器,即条件写
- 解决思路:将读数据的地址低两位和instr一同流水,传给control_4;instr和addr[1:0]一同控制写使能与A3_4
- 注意与lh指令的区别:
(三) 跳转类指令
- link: _zal:条件跳转,无条件写入pc+4;但实际与mars行为一致的情况下为条件写
link likely:_zall:条件跳转,无条件写入pc+4,条件不成立时清空延迟槽
_zalr:条件跳转,条件写寄存器
三、条件写的冲突
(一) 跳转类条件写地址的冲突
例如_zal 将tnew设置为0时,需要考虑到如果最终没有写入,则会在过程中转发错误值
-
解决方法1:
- tnew设置为3
- 在contorl_4的A3_4和GRF写使能均用branch_4特判
-
解决方法2:(最终采用下面这种,符合全力转发的要求)
- tnew依旧设置为0
- 将branch_1-4导入对应的1-4级的control,每一级的写入寄存器A3用branch特判
(二) 存储类条件写数值的冲突
- 解决方法
- tnew设置为2(保险起见,直接给3也可)
- 由于写入的数据在WB级才确定WD,因此将instr与写入信号一同特判写使能