微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

确定来自给定指令的数据路径的值

如何解决确定来自给定指令的数据路径的值

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


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

enter image description here

解决方法

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

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

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

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

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

希望您可以看到,对于条件分支指令,Branch 控制信号被断言 (1/true) — 该信号与 Zero 结合进入与门,从而导致 {{ 1}} 表示采用分支,而 1 表示不采用分支,通过在 AND 门之后控制该 MUX。因此,可以采用分支的唯一条件 [pc := pc + sxt(imm)*2] 是 0Branch 都为真。如果Zero为假,则不是分支指令,所以Branch无所谓,如果Zero为假,则分支条件为假,所以Zero为覆盖 [pc := pc + 4]。

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

Branch

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


PC := (Branch & Zero) ? PC + sxt(imm)*2 : PC + 4; 对于这个动态控制信号的名称来说是一个相当糟糕的选择。我会选择 ZeroTake。我相信 Taken 的名称源自较旧的 RISC 架构。


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

,

你问的是非常依赖于实现的。从图中我猜它是一些 MIPS 或 MIPS,如 uarch。根据 ISA,一些真正的 RISC 实现在 PC 中具有 (curr_instr_addr+2instrsize)。这有一些历史原因,因为在旧机器上管道的深度是 3 个级别。所以L1有下一条或下一条指令的addr。我不能说具体是哪个。如果 beq 指令在 ALU 中,则 L2 具有前一条指令的 MemToReg 以确定是否需要回写阶段。如果下一条指令是分支,L3 保持零标志以绕过流水线直接到 PC。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。