我试图自己学习一些计算机架构,但我有点卡在数据路径部分。我无法弄清楚如何将lui(立即加载立即)和ldi(立即加载数据)实现到下面的图片中,如果有人能帮助我并解释他们能做到的最好,我会非常高兴!
答案 0 :(得分:0)
<强>声明强>
我不是EE或CPU设计师
请务必向您的教授或助教提出有关课程材料的问题。
lui
编码为
31 26 25 21 20 16 15 0
+---------+ +-------+ +-------+ +-----------------------------+
| 0xf | | d.c. | | RT | | IMMEDIATE |
+---------+ +-------+ +-------+ +-----------------------------+
6 bits 5 bits 5 bits 16 bits
其中
D.C。 =不在乎。允许任何值 RT =注册目标。要写入的寄存器。
IMMEDIATE =要加载的常量。
执行如下:
该指令已加载到指令寄存器中,因此:
指令[31-26] ,转发给** Op [5-0] *,是 0xf 。
指令[25-21] ,转发给读取寄存器1 ,将被忽略,因此必须是任何后续数据流,必须忽略,因此右侧的多路复用器必须选择源0.因此 AluSrcA = 0 。
指令[20-16] 转发至读取寄存器2 和写入寄存器,因为lui
只写,输出 B 必须被忽略,因此ALU的较低多路复用器不能使用源。此外,必须将写入寄存器之前的多路复用器编程为选择源0,因此 RegDst = 0 。
指令[15-0] 遵循各种数据路径。第一个是在原理图的上半部分,它不会循环回寄存器文件(通过写入数据),因此可以忽略它。
较低的数据路径将指令[15-0] 作为较低ALU多路复用器的源2和3(第一个是符号扩展,第二个是符号扩展并乘以4)。
所有这些路径都进入了ALU,所以从理论上讲,所有这些路径都可以实现lui
(符号扩展和移位不是问题,让自己相信这一点。)
我相信使用源2更加惯用,所以 ALUsrcB = 2 。
ALU的结果在写入数据之前返回到多路复用器,因此 MemToReg = 0 ,当然 RegWrite = 1 。
ALUop 必须是将 SrcB 左移16的值。
没有内存写入或读取,因此 MemWrite 和 MemRead 均为0.
其他信号在流水线的其他阶段使用,特别是在提取 1 期间必须更新PC,这由 PCWrite , PCWriteCond涵盖, IorD , PCSource 和 IRWrite ,以及 B ALU操作数的输入1(价值4)。
1 这个CPU似乎只有一个ALU,因此必须注意避免在交错不同阶段时停止。特别是EX和IF阶段不能同时执行,所以一段时间内指令停止或者CPU根本没有流水线。