「BUAA CO」P6总结
主要任务
1.新增指令
本次课下P6总共需要实现指令一共28条,其中
- R类算术指令6条:
add
,and
,or
,slt
,sltu
,sub
- I类算术指令4条:
addi
,andi
,lui
,ori
- Jr类指令1条:
jr
- Jump类指令1条:
jal
- branch类指令2条:
beq
,bne
- 乘除指令4条:
mult
,multu
,div
,divu
- HILO指令4条:
mfhi
,mflo
,mthi
,mtlo
- load类指令3条:
lb
,lh
,lw
- store类指令3条:
sb
,sh
,sw
指令按照字典序排序为:add
, addi
, and
, andi
,beq
, bne
, div
, divu
,jal
, jr
, lb
, lh
,lui
, lw
, mfhi
, mflo
,mthi
, mtlo
, mult
, multu
,ori
, or
, sb
, sh
,slt
, sltu
, sub
, sw
相较以前还是减了不少负。虽然但是难度没有降低太多,只是设计不会再像以往那么繁琐复杂了。
2.新增模块
增加乘除模块(下统称为MDU
,即Mult-Div Unit
),置于E级,完成乘除类指令和与HILO
有关的指令。内置HI
和LO
寄存器.
顶层设计
其中红色为转发有关设计,绿色为阻塞有关设计,蓝色为乘除有关设计。
注意事项
1.单条乘除指令的实现
官方大大简化了乘除指令的实现,使得我们不需要搭建乘法器和除法器,只需要在相应的时钟周期内完成乘法和除法就行。
乘除指令的时钟周期
乘法占用5个周期,除法10个周期。但是实际上可能并不是这样。拿mult
来说,根据教程的波形图我们可以知道:
start
信号1周期busy
信号5周期- 在
busy
信号有效的最后一个时钟周期内阻塞信号也是有效的,因此还会再拖1个周期
所以严格来说乘法在E级停留了7个周期,比一般只停留1个周期的指令多停留了6个周期,5个周期指的是Busy
信号有5个周期,即运算了5个周期,暂停信号是Start
信号和Busy
信号做或运算的结果,因此有6个周期的暂停信号。
除法指令同上,不同的是busy
信号有10个周期。
具体实现
本人是使用有限状态机实现课程对于MDU
的要求。不同人的实现方法不同,需要注意的是考虑到课上几乎必考一条乘除指令,需要除以MDU
在运算方式和运算时钟周期上的可扩展性。具体实现可以参考我的仓库 ,但是考虑到我的设计的可读性不强,建议自行搭建。
2.乘除指令的暂停阻塞
当start
信号和Busy
信号的任意一个有效时,就要产生一个阻塞信号。MDU的阻塞信号和P5的阻塞信号效果完全一致,因此“或”一下就行。
乘除指令和HILO
指令加在一起总共8条。这八条指令可以分为两类,即需要读HILO
的指令和写HILO
的指令。读后写不需要阻塞,写后读必须阻塞,写后写可以阻塞也可以不阻塞,官方测试保证不会在写后写HILO
上卡时间。
乘除指令不会影响乘除和HILO
指令之外的指令,这些不受影响的指令要正常流水。
3.其它问题
- 指令多了,请认真检查控制信号。
- 在一些人的实现中,乘除指令的操作数和乘除类型都要用
reg
保存在MDU中,以免被后续指令覆盖。要么需要用两个reg
存储运算结果,并在结束运算时写入HILO
。
- 标题: 「BUAA CO」P6总结
- 作者: Squirrel7ang
- 创建于 : 2024-01-02 22:12:03
- 更新于 : 2024-01-09 23:09:44
- 链接: https://redefine.ohevan.com/2024/01/02/CO/P6/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。