考虑单周期 32 位 MIPS 的以下数据路径 处理器。
假设以下程序中正在执行lw指令:
lui $t2,0x3f ori $t2,$t2,0x11 lw $t8,4($t2)
说明
位于地址lui
。那么什么是 当0x40004044
指令为 A、B、C、D 和 E 的信号值 被处决?对于每个信号,用整数或 对于无法确定的信号值,写入未知 具有给定信息的精确值。lw
如何解决这个问题?我已经得到了答案,但我不知道如何解决实际问题以获得这些答案:
信号值为
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),通过只需在寄存器名称表中查找即可。
B
值是寄存器的内容,其编号称为源寄存器
A1
,位25:21又名rs
,此处为$t2
。这个值,即寄存器$t2
的内容,可以通过前面2条指令的执行来理解,这两条指令形成了$t2
的32位地址,即0x3f0011
。C
是数据存储器读取操作的输出。它是内存位置
0x3f0015
的值(根据寻址模式,来自 0x3f0011
+ 4)。由于这是一个奇怪的地址,因此它很可能会出错而不是产生一些值。如果没有出现故障,则要确定该值,您必须获得存储在从 0x3f0015
开始的 4 个内存位置中的值。D
是分支目标的计算,就好像指令是分支一样——然而它不是分支,但尽管如此,硬件只会计算分支目标地址,然后将其丢弃。在许多情况下,硬件的工作原理如下:计算我们不一定知道相关的东西,尽管计算是并行完成的,以防万一,而不是等到真正知道该值是否相关或相关时才计算它不。
这个值很简单(4lw $t8, 4($t2)
,加上 << 2), where the 4 comes from the 4 in
lw
的 PC 值/位置(加上 4,因为另一个输入是 PC 后增量 4)。因此,0x0400404c
+ 4 + (40x04004060
) .<<2) =