我正在回答一个关于5级RISC的CPU数据路径的问题,我想我误解了加载指令是如何处理的。
其中MUX 1取NPC或Src 1寄存器数据作为输入,MUX 2取Src 2寄存器数据或立即值作为输入,MUX 3取NPC或ALU的输出(有时是用于分支的零标志)作为输入,MUX 4取ALU输出或存储器数据作为输入。
我们需要为指令“mov R 0,[R1 + 1000]”给予每个多路复用器的输入(这里指令的形式是“op,dest,src 1,src 2”).我很确定对于这个指令R 0是src 1,R1是src 2,1000是立即数,但是我不知道在执行和内存访问阶段应该如何处理这些问题,以便计算正确的结果。
任何帮助将不胜感激!抱歉,如果这个问题是错综复杂的。
1条答案
按热度按时间qpgpyjmq1#
考虑到问题中的各种不匹配,让我们看一些场景。
首先,
mov R0, [R1+1000]
从有效地址R1+1000加载,并以R 0为目标。这是可能的,因为RISC V和MIPS(以及x86中的Intel语法)一样,将目标指定为第一个操作数,正如您在“op dest,src 1,src 2”中提到的那样。
加载指令是I型指令,具有rs 1、rd和imm作为指令字段。加载指令具有一个寄存器源、一个立即数源和一个寄存器目标(从存储器读取结果的寄存器目标)。
MUX 1将在NPC(在此情况下为未知值)与来自寄存器rs 1(在此情况下也为未知值)的值之间进行选择。控制信号将使其选择rs 1,因此来自R1的值为MUX 1的输出。
MUX 2将在rs 2和立即数之间进行选择。在I型指令中没有rs 2字段,但硬件仍将位20-24解释为寄存器号,并查找该寄存器的值以馈送到MUX 2的一个输入。另一个输入将来自符号扩展立即数1000。显然,控制信号将使其选择立即值而不是错误的RS 2值。
(If我们可以通过检查指令的位来确定rs 2的寄存器号。在此指令中,第20-24位可能来自立即数字段,但这些位仍然存在。在指令解码的早期阶段,硬件实际上并不知道它是哪种指令,因此,其并行地进行此rs 2查找,以防其为确实使用rs 2字段的指令类型中的一者。控制信号将告知后续ALU/EX级忽略此推测性地执行的查找。)
MUX 3将被给予三个不同的输入,一个是NPC,另一个是ALU输出,即R1+1000,另一个是另一个寄存器值。控制信号将告诉MUX 3选择NPC值(其他值是错误的)。
MUX 4将从R1 + 1000处的存储器读取的值和R1 + 1000本身作为ALU输出提供给MUX 4,控制信号将告诉MUX 4选择从存储器读取的值。
第二,
mov R0, [R1+1000]
可能是一条存储指令,存储的值来自R0
,存储在地址R1 + 1000。存储指令为S类型,具有rs 1、rs 2及imm指令字段。存储指令有两个寄存器源和一个立即数-没有寄存器目标。
无论哪种方式,MUX 1、MUX 2和MUX 3的操作与第一种情况相同,因为存储指令与加载指令一样,也从rs 1 + imm(这里为R1 + 1000)计算存储器操作的有效地址。
MUX 4将在内存输出上的一些垃圾(没有读操作,所以内存输出是垃圾)或ALU输出R1 + 1000之间进行选择。选择什么无关紧要,因为reg write为假,并且无论如何不会发生写回(这是存储,而不是加载-存储中的写入是到内存中,而不是到寄存器中)。