使用Verilog在Quartus II上寄存器的奇怪行为

时间:2019-07-07 18:17:10

标签: verilog electronics quartus

我正在使用Quartus II和Verilog基于MIPS32创建自己的处理器。一切正常,直到突然我的寄存器停止工作(我不记得对代码进行任何修改)。我可能犯了一些错误,但似乎找不到。

我已经尝试使用旧版本的代码(100%有效),但是即使在测试与系统其余部分隔离的寄存器时,错误仍然存​​在。我还尝试删除Quartus的临时文件并重新编译,但均未成功。

sudo apt autoremove

Waveform 1

Waveform 2

我希望最终结果是寄存器2上的数字3和寄存器3上的数字4,但是,如您所见,寄存器2以数字4结尾,而寄存器3以数字0结尾。

1 个答案:

答案 0 :(得分:0)

我知道了。

在下一个时钟写入和加载新值时出现不一致。

我通过创建两个辅助来修复它。直到写入和更新值之前一直保存Write_Data和Reg_WR的变量。我使用了更快的时钟来保持这些辅助。变量已更新。

这是我找到的解决方案:

module RegFile
(
    //output [31:0] Debug2,       //Outputs Reg 2
    output [31:0] Debug3,       //Outputs Reg 3
    input Reset,                //Makes sure Reg 0 is always 0
    input Slow_Clock,             //Write Clock
    input Fast_Clock,
     input Reg_Write,            //Write to Reg Flag
    input [31:0] Write_Data,    //Data that will be written in the Reg selected by Reg_WR
    input [5:0] Reg_1,          //First Register Selection (Read)
    input [5:0] Reg_2,          //Second Register Selection (Read)
    input [5:0] Reg_WR,         //Third Register Selection (Read or Write)
    output [31:0] Data_1,         //Data that will outputted by the Reg selected by Reg_1
    output [31:0] Data_2,       //Data that will outputted by the Reg selected by Reg_2
    output [31:0] Data_3        //Data that will outputted by the Reg selected by Reg_WR
);

reg [31:0] RegBank[63:0];

reg [31:0] Aux_WD;
reg [5:0] Aux_Reg;

assign Data_1 = RegBank[Reg_1];
assign Data_2 = RegBank[Reg_2];
assign Data_3 = RegBank[Reg_WR];

//assign Debug2 = RegBank[2];
assign Debug3 = RegBank[3];

always @ (negedge Fast_Clock)
begin
    Aux_WD <= Write_Data;
    Aux_Reg <= Reg_WR;
end

always @ (negedge Slow_Clock)
begin
    if (Reset)
    begin
        RegBank[0] <= {32{1'b0}};
    end
    else if (Reg_Write && (Aux_Reg != 6'b000000))
    begin
        RegBank[Aux_Reg] <= Aux_WD;
    end
end

endmodule