结构
设计思路
实际上,从 P5 到 P6 是一个轻松而惬意的过程。
因为大部分的数据通路在 P5 时已经设计完成,在 P6 只需要针对新增指令修修补补即可
唯一需要稍微注意的是新增的乘除模块
乘除模块和 ALU
模块并没有本质上的区别。不过 CPU 实现乘除操作需要进行的操作复杂,关键路径较长,其耗时比加减法要高出一个数量级
那么,如果将乘法操作直接加入到 ALU
中,E 级的关键路径将大大加长,从而导致 CPU 效率大幅度降低
为了减少乘除操作对其它计算操作的影响,可以单独构建一个乘除法器,并且为其设置单独的寄存器和读取指令来与通用寄存器交互。这样,乘除操作就可以和其他计算操作并行进行,互不影响
由于在 P6 中周期时间为一个固定的较大值,几乎任何组合逻辑操作都可以在一个周期内完成。为了体现乘除操作耗时较长的特性,我们将乘除法器设置为多周期元件,占用多个周期进行计算,同时使用 Busy
标志标记,表示其工作状态
在课程设计中,乘除法器位于 E
级。当其在工作状态时,与乘除法及乘除法寄存器相关的操作将导致指令流阻塞;倘若没有出现相关指令,指令流可正常与乘除法并行运行
当然,乘除相关指令之间甚至乘除指令和普通指令间的冲突都可以进行优化。比方说若出现两个连续的乘法指令,由于后面乘法指令将完全覆盖前面乘法指令的结果,故可以不再阻塞,直接进入乘除模块,覆盖前一条指令开始计算
测试方案
指令集:add
, sub
, and
, or
, slt
, sltu
, lui
, addi
, andi
, ori
, lb
, lh
, lw
, sb
, sh
, sw
, mult
, multu
, div
, divu
, mfhi
, mflo
, mthi
, mtlo
, beq
, bne
, jal
, jr
测试目标
单计算指令行为
单存取指令行为
单跳转指令行为
计算/存取指令数据冲突阻塞转发行为
跳转指令与计算/存取指令数据冲突阻塞转发行为
新增存储指令行为
单指令乘除指令行为以及
Busy
信号表现乘除指令阻塞行为
计算指令/乘除指令的数据冲突阻塞转发行为