mips - 在流水线处理器设计中,为什么寄存器文件读/写在半个周期内执行?
问题描述
我正在阅读 David Money Harris 和 Sarah L. Harris 所著的“数字设计和计算机体系结构(第二版)”一书中有关流水线 MIPS 处理器设计的内容。
在第 7.5.3 节“危险”中它说(第 415 页):
寄存器文件可以在同一个周期内进行读写。写入发生在周期的前半部分,读取发生在周期的后半部分,因此可以在同一个周期中写入和回读寄存器,而不会引入危险。
我的问题是:为什么不能同时读取和写入寄存器文件?
实际上,我的问题与这个 stackexchange one非常相似,但那里的答案并没有让我完全清楚。由于缺乏声誉,我也不允许在那里发表评论,所以我开始这个问题。
我认为对于具有 2 个读取端口和 1 个写入端口的 SRAM 寄存器文件,如wikipedia所示,同时读取和写入相同的地址似乎是完全合法的。虽然写操作会导致存储在交叉耦合反相器中的位在一段时间内不稳定,但只要流水线处理器的时钟周期足够长,位就会稳定下来。因此,完全组合的读操作可以获得正确的数据。那为什么不同时读写呢?
我的第二个问题是,如果我们必须使用书中建议的这样一个寄存器文件,它在前半周期读取,在后半周期写入,如何将这个寄存器文件实现为电路?
我天真的解决方案是重新定义寄存器文件write_enable
并read_enable
发出信号。让write_enable = write_enable & clock
和read_enable = read_enable & ~clock
。但是这本书似乎建议写在失败的边缘,请参阅 HDL 示例 7.6 寄存器文件代码注释(第 435 页):
对于流水线处理器,在 clk 的下降沿写入第三个端口
我会假设一个时钟周期在前半部分从 1 开始,然后在后半部分下降到 0。因此,我觉得在下降沿写入实际上会导致在时钟周期的后半部分写入,而不是前半部分。更重要的是,它对确保在周期后半段的阅读没有任何作用。它如何工作?
提前致谢。
解决方案
推荐阅读
- javascript - 如何在不丢失任何数据的情况下重新加载页面
- c# - C# 拖放 Gif 到 MS Edge
- kotlin - 未解决的参考:VS 代码中的 GlobalScope.launch
- android - Android - LinearView - 视图的动态实例化
- python - Twilio Conversations - 关闭的对话是否计入每个身份限制的频道
- html - 用 CSS 翻转 3 个硬币图像
- angular - page.route中的调用函数
- android - 测试 MANAGE_EXTERNAL_STORAGE 权限
- javascript - JavaScript 中的响应式菜单
- algorithm - 如何在暗室中制作高 ISO 效果?