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

在流水线中以相同的时钟周期读取和写入寄存器组这种情况下会不会存在数据风险?

如何解决在流水线中以相同的时钟周期读取和写入寄存器组这种情况下会不会存在数据风险?

我正在通过 David A. Patterson 和 John L. Hennessy 合着的“Computer Organization and Design,The Hardware Software Interface ARM Edition”一书学习计算机体系结构,在阅读第 4 章(处理器)时,我来到了一些对我来说似乎矛盾或误导的信息,所以我希望有人可以证实这一点,或者,如果我错了,请解释我遗漏了什么。 在本章的开头,作者解释了数据通路的一些元素,特别是关于存储器和寄存器组的读写,他做了如下陈述:

"图 4.3 组合逻辑、状态元素和时钟密切相关。在同步数字系统中,时钟决定具有状态的元素何时将值写入内部存储器。状态元素的任何输入必须达到一个稳定的值(即,已经达到一个值,直到时钟沿之后它们才会改变)在活动时钟边沿导致状态更新之前。本章中的所有状态元素,包括内存,都是假定的正边沿触发;也就是说,它们在时钟上升沿发生变化。”(第 261 页)

"图 4.7 实现 R 格式 ALU 操作所需的两个元素是 注册文件和 ALU。 [...] 请记住,写入是边沿触发的,因此所有写入输入(即 写,寄存器编号和写控制信号)必须在时钟边沿有效。 自写 到寄存器文件是边沿触发的,我们的设计可以在一个时钟内合法地读写同一个寄存器 周期:读取将获得在较早时钟周期写入的值,而写入的值将可用于 在随后的时钟周期中读取。 [...]"(第 265 页)

嗯,这些陈述对我来说非常一致,并且与我在毕业时学到的一致。然而,后来在处理管道危险时,他做出了一个假设,我认为这与为系统选择的时钟方法相矛盾:

“最后一个潜在的危害可以通过寄存器文件的设计来解决 硬件:在同一个时钟下读取和写入寄存器时会发生什么 循环? 我们假设写在时钟周期的前半部分,而读 是在后半部分,因此读取提供了写入的内容。就像很多人的情况一样 寄存器文件的实现,在这种情况下我们没有数据危险。”(第 316 页)。

上面的语句告诉我们,如果一条指令试图在同一寄存器被更早的指令更新的同一时钟周期内读取寄存器内容,则不会有数据危险,这意味着读取的内容是更新的内容. 正如我们在本章开头所说的那样,这与寄存器文件的设计相矛盾(见图 4.7)。当我们尝试读取寄存器时,我们将获取在较早时钟周期写入的内容,而不是更新的内容,因此,对我而言,在这种情况下会存在数据风险。 谁能帮我澄清这些问题?

对于任何英语错误,我们深表歉意,并致以最诚挚的问候!

解决方法

在 ARM 上,所有内存访问指令都发布到一条流水线上。
换句话说,两个内存访问指令一开始就不是双重问题。别担心。

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