2011-12-08 90 views
0

这段代码太长,以至于不能直接描述它。我创建了一个几乎可以工作的5阶段mips管道。值得注意的是,到达指令解码阶段的EVERY指令会覆盖执行阶段的控制信号值。不仅如此,它会导致PC跳过Can指令,即从300 - > 308。我只是需要一些关于在哪里寻找错误的想法,因为这是一个类的任务。如果我们拿出所有的LW指令,CPU工作正常。VHDL MIPS 5阶段流水线Bug

实施例: 在EX级中的加法器将要子$ 4 $ 1 $ 2,其应为1 一旦LW进入ID阶段ALUsrc被断言AND ALUOP从减法改变为添加 这迫使在EX加法器阶段添加$ 4 $ 1 $ 2导致5被存储在$ 4

+1

从您的描述中很难给出任何有用的建议。你是否将问题从功能模拟中分离出来了一部分VHDL?如果是这样,如果时间不长,我怀疑你会得到更好的答案,如果你可以发布。然后,人们将能够更好地为您提供有关解码和PC增量问题的指示。 – trican

回答

1

http://en.wikipedia.org/wiki/File:MIPS_Architecture_%28Pipelined%29.svg

enter image description here 的MIPS 5级流水线(注释以示出写入寄存器选择并启用)

通过流水线阶段的底线代表寄存器文件写入(后退)端口地址和写入启用,WB是来自存储器的数据。

http://www.mrc.uidaho.edu/mrc/people/jff/digital/MIPSir.html

负载字指令 描述: 一个字被加载到从指定的地址的寄存器。

操作:$ t = MEM [$ s + offset]; advance_pc(4);

语法:LW $吨,偏移量($ S)

编码: 1000 11SS SSST TTTT IIII IIII IIII IIII

当写寄存器地址($ t)的输入是从数据存储器地址读出由寄存器文件寄存器$ s的偏移量与得到符号扩展的直接值i组成。您的$ 4是$ t以上,$ 1或$ 2是$ s,而剩余的寄存器文件输出通道声音将被忽略以便立即延长符号。

从您的描述中,您听起来好像没有使用一个端口为只写端口的三端口寄存器文件。

对于三端口寄存器文件,唯一一次遇到冲突的情况是当您从内存中读取并写入寄存器文件之前尝试使用内存中的新寄存器值时。这可以通过编程调度NOOP来管理,直到下一条指令尝试使用它时退出未完成的寄存器文件写入,或者当输出中的IF/ID包含对未完成的寄存器写入操作的引用时停止。

有三条指令可以在IF/ID的右侧飞行,每条指令都有写入寄存器文件地址和写入使能。您需要将两个指令解码寄存器文件地址与这三个指令解码寄存器的地址进行比较,然后暂停IF/ID,直到清除为止。存储在这三个流水线级的每一个中的写使能被用来确定是否应该比较那些流水线级中的写寄存器地址。由于ID/EX,EX/MEM和MEM/WB写入寄存器文件地址在其他任何地方都没有使用,所以比较电路可以与IF/ID和寄存器文件并置,防止不必要的布局延迟影响最小时钟周期。

使用双端口寄存器文件要简单得多,并且推迟IF/ID停顿,直到写入使能从MEM/WB返回为止,从而将任何存储器读取指令有效地转换为3个周期指令(或更多,如果数据存储器缓存或缓慢)。由于性能原因,它使得三个端口的寄存器文件或多或少是必需的。当IF/ID停顿时(对于内存 - > regfile),有一个隐含的多路复用器可以从MEM/WB阶段获取两个寄存器文件端口控制(写入使能,写入地址)中的至少一个。

数据存储器访问可能会使MEM/WB失速,就像指令存储器访问也会使IF/ID停止一样。暂停的IF/ID不会为寄存器文件发出写入启用ID/EX,也不会发生停滞的MEM/WB。

相关问题