mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Fixed regression error of watchdog timeout when PCM is optimized out of the IFU
This commit is contained in:
parent
92d4d7626c
commit
409ecc53bd
@ -114,10 +114,7 @@ module ifu import cvw::*; #(parameter cvw_t P) (
|
|||||||
logic [31:0] IROMInstrF; // Instruction from the IROM
|
logic [31:0] IROMInstrF; // Instruction from the IROM
|
||||||
logic [31:0] ICacheInstrF; // Instruction from the I$
|
logic [31:0] ICacheInstrF; // Instruction from the I$
|
||||||
logic [31:0] InstrRawF; // Instruction from the IROM, I$, or bus
|
logic [31:0] InstrRawF; // Instruction from the IROM, I$, or bus
|
||||||
logic CompressedF; // The fetched instruction is compressed
|
logic CompressedF, CompressedE; // The fetched instruction is compressed
|
||||||
logic CompressedD; // The decoded instruction is compressed
|
|
||||||
logic CompressedE; // The execution instruction is compressed
|
|
||||||
logic CompressedM; // The execution instruction is compressed
|
|
||||||
logic [31:0] PostSpillInstrRawF; // Fetch instruction after merge two halves of spill
|
logic [31:0] PostSpillInstrRawF; // Fetch instruction after merge two halves of spill
|
||||||
logic [31:0] InstrRawD; // Non-decompressed instruction in the Decode stage
|
logic [31:0] InstrRawD; // Non-decompressed instruction in the Decode stage
|
||||||
logic IllegalIEUInstrD; // IEU Instruction (regular or compressed) is not good
|
logic IllegalIEUInstrD; // IEU Instruction (regular or compressed) is not good
|
||||||
@ -405,15 +402,24 @@ module ifu import cvw::*; #(parameter cvw_t P) (
|
|||||||
flopenr #(P.XLEN) PCMReg(clk, reset, ~StallM, PCE, PCM);
|
flopenr #(P.XLEN) PCMReg(clk, reset, ~StallM, PCE, PCM);
|
||||||
else assign PCM = 0;
|
else assign PCM = 0;
|
||||||
|
|
||||||
flopenrc #(1) CompressedDReg(clk, reset, FlushD, ~StallD, CompressedF, CompressedD);
|
if (P.COMPRESSED_SUPPORTED) begin
|
||||||
flopenrc #(1) CompressedEReg(clk, reset, FlushE, ~StallE, CompressedD, CompressedE);
|
logic CompressedD; // instruction is compressed
|
||||||
assign PCLinkE = PCE + (CompressedE ? 'd2 : 'd4); // 'd4 means 4 but stops Design Compiler complaining about signed to unsigned conversion
|
flopenrc #(1) CompressedDReg(clk, reset, FlushD, ~StallD, CompressedF, CompressedD);
|
||||||
|
flopenrc #(1) CompressedEReg(clk, reset, FlushE, ~StallE, CompressedD, CompressedE);
|
||||||
|
assign PCLinkE = PCE + (CompressedE ? 'd2 : 'd4); // 'd4 means 4 but stops Design Compiler complaining about signed to unsigned conversion
|
||||||
|
end else begin
|
||||||
|
assign CompressedE = 0;
|
||||||
|
assign PCLinkE = PCE + 'd4;
|
||||||
|
end
|
||||||
|
|
||||||
// pipeline original compressed instruction in case it is needed for MTVAL on an illegal instruction exception
|
// pipeline original compressed instruction in case it is needed for MTVAL on an illegal instruction exception
|
||||||
if (P.ZICSR_SUPPORTED) begin
|
if (P.ZICSR_SUPPORTED & P.COMPRESSED_SUPPORTED) begin
|
||||||
|
logic CompressedM; // instruction is compressed
|
||||||
flopenrc #(16) InstrRawEReg(clk, reset, FlushE, ~StallE, InstrRawD[15:0], InstrRawE);
|
flopenrc #(16) InstrRawEReg(clk, reset, FlushE, ~StallE, InstrRawD[15:0], InstrRawE);
|
||||||
flopenrc #(16) InstrRawMReg(clk, reset, FlushM, ~StallM, InstrRawE, InstrRawM);
|
flopenrc #(16) InstrRawMReg(clk, reset, FlushM, ~StallM, InstrRawE, InstrRawM);
|
||||||
flopenrc #(1) CompressedMReg(clk, reset, FlushM, ~StallM, CompressedE, CompressedM);
|
flopenrc #(1) CompressedMReg(clk, reset, FlushM, ~StallM, CompressedE, CompressedM);
|
||||||
mux2 #(32) InstrOrigMux(InstrM, {16'b0, InstrRawM}, CompressedM, InstrOrigM);
|
mux2 #(32) InstrOrigMux(InstrM, {16'b0, InstrRawM}, CompressedM, InstrOrigM);
|
||||||
end else assign InstrOrigM = 0;
|
end else
|
||||||
|
assign InstrOrigM = InstrM;
|
||||||
|
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -30,11 +30,13 @@ module watchdog #(parameter XLEN, WatchDogTimerThreshold)
|
|||||||
);
|
);
|
||||||
|
|
||||||
// check for hang up.
|
// check for hang up.
|
||||||
logic [XLEN-1:0] PCW;
|
logic [XLEN-1:0] PCM, PCW, OldPCW;
|
||||||
flopenr #(XLEN) PCWReg(clk, reset, ~dut.core.ieu.dp.StallW, dut.core.ifu.PCM, PCW);
|
|
||||||
logic [XLEN-1:0] OldPCW;
|
|
||||||
integer WatchDogTimerCount;
|
integer WatchDogTimerCount;
|
||||||
logic WatchDogTimeOut;
|
logic WatchDogTimeOut;
|
||||||
|
|
||||||
|
flopenr #(XLEN) PCMReg(clk, reset, ~dut.core.ifu.StallM, dut.core.ifu.PCE, PCM); // duplicate PCM register because it is not in ifu for all configurations
|
||||||
|
flopenr #(XLEN) PCWReg(clk, reset, ~dut.core.ieu.dp.StallW, PCM, PCW);
|
||||||
|
|
||||||
always_ff @(posedge clk) begin
|
always_ff @(posedge clk) begin
|
||||||
OldPCW <= PCW;
|
OldPCW <= PCW;
|
||||||
if(OldPCW == PCW) WatchDogTimerCount = WatchDogTimerCount + 1'b1;
|
if(OldPCW == PCW) WatchDogTimerCount = WatchDogTimerCount + 1'b1;
|
||||||
|
Loading…
Reference in New Issue
Block a user