mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Fixed dcache to prevent latches in FPGA synthesized design.
This commit is contained in:
parent
29efd1d222
commit
3ff8d0095d
64
wally-pipelined/src/cache/dcachefsm.sv
vendored
64
wally-pipelined/src/cache/dcachefsm.sv
vendored
@ -136,6 +136,16 @@ module dcachefsm
|
|||||||
if (reset) CurrState <= #1 STATE_READY;
|
if (reset) CurrState <= #1 STATE_READY;
|
||||||
else CurrState <= #1 NextState;
|
else CurrState <= #1 NextState;
|
||||||
|
|
||||||
|
/* -----\/----- EXCLUDED -----\/-----
|
||||||
|
flopenl #(.TYPE(statetype))
|
||||||
|
StateReg(.clk,
|
||||||
|
.load(reset),
|
||||||
|
.en(1'b1),
|
||||||
|
.d(NextState),
|
||||||
|
.q(CurrState),
|
||||||
|
.val(STATE_READY));
|
||||||
|
-----/\----- EXCLUDED -----/\----- */
|
||||||
|
|
||||||
|
|
||||||
// next state logic and some state ouputs.
|
// next state logic and some state ouputs.
|
||||||
always_comb begin
|
always_comb begin
|
||||||
@ -158,9 +168,23 @@ module dcachefsm
|
|||||||
DCacheMiss = 1'b0;
|
DCacheMiss = 1'b0;
|
||||||
LRUWriteEn = 1'b0;
|
LRUWriteEn = 1'b0;
|
||||||
MemAfterIWalkDone = 1'b0;
|
MemAfterIWalkDone = 1'b0;
|
||||||
|
NextState = STATE_READY;
|
||||||
|
|
||||||
case (CurrState)
|
case (CurrState)
|
||||||
STATE_READY: begin
|
STATE_READY: begin
|
||||||
|
|
||||||
|
CntReset = 1'b0;
|
||||||
|
DCacheStall = 1'b0;
|
||||||
|
AHBRead = 1'b0;
|
||||||
|
AHBWrite = 1'b0;
|
||||||
|
DCacheAccess = 1'b0;
|
||||||
|
DCacheMiss = 1'b0;
|
||||||
|
SelAdrM = 2'b00;
|
||||||
|
SRAMWordWriteEnableM = 1'b0;
|
||||||
|
SetDirty = 1'b0;
|
||||||
|
LRUWriteEn = 1'b0;
|
||||||
|
CommittedM = 1'b0;
|
||||||
|
|
||||||
// TLB Miss
|
// TLB Miss
|
||||||
if((AnyCPUReqM & DTLBMissM) | ITLBMissF) begin
|
if((AnyCPUReqM & DTLBMissM) | ITLBMissF) begin
|
||||||
// the LSU arbiter has not yet selected the PTW.
|
// the LSU arbiter has not yet selected the PTW.
|
||||||
@ -301,6 +325,9 @@ module dcachefsm
|
|||||||
STATE_MISS_READ_WORD_DELAY: begin
|
STATE_MISS_READ_WORD_DELAY: begin
|
||||||
//SelAdrM = 2'b10;
|
//SelAdrM = 2'b10;
|
||||||
CommittedM = 1'b1;
|
CommittedM = 1'b1;
|
||||||
|
SRAMWordWriteEnableM = 1'b0;
|
||||||
|
SetDirty = 1'b0;
|
||||||
|
LRUWriteEn = 1'b0;
|
||||||
if(&MemRWM & AtomicM[1]) begin // amo write
|
if(&MemRWM & AtomicM[1]) begin // amo write
|
||||||
SelAdrM = 2'b10;
|
SelAdrM = 2'b10;
|
||||||
if(StallWtoDCache) begin
|
if(StallWtoDCache) begin
|
||||||
@ -356,6 +383,10 @@ module dcachefsm
|
|||||||
STATE_PTW_READY: begin
|
STATE_PTW_READY: begin
|
||||||
// now all output connect to PTW instead of CPU.
|
// now all output connect to PTW instead of CPU.
|
||||||
CommittedM = 1'b1;
|
CommittedM = 1'b1;
|
||||||
|
SelAdrM = 2'b00;
|
||||||
|
DCacheStall = 1'b0;
|
||||||
|
LRUWriteEn = 1'b0;
|
||||||
|
CntReset = 1'b0;
|
||||||
|
|
||||||
// In this branch we remove stall and go back to ready. There is no request for memory from the
|
// In this branch we remove stall and go back to ready. There is no request for memory from the
|
||||||
// datapath or the walker had a fault.
|
// datapath or the walker had a fault.
|
||||||
@ -489,6 +520,7 @@ module dcachefsm
|
|||||||
|
|
||||||
STATE_CPU_BUSY: begin
|
STATE_CPU_BUSY: begin
|
||||||
CommittedM = 1'b1;
|
CommittedM = 1'b1;
|
||||||
|
SelAdrM = 2'b00;
|
||||||
if(StallWtoDCache) begin
|
if(StallWtoDCache) begin
|
||||||
NextState = STATE_CPU_BUSY;
|
NextState = STATE_CPU_BUSY;
|
||||||
SelAdrM = 2'b10;
|
SelAdrM = 2'b10;
|
||||||
@ -501,6 +533,9 @@ module dcachefsm
|
|||||||
STATE_CPU_BUSY_FINISH_AMO: begin
|
STATE_CPU_BUSY_FINISH_AMO: begin
|
||||||
CommittedM = 1'b1;
|
CommittedM = 1'b1;
|
||||||
SelAdrM = 2'b10;
|
SelAdrM = 2'b10;
|
||||||
|
SRAMWordWriteEnableM = 1'b0;
|
||||||
|
SetDirty = 1'b0;
|
||||||
|
LRUWriteEn = 1'b0;
|
||||||
if(StallWtoDCache) begin
|
if(StallWtoDCache) begin
|
||||||
NextState = STATE_CPU_BUSY_FINISH_AMO;
|
NextState = STATE_CPU_BUSY_FINISH_AMO;
|
||||||
end
|
end
|
||||||
@ -523,7 +558,7 @@ module dcachefsm
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
STATE_UNCACHED_READ : begin
|
STATE_UNCACHED_READ: begin
|
||||||
DCacheStall = 1'b1;
|
DCacheStall = 1'b1;
|
||||||
AHBRead = 1'b1;
|
AHBRead = 1'b1;
|
||||||
CommittedM = 1'b1;
|
CommittedM = 1'b1;
|
||||||
@ -536,6 +571,7 @@ module dcachefsm
|
|||||||
|
|
||||||
STATE_UNCACHED_WRITE_DONE: begin
|
STATE_UNCACHED_WRITE_DONE: begin
|
||||||
CommittedM = 1'b1;
|
CommittedM = 1'b1;
|
||||||
|
SelAdrM = 2'b00;
|
||||||
if(StallWtoDCache) begin
|
if(StallWtoDCache) begin
|
||||||
NextState = STATE_CPU_BUSY;
|
NextState = STATE_CPU_BUSY;
|
||||||
SelAdrM = 2'b10;
|
SelAdrM = 2'b10;
|
||||||
@ -548,6 +584,7 @@ module dcachefsm
|
|||||||
STATE_UNCACHED_READ_DONE: begin
|
STATE_UNCACHED_READ_DONE: begin
|
||||||
CommittedM = 1'b1;
|
CommittedM = 1'b1;
|
||||||
SelUncached = 1'b1;
|
SelUncached = 1'b1;
|
||||||
|
SelAdrM = 2'b00;
|
||||||
if(StallWtoDCache) begin
|
if(StallWtoDCache) begin
|
||||||
NextState = STATE_CPU_BUSY;
|
NextState = STATE_CPU_BUSY;
|
||||||
SelAdrM = 2'b10;
|
SelAdrM = 2'b10;
|
||||||
@ -560,6 +597,21 @@ module dcachefsm
|
|||||||
|
|
||||||
// itlb => instruction page fault states with memory request.
|
// itlb => instruction page fault states with memory request.
|
||||||
STATE_PTW_FAULT_READY: begin
|
STATE_PTW_FAULT_READY: begin
|
||||||
|
DCacheStall = 1'b0;
|
||||||
|
DCacheAccess = 1'b0;
|
||||||
|
DCacheMiss = 1'b0;
|
||||||
|
LRUWriteEn = 1'b0;
|
||||||
|
SelAdrM = 2'b00;
|
||||||
|
MemAfterIWalkDone = 1'b0;
|
||||||
|
SetDirty = 1'b0;
|
||||||
|
LRUWriteEn = 1'b0;
|
||||||
|
CntReset = 1'b0;
|
||||||
|
AHBWrite = 1'b0;
|
||||||
|
AHBRead = 1'b0;
|
||||||
|
CommittedM = 1'b0;
|
||||||
|
NextState = STATE_READY;
|
||||||
|
|
||||||
|
|
||||||
// read hit valid cached
|
// read hit valid cached
|
||||||
if(MemRWM[1] & CacheableM & CacheHit & ~DTLBMissM) begin
|
if(MemRWM[1] & CacheableM & CacheHit & ~DTLBMissM) begin
|
||||||
DCacheStall = 1'b0;
|
DCacheStall = 1'b0;
|
||||||
@ -614,6 +666,7 @@ module dcachefsm
|
|||||||
CntReset = 1'b1;
|
CntReset = 1'b1;
|
||||||
DCacheStall = 1'b1;
|
DCacheStall = 1'b1;
|
||||||
AHBRead = 1'b1;
|
AHBRead = 1'b1;
|
||||||
|
MemAfterIWalkDone = 1'b0;
|
||||||
end
|
end
|
||||||
// fault
|
// fault
|
||||||
else begin
|
else begin
|
||||||
@ -626,11 +679,13 @@ module dcachefsm
|
|||||||
CommittedM = 1'b1;
|
CommittedM = 1'b1;
|
||||||
if(StallWtoDCache) begin
|
if(StallWtoDCache) begin
|
||||||
NextState = STATE_PTW_FAULT_CPU_BUSY;
|
NextState = STATE_PTW_FAULT_CPU_BUSY;
|
||||||
|
MemAfterIWalkDone = 1'b0;
|
||||||
SelAdrM = 2'b10;
|
SelAdrM = 2'b10;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
MemAfterIWalkDone = 1'b1;
|
MemAfterIWalkDone = 1'b1;
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
|
SelAdrM = 2'b00;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -690,10 +745,12 @@ module dcachefsm
|
|||||||
if(StallWtoDCache) begin
|
if(StallWtoDCache) begin
|
||||||
NextState = STATE_PTW_FAULT_CPU_BUSY;
|
NextState = STATE_PTW_FAULT_CPU_BUSY;
|
||||||
SelAdrM = 2'b10;
|
SelAdrM = 2'b10;
|
||||||
|
MemAfterIWalkDone = 1'b0;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
MemAfterIWalkDone = 1'b1;
|
MemAfterIWalkDone = 1'b1;
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
|
SelAdrM = 2'b00;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -711,11 +768,13 @@ module dcachefsm
|
|||||||
CommittedM = 1'b1;
|
CommittedM = 1'b1;
|
||||||
if(StallWtoDCache) begin
|
if(StallWtoDCache) begin
|
||||||
NextState = STATE_PTW_FAULT_CPU_BUSY;
|
NextState = STATE_PTW_FAULT_CPU_BUSY;
|
||||||
|
MemAfterIWalkDone = 1'b0;
|
||||||
SelAdrM = 2'b10;
|
SelAdrM = 2'b10;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
MemAfterIWalkDone = 1'b1;
|
MemAfterIWalkDone = 1'b1;
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
|
SelAdrM = 2'b00;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -760,11 +819,13 @@ module dcachefsm
|
|||||||
CommittedM = 1'b1;
|
CommittedM = 1'b1;
|
||||||
if(StallWtoDCache) begin
|
if(StallWtoDCache) begin
|
||||||
NextState = STATE_PTW_FAULT_CPU_BUSY;
|
NextState = STATE_PTW_FAULT_CPU_BUSY;
|
||||||
|
MemAfterIWalkDone = 1'b0;
|
||||||
SelAdrM = 2'b10;
|
SelAdrM = 2'b10;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
MemAfterIWalkDone = 1'b1;
|
MemAfterIWalkDone = 1'b1;
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
|
SelAdrM = 2'b00;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -782,6 +843,7 @@ module dcachefsm
|
|||||||
end
|
end
|
||||||
|
|
||||||
default: begin
|
default: begin
|
||||||
|
NextState = STATE_READY;
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
end
|
end
|
||||||
|
Loading…
Reference in New Issue
Block a user