我正在使用Quartus II和Verilog基于MIPS32创建自己的处理器。一切正常,直到突然我的寄存器停止工作(我不记得对代码进行任何修改)。我可能犯了一些错误,但似乎找不到。
我已经尝试使用旧版本的代码(100%有效),但是即使在测试与系统其余部分隔离的寄存器时,错误仍然存在。我还尝试删除Quartus的临时文件并重新编译,但均未成功。
sudo apt autoremove
我希望最终结果是寄存器2上的数字3和寄存器3上的数字4,但是,如您所见,寄存器2以数字4结尾,而寄存器3以数字0结尾。
答案 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