单周期 32 位 MIPS 处理器上的数据路径

Data path on a single-cycle 32-bit MIPS processor

我正在做作业,我需要回答数据路径上标记为 A、B、C、D、E 的信号值,下面是一个单周期 32 位 MIPS 处理器,但是我有一些关于 D 和 E 的问题,

假设前四行已经执行,处理器正在执行lw指令。第一个addi 指令位于内存地址 0x00040210

addi $t0,$zero,0x3ff0
addi $t0,$t0,16
sw $t0,-8($t0)
addi $t0,$t0,12
lw $s2,-20($t0)

对于 D:

所以它是程序计数器之后的一条路径,我们已经执行了四条指令,第一条指令从地址0x00040210开始导致:

address 0x00040210: addi $t0,$zero,0x3ff0
address 0x00040214: addi $t0,$t0,16
address 0x00040218: sw $t0,-8($t0)
address ???: addi $t0,$t0,12
address ???: lw $s2,-20($t0)

我卡在了问题标记的地址处,如何从那里计算地址?

对于 E:

不知道该怎么办,希望高人指教?

D:

有一个加法器(在你的示意图中字母 "D" 上方)将常数 4 添加到 PC。

这意味着行 "D" 将始终保持值 PC+4 - 即使当前指令是跳转或分支指令。

如果指令不是跳转或分支指令,"D" 线会通过原理图左上角的两个多路复用器反馈到 PC 寄存器的输入。

这意味着 PC 的下一个值将是 PC+4 的旧值,除非执行跳转或分支指令。

顺便说一句:

原理图中的 CPU 不像真正的 MIPS CPU 那样工作(正如 10 年前在 WLAN 路由器中发现的那样)。

如果我正确理解原理图,只有两条指令可以执行 jump/branch:j 的变体和 beq 之一(或 beqz )(两种变体都不使用延迟槽)。

使用这样的 CPU 你不能进行子程序调用(函数调用),因为没有指令 "jumping back" 调用函数。

E:

"E" 是一些多路复用器的输出。如果您没有执行 "MemToReg" 指令(我想 lw 的意思),"B" 信号通过多路复用器馈送。

也就是说:如果当前指令不是lw,"E"和"B"是相等的。

如果指令是lw,"E"是存储在地址"B"的RAM中的值。

编辑

For E, still not sure how to get that outcome though

这真的是一个编程问题,而不是一个电子问题。让我们看看你的程序:

addi $t0,$zero,0x3ff0

现在 t0 包含 0x3FF0

addi $t0,$t0,16

现在 t0 包含 0x4000

sw $t0,-8($t0)

将值0x4000写入RAM地址0x3FF8(注:0x4000-8=0x3FF8)

addi $t0,$t0,12

现在 t0 包含 0x400C

lw $s2,-20($t0)

从地址0x3FF8读取一个字(注:0x400C-20=0x3FF8)。

以上两条指令,值0x4000已经写入地址0x3FF8。

因此,从 RAM 中读取值 0x4000。因此,值 0x4000 通过多路复用器馈送到行 "E".