VHDL MIPS 5级管道错误

VHDL MIPS 5级管道错误,mips,vhdl,Mips,Vhdl,这方面的代码太长,无法发布,因此我将只描述它。我已经创建了一个5级mips管道,几乎可以正常工作。问题在于,每个到达指令解码阶段的lw指令都会覆盖执行阶段的控制信号值。这不仅会导致PC跳过can指令,即从300->308。我只是需要一些关于在哪里寻找bug的想法,因为这是一个类分配。如果我们取出所有LW指令,CPU工作正常 例如: 前阶段的加法器将低于$4$1$2,应该是1 一旦LW进入ID阶段,ALUsrc被断言,ALOUP从减法变为加法 这将强制EX阶段中的加法器添加$4$1$2,导致5存储

这方面的代码太长,无法发布,因此我将只描述它。我已经创建了一个5级mips管道,几乎可以正常工作。问题在于,每个到达指令解码阶段的lw指令都会覆盖执行阶段的控制信号值。这不仅会导致PC跳过can指令,即从300->308。我只是需要一些关于在哪里寻找bug的想法,因为这是一个类分配。如果我们取出所有LW指令,CPU工作正常

例如: 前阶段的加法器将低于$4$1$2,应该是1 一旦LW进入ID阶段,ALUsrc被断言,ALOUP从减法变为加法 这将强制EX阶段中的加法器添加$4$1$2,导致5存储在$4中

MIPS 5阶段管道(注释为显示Write Reg Select和enable)

管道阶段的底线表示寄存器文件写(回)端口地址和写启用,WB表示来自内存的数据

加载字指令 说明: 字从指定地址加载到寄存器中

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

语法:lw$t,偏移量($s)

编码: 1000 11ss ssst tttt iiii

其中,写入寄存器地址($t)输入从数据存储器地址读取,该数据存储器地址由寄存器文件寄存器$s偏移量和立即值i组成,该值得到符号扩展。您的$4高于$t,$1或$2等于$s,而剩余的寄存器文件输出通道听起来要为符号扩展立即数进行子搜索

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

对于三端口寄存器文件,只有在从内存读取并写入寄存器文件之前,尝试使用内存中的新寄存器文件值时才会发生冲突。这可以由编译器调度NOOPs来管理,直到以下指令尝试使用未完成的寄存器文件写入时失效,或者当其输出包含对未完成的寄存器文件写入的引用时,在硬件中暂停IF/ID

IF/ID右侧有三条指令,每条指令都有一个写到寄存器的文件地址和一个写启用。您需要将这两个指令解码寄存器文件地址与这三个地址进行比较,并暂停IF/ID,直到清除这些地址。存储在这三个管道级中的每个管道级中的写入启用用于确定是否应比较这些管道级中的写入寄存器地址

由于ID/EX、EX/MEM和MEM/WB写入寄存器文件地址不在其他任何地方使用,因此用于进行比较的电路可与IF/ID和寄存器文件并置,防止不必要的布局延迟影响最小时钟周期

使用双端口寄存器文件要简单得多,可以推断/ID是否会暂停,直到写入启用从MEM/WB返回,从而有效地将任何内存读取指令转换为3个周期的指令(或者更多,如果数据内存是缓存或速度较慢,则数据内存可能会暂停)。出于性能原因,它或多或少地需要一个三端口寄存器文件。当IF/ID被暂停时(对于内存->regfile),有一个隐含的多路复用器从MEM/WB阶段为两个寄存器文件端口控件(write enable,write address)中的至少一个提供源代码


数据内存访问会暂停MEM/WB,就像指令内存访问也会暂停IF/ID一样。暂停的IF/ID不会对ID/EX的寄存器文件发出写启用,暂停的MEM/WB也不会。根据您的描述,很难给出任何有用的建议。您是否已将问题从功能模拟隔离到VHDL的某一部分?如果是这样的话,如果时间不长,我想如果你能贴出来,你会得到更好的答案。人们将更好地为您提供解码和PC增量问题方面的指导。