首页 > 解决方案 > 根据给定指令确定数据路径的值

问题描述

在特定的时钟周期内,考虑图中所示的 CPU。
假设存在以下初始数据
(所有值均以十进制显示,DM 为数据存储器):x3=8,x14=40
在所讨论的周期内,假设执行了以下指令
(第一列是指令的地址; 所有值均以十进制显示):
50788 beq x3,x14,80
如何确定 L1、L2 和 L3 的值


根据我的理解,L1 将具有程序计数器
但是我如何确定程序计数器
L2 的值将是 0 还是 1,具体取决于它是否使用 MemtoReg
现在确定 L3。虽然以上是猜测。
任何提示或指示如何对此进行处理?

在此处输入图像描述

标签: cpu-architectureriscv

解决方案


L1 有 50788,这是当前正在执行的分支指令的地址——它是输入指令存储器的地址,导致获取beq x3, x14, 80.

您可以遵循在 L1 之后,有一个 ADDer,它将向 PC 值加 4(将该值提供给后续电路),加 4 以跳过这个 4 字节指令,从而引用下一个连续的内存地址,它保存下一个顺序指令。

L2 是“不关心”,这意味着它是 0 还是 1 无关紧要,因此相同基本设计的不同实现可以使用任一值。为什么这个信号是 0 还是 1 都没有关系?因为该指令是条件分支,因此不会更新寄存器,所以RegWrite会为 0,因此 的值WriteData不重要并被忽略

硬件是执行指令集中任何指令的所有必要组件的联合体,因此,在执行不同指令期间,这里或那里的某些电路未使用。允许执行任何给定指令的未使用电路,而不是关闭未使用的电路(这是一种需要设计和实现工作的先进技术,此处未采用) - 但是(无论是关闭还是允许执行)控制信号进一步向下设置数据路径线,以根据当前指令忽略这些未使用电路的结果。

L3 是分支条件信号,它动态地通知 PC 更新电路是否采用分支。在这里,该条件在 ALU 中有效地从表达式中生成x3 == x14并确定该控制信号的值:如果它们相等,则该控制信号需要为 1 才能使其进行分支(根据条件分支指令的定义)并且该控制信号需要为 0 以使其不采用分支,而是继续顺序执行。

希望您可以看到,对于条件分支指令,Branch控制信号被断言(1/true)——这个信号结合Zero进入一个 AND 门,导致1for take the branch vs. 0for don't take the branch,通过在 AND 门之后控制该 MUX。因此,可以采用分支的唯一条件 [pc := pc + sxt(imm)*2] 是当两者BranchZero为真时。如果Branch为假,则不是分支指令,所以Zero没关系,如果Zero为假,则分支条件为假,因此Branch被覆盖[pc := pc + 4]。

更明确地说,PC 更新电路说:

PC := (Branch & Zero) ? PC + sxt(imm)*2 : PC + 4;

使用 C 三元运算符(也可以使用 if-then-else 编写)。


Zero这个动态控制信号的名称是一个相当糟糕的选择。我会选择TakeTaken取而代之。我相信这个名字Zero是来自旧的 RISC 架构的历史。


该电路遵循 RISC V 标准,将分支目标立即域乘以 2(而不是 MIPS 中的 4),并且该标准使得常规 4 字节指令在存在压缩指令的情况下是相同的(不变的)——因此,在支持压缩指令的硬件上,不需要模式切换,并且压缩指令可以与未压缩指令交错(与 MIPS16 或 ARM Thumb 不同)。但是,此框图不提供执行压缩指令所需的其他功能(一方面,在此 PC 更新电路中没有增量 2 选项,另一方面,没有压缩指令扩展器,它将进入指令之间内存输出和解码逻辑)。


推荐阅读