【发布时间】:2019-07-07 18:17:10
【问题描述】:
我正在使用 Quartus II 和 Verilog 创建我自己的基于 MIPS32 的处理器。一切正常,直到我的寄存器突然停止工作(我不记得对代码进行了任何修改)。我可能犯了一些错误,但我似乎找不到它。
我已经尝试使用旧版本的代码(100% 正常工作),但错误仍然存在,即使我正在测试与系统其余部分隔离的寄存器。我也尝试过删除 Quartus 的临时文件并重新编译,但没有成功。
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, //Read 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 reg [31:0] Data_1, //Data that will outputted by the Reg selected by Reg_1
output reg [31:0] Data_2, //Data that will outputted by the Reg selected by Reg_2
output reg [31:0] Data_3 //Data that will outputted by the Reg selected by Reg_WR
);
reg [31:0] DataReg[63:0]; //64x 32bit Register
assign Debug2 = DataReg[2]; //Hardwired Reg2 (for testing)
assign Debug3 = DataReg[3]; //Hardwired Reg3 (for testing)
always @ (posedge Fast_Clock) //Reads from Registers at posedge Read Clock
begin
Data_1 <= DataReg[Reg_1];
Data_2 <= DataReg[Reg_2];
Data_3 <= DataReg[Reg_WR];
end
always @ (negedge Slow_Clock) //Writes on Registers at negedge Write Clock
begin
if (Reset)
begin
DataReg[0] <= 32'b00000000_00000000_00000000_00000000; //Forces Reg0 to be 0 when Reset is activated
end
else if (Reg_Write && (Reg_WR != 0)) //If you are writing to some register and this register isn't Reg0...
begin
DataReg[Reg_WR] <= Write_Data; //...write to the register selected by Reg_WR
end
end
endmodule
我希望最终结果是寄存器 2 上的数字 3 和寄存器 3 上的数字 4,但是如您所见,寄存器 2 以数字 4 结尾,而寄存器 3 以数字 0 结尾。
【问题讨论】:
-
您在 sys_clock 的下降沿是否存在 write_data 和 reg_wr 之间的竞争?你的波形上没有“slow_clock”。是 sys_clock 吗?为什么要否认?
-
对不起,我在测试期间更改了名称。 Sys_Clock = 慢时钟。我确实设法解决了一个竞争条件(我在下面发布了它)。指令加载在 posedge 上,写入操作在 negedge 上执行,这就是它在 negedge 上写入的原因:)
标签: verilog fpga quartus intel-fpga