「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 进行许可。