Mips 在流水线处理器设计中,为什么寄存器文件读/写是在半个周期内执行的?

Mips 在流水线处理器设计中,为什么寄存器文件读/写是在半个周期内执行的?,mips,cpu-architecture,cpu-registers,Mips,Cpu Architecture,Cpu Registers,我正在读David Money Harris和Sarah L.Harris合著的《数字设计与计算机体系结构(第二版)》一书中关于流水线MIPS处理器设计的内容 在第7.5.3节“危险”中(第415页): 寄存器文件可以在同一周期内读取和写入。写入发生在周期的前半部分,读取发生在周期的后半部分,因此寄存器可以在同一周期内写入和读取,而不会产生危险 我的问题是:为什么不能同时读取和写入寄存器文件? 事实上,我的问题很类似于,但答案并没有让我完全明白。由于缺乏声誉,我不允许在这里发表评论,所以我开始问

我正在读David Money Harris和Sarah L.Harris合著的《数字设计与计算机体系结构(第二版)》一书中关于流水线MIPS处理器设计的内容

在第7.5.3节“危险”中(第415页):

寄存器文件可以在同一周期内读取和写入。写入发生在周期的前半部分,读取发生在周期的后半部分,因此寄存器可以在同一周期内写入和读取,而不会产生危险

我的问题是:为什么不能同时读取和写入寄存器文件?

事实上,我的问题很类似于,但答案并没有让我完全明白。由于缺乏声誉,我不允许在这里发表评论,所以我开始问这个问题

如图所示,对于具有2个读取端口和1个写入端口的SRAM寄存器文件,同时读取和写入同一地址似乎是完全合法的。尽管写入操作会导致存储在交叉耦合反相器中的位在一段时间内不稳定,但随着流水线处理器的时钟周期足够长,这些位将变得稳定。因此,完全组合的读取操作可以获得正确的数据。那为什么不同时读写呢

我的第二个问题是,如果我们必须使用书中建议的寄存器文件,在前半个周期中读取,在后半个周期中写入,那么如何将该寄存器文件实现为电路?

我的简单解决方案是重新定义寄存器文件的
write\u enable
read\u enable
信号。让
write\u enable=write\u enable&clock
read\u enable=read\u enable&clock
。但是这本书似乎建议在失败的边缘写,参见HDL示例7.6寄存器文件代码注释(第435页):

对于流水线处理器,在clk的下降沿写入第三个端口

我假设一个时钟周期在上半部分从1开始,然后在下半部分下降到0。因此,我觉得在下降沿写作实际上导致在时钟周期的后半段写作,而不是上半段。更重要的是,它并不能确保在周期的后半段阅读。它是如何工作的


提前感谢。

根据您链接的答案,只需两个端口即可满足2读1写要求—一个是双向端口,一个是读端口,减少了电路并带来其他好处。你的想法是简单地使用3个端口,是的,这应该可以工作,当然没有这些好处。这听起来更像是一个电路设计问题,可能会得到更好的答案,特别是关于交叉耦合逆变器不稳定性的缺点等等。可能是一个非常昂贵的功率峰值,IDK。Re:第2部分:你确定下降沿是时钟周期的后半部分吗?如果整个管道设计为在下降沿上的级之间锁存数据,那么开始写入就是时钟的前半部分。(我没有这本书,所以IDK,如果这是解释的话)。根据您链接的答案,2读1写的要求只需两个端口即可实现——一个是双向端口,一个是读端口,减少了电路和其他好处。你的想法是简单地使用3个端口,是的,这应该可以工作,当然没有这些好处。这听起来更像是一个电路设计问题,可能会得到更好的答案,特别是关于交叉耦合逆变器不稳定性的缺点等等。可能是一个非常昂贵的功率峰值,IDK。Re:第2部分:你确定下降沿是时钟周期的后半部分吗?如果整个管道设计为在下降沿上的级之间锁存数据,那么开始写入就是时钟的前半部分。(如果这是解释的话,我没有这本书)。