Arm 在管道中以相同的时钟周期读取和写入寄存器组。在这种情况下会有数据危险吗?

Arm 在管道中以相同的时钟周期读取和写入寄存器组。在这种情况下会有数据危险吗?,arm,pipeline,cpu-architecture,cpu-registers,cpu-hazard,Arm,Pipeline,Cpu Architecture,Cpu Registers,Cpu Hazard,我正在通过大卫A.帕特森和约翰L.轩尼诗的《计算机组织与设计,硬件-软件接口ARM版》一书学习计算机体系结构。当我阅读第4章(处理器)时,我遇到了一些对我来说似乎矛盾或误导的信息,所以我希望有人能证实这一点,或者,如果我错了,解释一下我遗漏了什么。 在本章开头,作者解释了数据路径的一些要素,特别是关于存储器和寄存器库的读写,他做了如下陈述: “图4.3组合逻辑、状态元素和时钟密切相关。在同步数字系统中,时钟确定具有状态的元素何时将值写入内部存储器。状态元素的任何输入必须达到稳定值(也就是说,在活

我正在通过大卫A.帕特森和约翰L.轩尼诗的《计算机组织与设计,硬件-软件接口ARM版》一书学习计算机体系结构。当我阅读第4章(处理器)时,我遇到了一些对我来说似乎矛盾或误导的信息,所以我希望有人能证实这一点,或者,如果我错了,解释一下我遗漏了什么。 在本章开头,作者解释了数据路径的一些要素,特别是关于存储器和寄存器库的读写,他做了如下陈述:

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

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

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

他说:"最后一项潜在危险可透过设计登记档案解决 硬件:在同一时钟中读写寄存器时会发生什么 周期?我们假设写入在时钟周期的前半部分,读取在前半部分 是在后半段,所以读的是写的,就像很多人的情况一样 对于寄存器文件的实现,我们在这种情况下没有数据危险(第316页)

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


为所有英文错误道歉,并致以最诚挚的问候!

在ARM上,所有内存访问指令都发送到一条管道。

换句话说,两条内存访问指令一开始并没有双重问题。别担心。

当你问他们时,作者说了什么?半个时钟的事情是误导和不正确的,他们确实需要解决这个问题。问题是关于registers@user253751寄存器和管道。是的,但您提到了内存访问指令。