我正在做一个作业,我需要在下面的数据路径上回答标记为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:
我不确定我应该怎么去那里,希望有人能启发我?
答案 0 :(得分:1)
D:
有一个加法器(原理图中字母“ D”上方)将常数4添加到PC。
这意味着“ D”行将始终保持值PC+4
-即使当前指令是跳转或分支指令。
如果一条指令不是跳转指令或分支指令,则“ D”线将通过原理图左上方的两个多路复用器反馈到PC寄存器的输入。
这意味着PC
的下一个值将是PC+4
的旧值,除非执行了跳转或分支指令。
顺便说一句:
原理图中的CPU不能像真正的MIPS CPU一样工作(就像十年前在WLAN路由器中发现的那样)。
如果我正确理解了原理图,则只有两条指令可以执行跳转/跳转:j
的变体和beq
(或beqz
)之一(两种变体)不使用延迟槽)。
使用这样的CPU,您将无法进行子例程调用(函数调用),因为没有指令“跳回”调用函数。
E:
“ E”是某些多路复用器的输出。如果您不执行“ MemToReg”指令(我想是指lw
),那么“ B”信号将通过多路复用器馈入。
换句话说:如果当前指令不是lw
,则“ E”和“ B”相等。
如果指令为lw
,则“ E”是存储在RAM中地址“ B”的值。
编辑
对于E,仍然不确定如何获得结果
这实际上是编程而不是电子方面的问题。让我们看看您的程序:
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”行。