同时读取和写入寄存器

Simultaneous reading and writing to registers

我打算在 FPGA 上用 VHDL 设计一个类似 MIPS 的 CPU。 CPU 将有一个经典的五级管道,没有转发和危险预防。在计算机体系结构课程中,我了解到第一个 MIPS-CPUs 用于在时钟上升沿从寄存器文件读取并在时钟下降沿写入。我正在使用的 FPGA 不支持同时使用时钟上升沿和时钟下降沿(关于读取和写入寄存器),所以我不能完全像原来的 MIPS 那样,必须在时钟上升沿完成所有操作.

所以,这是我遇到问题的部分。该指令在写回阶段写回寄存器。回写阶段将数据直接发送到解码阶段。解码阶段的另一条指令想要读取回写阶段想要写入的同一寄存器。

在这种情况下会发生什么?解码阶段是采用指令的新值还是寄存器文件中的旧值?

问题是你对"register"这个词的理解是什么。或者更具体地说,您想如何将寄存器组映射到 FPGA。

最简单但效率不高的方法是根据寄存器大小将每个MIPS寄存器映射到几个触发器。您只能在时钟沿(例如下降沿)更新这些触发器。之后您可以随时读取新内容也称为异步读取。该解决方案效率不高,因为从寄存器组到 select 一个 MIPS 寄存器的多路复用器需要大量逻辑资源。

如果您有一个 FPGA,其中 LUT 可以用作分布式存储器,那么几乎所有用于多路复用器的逻辑资源都可以节省下来。分布式内存通常也提供异步读取(当然还有同步写入)。请阅读综合工具的供应商文档,了解如何描述此类内存进行综合。

最后但同样重要的是,您可以将完整的寄存器组映射到片上块存储器。这些通常只提供同步读取,即读取在时钟边沿开始。 (当然,他们也只提供同步写入)。但是,这些通常是双端口 RAM。因此,您可以在一个端口的下降沿写入,并在另一个端口的上升沿读取。请阅读有关写入时序的 FPGA 文档。例如,在某些 Altera FPGA 上,写入被延迟到时钟的下一个相对边沿(此处为上升沿)。

适合经典五级设计解码级的寄存器文件由一个三端口 RAM(或两个双端口 RAM)和两个多路复用器和比较器组成。比较器和多路复用器需要绕过来自 write-back 阶段的数据。这是必需的,因为写入数据将在下一个周期写入三端口 RAM。因为来自 write-back 阶段的信号是同步的,所以这不是问题。