mips - MIPS 单周期 - 为什么 MemRead 和 MemToReg 是分开的?
问题描述
我目前正在研究 MIPS 单周期处理器数据路径的来龙去脉。
我找不到原因,为什么 MemRead 和 MemtoReg 之间存在差异。我目前的理解是,如果我们想从数据内存中加载一些东西,如果我们加载一些我们想在寄存器中使用它的东西,并且如果我们不想加载一些我们想使用结果的东西,我们将 MemRead 设置为 1寄存器中的 ALU(前提是 RegWrite 设置为 1)。那么为什么 MemRead 和 MemtoReg 有不同的信号呢?
这是我正在使用的数据路径:
解决方案
好吧,我认为部分原因是内存需要获得自己的控制信号。
要记住的重要一件事是计算所有多路复用器输入,然后选择正确的输出。因此,对于不涉及从内存读取的指令,即使 MemToReg 控制信号告诉多路复用器忽略来自内存的值,ALU 结果仍会传递到内存。这意味着,如果没有 MemRead,内存可能会认为它正在获取一个无效的地址,这可能会导致一些问题。例如,(不是真正的地址)“地址”可能越界或字不对齐,这可能会触发硬件异常。
这是 Patterson 和 Hennessy 所著的Computer Organization and Design MIPS Edition一书中的图表——如果您阅读其中的标题,它可能有助于回答您的问题:
但是......为什么 MemRead 和 MemToReg 需要分开,而不仅仅是一个被拆分并发送到两个地方的值?那个,我不确定。
一个可能的原因可能是他们正在区分可以获得“无关”值的控制信号。在 MemToReg 可以获取“无关”值的情况下,MemRead 可能仍需要获取 0,这样它就不会由于上述原因导致任何错误。
推荐阅读
- flutter - 如何用颤振执行开关按钮?
- tensorflow - 使用 TensorFlow Keras 预处理加载图像时像素值发生变化
- ios - 在ios14中,文本字段borderstyle不能正常工作
- javascript - 三元 onPress 按钮改变颜色 React Native
- c++ - c ++ 17插入std :: map而不复制对象
- rabbitmq - 无法启动 RabbitMQ:未定义函数 rabbitmqctl_escript:main/1
- java - Kafka可以用作分布式工作队列吗
- vb.net - 在 My.Settings 中将特定值重置为默认值
- java - 将对象列表转换为 json 数组以休息模板
- python - 从维基百科页面解析 OpenURL 数据