考虑单周期 32 位 MIPS 处理器的以下数据路径。
假设以下程序中正在执行lw指令:
lui $t2,0x3f
原 $t2,$t2,0x11
lw $t8,4($t2)
指令lui位于地址0x40004044。那么执行lw指令时A、B、C、D、E的信号值是多少呢?对于每个信号,请用整数回答,或者在无法使用给定信息确定准确值的情况下为信号值写入未知。
任何人都可以指导我如何解决这个问题吗?我已经得到了答案,但我不知道如何解决实际问题才能得到这些答案。
答案:
信号值为
A = 24
B = 0x003f0011
C = 未知
D = 0x40004060
E = 0x4000404C
首先,由于这是一个单周期处理器,因此在感兴趣的
lw
之前有指令这一事实,仅影响寄存器(包括 PC)中的值,而不影响 lw
执行时的控制信号。
如果
lui
指令存储在 0x40004044
,则 ori
存储在 0x40004048
,而 lw
存储在 0x4000404C
。因此,当lw
执行时,当前PC值为0x4000404C
。
那么,让我们从
E
开始,它是一个PC值:0x4000404C
,lw
指令的位置。您可以看到这一行从 PC 寄存器出来,进入指令存储器,这是对 lw
指令位的提取。该 PC 值也进入增量电路,该电路将 PC 值加 4,以便顺序执行下一条指令。
接下来,
A
是lw
指令的目标寄存器号。我们怎么知道呢?这是一个“指令解码”的问题。 lw
指令具有I-Type格式。这意味着 rs
和 rt
字段是相关的。它执行R[rt] = M[R[rs]+SignExtImm]
。 rs
字段占用比特25:21并且rt
字段占用比特20:16。因此,在lw $t8,4($t2)
中,$t8
是rt
,而从$t8
的友好名称我们可以知道$24
的实际寄存器编号值,因此24基十(即2410),通过只需在寄存器名称表中查找即可。