单周期处理器(LA版本)
延迟槽:曾几何时它很好,然而它非但无法解决延迟造成的流水线阻塞问题,而且会使微结构的设计复杂化,而且编译器并不能总是提取出有效指令填入流水线导致流水线中出现过量空指令,影响流水线性能
支持远距离跳转的指令集可以更好减少由于代码体积增大而产生的效率降低问题
跳转后还要从寄存器中获得对应的地址,故称间接跳转,link用于返回地址的链接
去掉unsigned的指令集依然是完整的
至少需要一条syscall才能使用操作系统,否则指令集无法区分用户态和核心态
务必注意当input的取值是最后一个值的时候的output
CPU = 数据通路 + 控制逻辑
指令在指令存储器中存储,地址为PC
每执行完一条指令,PC = PC + 4
指令存储器是一个静态存储器,所有写的端口恒为0
add.w: 从寄存器堆读取操作数,相加,写回寄存器堆
寄存器堆的读端口必须有两个,否则执行add需要两个周期;而写端口要有enable(或者reset)
addi.w: 与add.w唯一的区别就是第二个源操作数来自指令集中立即数符号扩展至32位
ld.w可以复用addi.w的数据通路,ld.w从从数据存储器中读取数据,取回的数据与加法器结果二选一放入寄存器堆
st.w写数据存储器,不写寄存器堆
务必注意:st.w的源操作数来自rd域,因为增加一个读端口会增加硬件开销
dest bne = PC + offset
bne根据判断的结果决定是否跳转
每次加指令时进行的检查:本条指令是否正确运行,已有的指令功能是否正常
zero寄存器的作用就是减少实现指令集子集时的xor
编写控制信号的真值表
存储器本质上属于核外单元,一些实际的案例中CPU的最顶层只有CLK和RESET
现如今的EDA几乎可以把电路性能优化到极致,所以要以可读性与可维护性作为更高的目标
不要写真值表,画卡诺图,直接对照指令的机器码格式和电路图敲Verilog
多一条assign可以提高代码可读性
b: 立即数增宽至26位
bl:b之后将PC + 4写入r1(单周期甚至可以直接拉线到MUX写入)
新增的控制信号依然要考虑所有的指令