5 级 RISC - 如何处理负载?
5-Stage RISC - How are loads handled?
我正在研究一个关于 CPU 5 级 RISC 数据路径的问题,我认为我误解了加载指令的处理方式。鉴于此数据路径:
其中MUX1将NPC或Src1寄存器数据作为输入,MUX2将Src2寄存器数据或立即数作为输入,MUX3将NPC或ALU的输出(有时是分支的零标志)作为输入,并且MUX4 将 ALU 输出或内存数据作为输入。
我们被要求为指令“mov R0,[R1 + 1000]”(其中指令的形式为“op,dest,src1,src2”)提供每个多路复用器的输入。我很确定对于这条指令 R0 将是 src1,R1 将是 src2 并且 1000 将是一个立即值,但我不知道如何在执行和内存访问阶段处理这些以计算正确的结果。
如有任何帮助,我们将不胜感激!对不起,如果这个问题令人费解。
鉴于问题中的各种不匹配,让我们看一些场景。
首先,mov R0, [R1+1000]
从有效地址R1+1000加载,目标为R0。
这是可能的,因为 RISC V 与 MIPS(和 x86 中的 Intel 语法)一样将目标指定为第一个操作数,正如您在“op dest, src1, src2”中提到的那样。
加载指令是I-Type条指令,并且有rs1、rd和imm作为指令字段。加载指令有一个寄存器源、一个立即源和一个寄存器目标(一个用于接收从内存中读取的结果)。
MUX1 将在 NPC(在这种情况下具有未知值)和来自寄存器 rs1 的值之间进行选择,这里是 R1(在这种情况下也是未知值)。控制信号将使其选择 rs1,因此 R1 的值是 MUX1 的输出。
MUX2 会在 rs2 和立即数之间进行选择。 I-Type 指令中没有 rs2 字段,但硬件仍会将第 20-24 位解释为寄存器编号,并查找该寄存器的值以提供给 MUX2 的输入之一。另一个输入将来自符号扩展立即数 1000。显然,控制信号将导致它选择立即数而不是错误的 rs2 值。
(如果我们愿意,我们可以通过检查指令的位来确定 rs2 的寄存器编号。在此指令中,那些位 20-24 将来自立即字段,但这些位仍然存在。在此在指令解码的早期,硬件实际上并不知道它是什么类型的指令,因此它会并行执行此 rs2 查找,以防万一它是使用 rs2 字段的指令类型之一。控制信号将告诉后续 ALU/EX 阶段忽略这个推测性执行的查找。)
MUX3会得到三个不同的输入,一个是NPC,一个是ALU输出,也就是R1+1000,还有一个是另一个寄存器值。控制信号会告诉 MUX3 选择 NPC 值(其他都是错误的)。
MUX4 将从内存中读取的值 R1 + 1000 和 R1 + 1000 本身作为 ALU 输出。控制信号将告诉 MUX4 选择从内存中读取的值。
其次,mov R0, [R1+1000]
可能是一条存储指令。存储的值来自 R0
,它存储在地址 R1 + 1000.
存储指令是 S-Type 并且有 rs1、rs2 和 imm 指令字段。存储指令有两个寄存器源和一个立即数——没有寄存器目标。
无论哪种方式,MUX1、MUX2 和 MUX3 的操作都与第一种情况相同,因为存储指令和加载指令一样,也会从 rs1 + imm 计算内存操作的有效地址,这里是 R1 + 1000 .
MUX4 将在内存输出上的一些垃圾(没有读取操作,因此内存输出是垃圾)或 ALU 输出 R1 + 1000 之间做出选择。选择什么并不重要,因为reg write 为 false,并且无论如何都不会发生回写(它是存储,而不是加载——存储中的写入是写入内存而不是寄存器)。
我正在研究一个关于 CPU 5 级 RISC 数据路径的问题,我认为我误解了加载指令的处理方式。鉴于此数据路径:
其中MUX1将NPC或Src1寄存器数据作为输入,MUX2将Src2寄存器数据或立即数作为输入,MUX3将NPC或ALU的输出(有时是分支的零标志)作为输入,并且MUX4 将 ALU 输出或内存数据作为输入。
我们被要求为指令“mov R0,[R1 + 1000]”(其中指令的形式为“op,dest,src1,src2”)提供每个多路复用器的输入。我很确定对于这条指令 R0 将是 src1,R1 将是 src2 并且 1000 将是一个立即值,但我不知道如何在执行和内存访问阶段处理这些以计算正确的结果。
如有任何帮助,我们将不胜感激!对不起,如果这个问题令人费解。
鉴于问题中的各种不匹配,让我们看一些场景。
首先,mov R0, [R1+1000]
从有效地址R1+1000加载,目标为R0。
这是可能的,因为 RISC V 与 MIPS(和 x86 中的 Intel 语法)一样将目标指定为第一个操作数,正如您在“op dest, src1, src2”中提到的那样。
加载指令是I-Type条指令,并且有rs1、rd和imm作为指令字段。加载指令有一个寄存器源、一个立即源和一个寄存器目标(一个用于接收从内存中读取的结果)。
MUX1 将在 NPC(在这种情况下具有未知值)和来自寄存器 rs1 的值之间进行选择,这里是 R1(在这种情况下也是未知值)。控制信号将使其选择 rs1,因此 R1 的值是 MUX1 的输出。
MUX2 会在 rs2 和立即数之间进行选择。 I-Type 指令中没有 rs2 字段,但硬件仍会将第 20-24 位解释为寄存器编号,并查找该寄存器的值以提供给 MUX2 的输入之一。另一个输入将来自符号扩展立即数 1000。显然,控制信号将导致它选择立即数而不是错误的 rs2 值。
(如果我们愿意,我们可以通过检查指令的位来确定 rs2 的寄存器编号。在此指令中,那些位 20-24 将来自立即字段,但这些位仍然存在。在此在指令解码的早期,硬件实际上并不知道它是什么类型的指令,因此它会并行执行此 rs2 查找,以防万一它是使用 rs2 字段的指令类型之一。控制信号将告诉后续 ALU/EX 阶段忽略这个推测性执行的查找。)
MUX3会得到三个不同的输入,一个是NPC,一个是ALU输出,也就是R1+1000,还有一个是另一个寄存器值。控制信号会告诉 MUX3 选择 NPC 值(其他都是错误的)。
MUX4 将从内存中读取的值 R1 + 1000 和 R1 + 1000 本身作为 ALU 输出。控制信号将告诉 MUX4 选择从内存中读取的值。
其次,mov R0, [R1+1000]
可能是一条存储指令。存储的值来自 R0
,它存储在地址 R1 + 1000.
存储指令是 S-Type 并且有 rs1、rs2 和 imm 指令字段。存储指令有两个寄存器源和一个立即数——没有寄存器目标。
无论哪种方式,MUX1、MUX2 和 MUX3 的操作都与第一种情况相同,因为存储指令和加载指令一样,也会从 rs1 + imm 计算内存操作的有效地址,这里是 R1 + 1000 .
MUX4 将在内存输出上的一些垃圾(没有读取操作,因此内存输出是垃圾)或 ALU 输出 R1 + 1000 之间做出选择。选择什么并不重要,因为reg write 为 false,并且无论如何都不会发生回写(它是存储,而不是加载——存储中的写入是写入内存而不是寄存器)。