我正在创建带有危险单元的流水线处理器。在仿真期间,当“冲洗” = 1时,程序波形将停止。我相信我的代码中存在某种无限循环,并且此危险单元不返回任何值。在图像中,我附加了您可以在值列中看到Flush变为1。但是在模块中,它的调用仍然为零,因此它很可能在此时循环。
`timescale 1ns / 1ps
module Hazard_Unit(input BranchD, MtoRFSelE, MtoRFSelM, RFWEE, RFWEM, RFWEW, RST, input [4:0] RsD, RtD, RsE, RtE, RFAE, RFAM, RFAW,
output reg Stall, ForwardAD, ForwardBD, Flush, output reg [1:0] ForwardAE, ForwardBE);
reg LWStall, BRStall;
always @(*) begin
if (RST) begin
ForwardAD = 1'b0;
ForwardBD = 1'b0;
ForwardAE = 2'b00;
ForwardBE = 2'b00;
LWStall = 1'b0;
BRStall = 1'b0;
Stall = 1'b0;
Flush = 1'b0;
end
else begin
if ((RsE != 0) && RFWEM && (RsE == RFAM)) ForwardAE = 2'b10;
else if ((RsE != 0) && RFWEW && (RsE == RFAW)) ForwardAE = 2'b01;
else ForwardAE = 2'b00;
if ((RtE != 0) && RFWEM && (RtE == RFAM)) ForwardBE = 2'b10;
else if ((RtE != 0) && RFWEW && (RtE == RFAW)) ForwardBE = 2'b01;
else ForwardBE = 2'b00;
if (MtoRFSelE && ((RtE == RsD) || (RtE == RtD))) LWStall = 1'b1;
else LWStall = 1'b0;
if ((RsD != 0) && (RsD == RFAM) && RFWEM) ForwardAD = 1'b1;
else ForwardAD = 1'b0;
if ((RtD != 0) && (RtD == RFAM) && RFWEM) ForwardBD = 1'b1;
else ForwardBD = 1'b0;
if ((RsD == RFAE || RtD == RFAE) && BranchD && RFWEE || (RsD == RFAM || RtD == RFAM) && BranchD && MtoRFSelM) BRStall = 1'b1;
else BRStall = 1'b0;
if (LWStall || BRStall) begin
Flush = 1'b1;
Stall = 1'b0;
end
else begin
Flush = 1'b0;
Stall = 1'b1;
end
end
end
endmodule
实际上,您可能有组合循环。
我可以搜索它的位置,但我更愿意为您提供解决这些问题的一般方法。如果发生在我身上,我将使用它(一次在蓝色的月亮中:-)
在语句之间放置#5
。
if ((RsE != 0) && RFWEM && (RsE == RFAM)) ForwardAE = 2'b10;
else if ((RsE != 0) && RFWEW && (RsE == RFAW)) ForwardAE = 2'b01;
else ForwardAE = 2'b00;
#5;
if ((RtE != 0) && RFWEM && (RtE == RFAM)) ForwardBE = 2'b10;
else if ((RtE != 0) && RFWEW && (RtE == RFAW)) ForwardBE = 2'b01;
else ForwardBE = 2'b00;
#5;
...
现在,您的波形很可能会继续运行,并向您显示振荡的位置。修复代码后,不要忘记再次删除#5。
下一点:您的代码通常是错误的。您在该if
语句中产生了许多闩锁。必须在每个ForwardAD, ForwardBD, ForwardAE ...
语句中为每个变量if
分配一个值。或者,您应该在else
之后立即给它们提供默认值:
else begin
ForwardAD = ..;
ForwardBD = ..;
ForwardAE = .;
...
if ((RsE != 0) &....
如果您无法执行此操作,则整个部分可能应该是带有时标的语句:
always @(posedge some_clock) begin