「BUAA CO」P6总结

「BUAA CO」P6总结

Squirrel7ang Lv2

主要任务

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有关的指令。内置HILO寄存器.

顶层设计

P6_CIRC

其中红色为转发有关设计,绿色为阻塞有关设计,蓝色为乘除有关设计。

注意事项

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