cpu-architecture - 根据给定指令确定数据路径的值
问题描述
在特定的时钟周期内,考虑图中所示的 CPU。
假设存在以下初始数据
(所有值均以十进制显示,DM 为数据存储器):x3=8,x14=40
在所讨论的周期内,假设执行了以下指令
(第一列是指令的地址; 所有值均以十进制显示):
50788 beq x3,x14,80
如何确定 L1、L2 和 L3 的值
根据我的理解,L1 将具有程序计数器
但是我如何确定程序计数器
L2 的值将是 0 还是 1,具体取决于它是否使用 MemtoReg
现在确定 L3。虽然以上是猜测。
任何提示或指示如何对此进行处理?
解决方案
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 门,导致1
for take the branch vs. 0
for don't take the branch,通过在 AND 门之后控制该 MUX。因此,可以采用分支的唯一条件 [pc := pc + sxt(imm)*2] 是当两者Branch
都Zero
为真时。如果Branch
为假,则不是分支指令,所以Zero
没关系,如果Zero
为假,则分支条件为假,因此Branch
被覆盖[pc := pc + 4]。
更明确地说,PC 更新电路说:
PC := (Branch & Zero) ? PC + sxt(imm)*2 : PC + 4;
使用 C 三元运算符(也可以使用 if-then-else 编写)。
Zero
这个动态控制信号的名称是一个相当糟糕的选择。我会选择Take
或Taken
取而代之。我相信这个名字Zero
是来自旧的 RISC 架构的历史。
该电路遵循 RISC V 标准,将分支目标立即域乘以 2(而不是 MIPS 中的 4),并且该标准使得常规 4 字节指令在存在压缩指令的情况下是相同的(不变的)——因此,在支持压缩指令的硬件上,不需要模式切换,并且压缩指令可以与未压缩指令交错(与 MIPS16 或 ARM Thumb 不同)。但是,此框图不提供执行压缩指令所需的其他功能(一方面,在此 PC 更新电路中没有增量 2 选项,另一方面,没有压缩指令扩展器,它将进入指令之间内存输出和解码逻辑)。
推荐阅读
- php - 在 PHP SQL 中使用函数
- c# - 如何将自定义类型作为参数传递给已编译的 cmdlet?
- google-apps-script - 在特定时间编写脚本以清除数据,归档清除的数据,并在可能的情况下将某些字段移动到单独的工作表
- android - 我的带有 externalProject_add (cmake) 的 android 应用程序不执行 ninja
- javascript - JavaScript - 推送数组的索引
- sql - 面临 3 个表的 SQL 查询问题
- python - 泡菜和打开文件的区别?
- c# - WPF .Net Core 3.1 WPF 转换不顺利(有趣的问题!!)
- python - 如何在 Python 中绘制此函数?
- jsf - Etat HTTP 500 - 无法找到带有 [0] 参数的方法 [isDelaiAvis]