我正在通过 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)。当我们尝试读取寄存器时,我们将获取在较早的时钟周期中写入的内容,而不是更新的内容,因此,对我来说,在这种情况下会有数据危险。谁能为我澄清这些问题?
对不起,任何英语错误和最好的问候!