mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-10 05:35:20 +00:00
More cachfsm cleanup.
This commit is contained in:
parent
8bcaadda6b
commit
6f4a321d31
54
pipelined/src/cache/cachefsm.sv
vendored
54
pipelined/src/cache/cachefsm.sv
vendored
@ -83,6 +83,10 @@ module cachefsm
|
|||||||
logic AnyCPUReqM;
|
logic AnyCPUReqM;
|
||||||
logic [1:0] PreSelAdr;
|
logic [1:0] PreSelAdr;
|
||||||
logic resetDelay;
|
logic resetDelay;
|
||||||
|
logic DoAMO, DoRead, DoWrite, DoFlush;
|
||||||
|
logic DoAMOHit, DoReadHit, DoWriteHit;
|
||||||
|
logic DoAMOMiss, DoReadMiss, DoWriteMiss;
|
||||||
|
|
||||||
|
|
||||||
typedef enum {STATE_READY,
|
typedef enum {STATE_READY,
|
||||||
|
|
||||||
@ -105,11 +109,22 @@ module cachefsm
|
|||||||
|
|
||||||
(* mark_debug = "true" *) statetype CurrState, NextState;
|
(* mark_debug = "true" *) statetype CurrState, NextState;
|
||||||
|
|
||||||
assign AnyCPUReqM = |RW | (|Atomic);
|
assign DoFlush = FlushCache & ~IgnoreRequest;
|
||||||
|
assign DoAMO = Atomic[1] & (&RW) & ~IgnoreRequest;
|
||||||
|
assign DoAMOHit = DoAMO & CacheHit;
|
||||||
|
assign DoAMOMiss = DoAMOHit & ~CacheHit;
|
||||||
|
assign DoRead = RW[1] & ~IgnoreRequest;
|
||||||
|
assign DoReadHit = DoRead & CacheHit;
|
||||||
|
assign DoReadMiss = DoRead & ~CacheHit;
|
||||||
|
assign DoWrite = RW[0] & ~IgnoreRequest;
|
||||||
|
assign DoWriteHit = DoWrite & CacheHit;
|
||||||
|
assign DoWriteMiss = DoWrite & ~CacheHit;
|
||||||
|
|
||||||
|
//assign AnyCPUReqM = |RW | (|Atomic); **** remove
|
||||||
|
|
||||||
// outputs for the performance counters.
|
// outputs for the performance counters.
|
||||||
assign CacheAccess = AnyCPUReqM & CurrState == STATE_READY;
|
assign CacheAccess = (DoAMO | DoRead | DoWrite) & CurrState == STATE_READY;
|
||||||
assign CacheMiss = CacheAccess & ~CacheHit;
|
assign CacheMiss = CacheAccess & ~CacheHit;
|
||||||
|
|
||||||
// special case on reset. When the fsm first exists reset the
|
// special case on reset. When the fsm first exists reset the
|
||||||
// PCNextF will no longer be pointing to the correct address.
|
// PCNextF will no longer be pointing to the correct address.
|
||||||
@ -125,9 +140,6 @@ module cachefsm
|
|||||||
// *** Ross simplify: factor out next state and output logic
|
// *** Ross simplify: factor out next state and output logic
|
||||||
always_comb begin
|
always_comb begin
|
||||||
PreSelAdr = 2'b00;
|
PreSelAdr = 2'b00;
|
||||||
SRAMWordWriteEnable = 1'b0;
|
|
||||||
SRAMLineWriteEnable = 1'b0;
|
|
||||||
SelEvict = 1'b0;
|
|
||||||
LRUWriteEn = 1'b0;
|
LRUWriteEn = 1'b0;
|
||||||
SelFlush = 1'b0;
|
SelFlush = 1'b0;
|
||||||
FlushAdrCntEn = 1'b0;
|
FlushAdrCntEn = 1'b0;
|
||||||
@ -144,7 +156,6 @@ module cachefsm
|
|||||||
STATE_READY: begin
|
STATE_READY: begin
|
||||||
|
|
||||||
PreSelAdr = 2'b00;
|
PreSelAdr = 2'b00;
|
||||||
SRAMWordWriteEnable = 1'b0;
|
|
||||||
LRUWriteEn = 1'b0;
|
LRUWriteEn = 1'b0;
|
||||||
|
|
||||||
// TLB Miss
|
// TLB Miss
|
||||||
@ -169,6 +180,7 @@ module cachefsm
|
|||||||
// amo hit
|
// amo hit
|
||||||
else if(Atomic[1] & (&RW) & CacheHit) begin
|
else if(Atomic[1] & (&RW) & CacheHit) begin
|
||||||
PreSelAdr = 2'b01;
|
PreSelAdr = 2'b01;
|
||||||
|
LRUWriteEn = 1'b1;
|
||||||
|
|
||||||
if(CPUBusy) begin
|
if(CPUBusy) begin
|
||||||
NextState = STATE_CPU_BUSY_FINISH_AMO;
|
NextState = STATE_CPU_BUSY_FINISH_AMO;
|
||||||
@ -176,8 +188,6 @@ module cachefsm
|
|||||||
else save = 1'b1;
|
else save = 1'b1;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
SRAMWordWriteEnable = 1'b1;
|
|
||||||
LRUWriteEn = 1'b1;
|
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -197,7 +207,6 @@ module cachefsm
|
|||||||
// write hit valid cached
|
// write hit valid cached
|
||||||
else if (RW[0] & CacheHit) begin
|
else if (RW[0] & CacheHit) begin
|
||||||
PreSelAdr = 2'b01;
|
PreSelAdr = 2'b01;
|
||||||
SRAMWordWriteEnable = 1'b1;
|
|
||||||
LRUWriteEn = 1'b1;
|
LRUWriteEn = 1'b1;
|
||||||
|
|
||||||
if(CPUBusy) begin
|
if(CPUBusy) begin
|
||||||
@ -238,7 +247,6 @@ module cachefsm
|
|||||||
end
|
end
|
||||||
|
|
||||||
STATE_MISS_WRITE_CACHE_LINE: begin
|
STATE_MISS_WRITE_CACHE_LINE: begin
|
||||||
SRAMLineWriteEnable = 1'b1;
|
|
||||||
NextState = STATE_MISS_READ_WORD;
|
NextState = STATE_MISS_READ_WORD;
|
||||||
PreSelAdr = 2'b01;
|
PreSelAdr = 2'b01;
|
||||||
//LRUWriteEn = 1'b1; // DO not update LRU on SRAM fetch update. Wait for subsequent read/write
|
//LRUWriteEn = 1'b1; // DO not update LRU on SRAM fetch update. Wait for subsequent read/write
|
||||||
@ -256,7 +264,6 @@ module cachefsm
|
|||||||
end
|
end
|
||||||
|
|
||||||
STATE_MISS_READ_WORD_DELAY: begin
|
STATE_MISS_READ_WORD_DELAY: begin
|
||||||
SRAMWordWriteEnable = 1'b0;
|
|
||||||
LRUWriteEn = 1'b0;
|
LRUWriteEn = 1'b0;
|
||||||
if(&RW & Atomic[1]) begin // amo write
|
if(&RW & Atomic[1]) begin // amo write
|
||||||
PreSelAdr = 2'b01;
|
PreSelAdr = 2'b01;
|
||||||
@ -265,7 +272,6 @@ module cachefsm
|
|||||||
if(~`REPLAY) save = 1'b1;
|
if(~`REPLAY) save = 1'b1;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
SRAMWordWriteEnable = 1'b1;
|
|
||||||
LRUWriteEn = 1'b1;
|
LRUWriteEn = 1'b1;
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
end
|
end
|
||||||
@ -283,7 +289,6 @@ module cachefsm
|
|||||||
end
|
end
|
||||||
|
|
||||||
STATE_MISS_WRITE_WORD: begin
|
STATE_MISS_WRITE_WORD: begin
|
||||||
SRAMWordWriteEnable = 1'b1;
|
|
||||||
PreSelAdr = 2'b01;
|
PreSelAdr = 2'b01;
|
||||||
LRUWriteEn = 1'b1;
|
LRUWriteEn = 1'b1;
|
||||||
if(CPUBusy) begin
|
if(CPUBusy) begin
|
||||||
@ -298,7 +303,6 @@ module cachefsm
|
|||||||
|
|
||||||
STATE_MISS_EVICT_DIRTY: begin
|
STATE_MISS_EVICT_DIRTY: begin
|
||||||
PreSelAdr = 2'b01;
|
PreSelAdr = 2'b01;
|
||||||
SelEvict = 1'b1;
|
|
||||||
if(CacheBusAck) begin
|
if(CacheBusAck) begin
|
||||||
NextState = STATE_MISS_WRITE_CACHE_LINE;
|
NextState = STATE_MISS_WRITE_CACHE_LINE;
|
||||||
end else begin
|
end else begin
|
||||||
@ -321,14 +325,12 @@ module cachefsm
|
|||||||
|
|
||||||
STATE_CPU_BUSY_FINISH_AMO: begin
|
STATE_CPU_BUSY_FINISH_AMO: begin
|
||||||
PreSelAdr = 2'b01;
|
PreSelAdr = 2'b01;
|
||||||
SRAMWordWriteEnable = 1'b0;
|
|
||||||
LRUWriteEn = 1'b0;
|
LRUWriteEn = 1'b0;
|
||||||
restore = 1'b1;
|
restore = 1'b1;
|
||||||
if(CPUBusy) begin
|
if(CPUBusy) begin
|
||||||
NextState = STATE_CPU_BUSY_FINISH_AMO;
|
NextState = STATE_CPU_BUSY_FINISH_AMO;
|
||||||
end
|
end
|
||||||
else begin
|
else begin
|
||||||
SRAMWordWriteEnable = 1'b1;
|
|
||||||
LRUWriteEn = 1'b1;
|
LRUWriteEn = 1'b1;
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
end
|
end
|
||||||
@ -407,7 +409,7 @@ module cachefsm
|
|||||||
|
|
||||||
assign CacheCommitted = CurrState != STATE_READY;
|
assign CacheCommitted = CurrState != STATE_READY;
|
||||||
// *** stall missing check on amo miss?
|
// *** stall missing check on amo miss?
|
||||||
assign CacheStall = (CurrState == STATE_READY & (FlushCache | (|RW & ~CacheHit)) & ~IgnoreRequest) |
|
assign CacheStall = (CurrState == STATE_READY & (DoFlush | DoAMOMiss | DoReadMiss | DoWriteMiss)) |
|
||||||
(CurrState == STATE_MISS_FETCH_WDV) |
|
(CurrState == STATE_MISS_FETCH_WDV) |
|
||||||
(CurrState == STATE_MISS_FETCH_DONE) |
|
(CurrState == STATE_MISS_FETCH_DONE) |
|
||||||
(CurrState == STATE_MISS_WRITE_CACHE_LINE) |
|
(CurrState == STATE_MISS_WRITE_CACHE_LINE) |
|
||||||
@ -421,15 +423,17 @@ module cachefsm
|
|||||||
assign SetValid = CurrState == STATE_MISS_WRITE_CACHE_LINE;
|
assign SetValid = CurrState == STATE_MISS_WRITE_CACHE_LINE;
|
||||||
assign ClearValid = '0;
|
assign ClearValid = '0;
|
||||||
// *** setdirty can probably be simplified by not caring about cpubusy
|
// *** setdirty can probably be simplified by not caring about cpubusy
|
||||||
assign SetDirty = (CurrState == STATE_READY & Atomic[1] & (&RW) & CacheHit & ~CPUBusy & ~IgnoreRequest) |
|
assign SetDirty = (CurrState == STATE_READY & DoAMO) |
|
||||||
(CurrState == STATE_READY & RW[0] & CacheHit & ~IgnoreRequest) |
|
(CurrState == STATE_READY & DoWrite) |
|
||||||
(CurrState == STATE_MISS_READ_WORD_DELAY & &RW & Atomic[1] & ~CPUBusy) |
|
(CurrState == STATE_MISS_READ_WORD_DELAY & DoAMO) |
|
||||||
(CurrState == STATE_MISS_WRITE_WORD) |
|
(CurrState == STATE_MISS_WRITE_WORD);
|
||||||
(CurrState == STATE_CPU_BUSY_FINISH_AMO & ~CPUBusy);
|
|
||||||
assign ClearDirty = (CurrState == STATE_MISS_WRITE_CACHE_LINE) |
|
assign ClearDirty = (CurrState == STATE_MISS_WRITE_CACHE_LINE) |
|
||||||
(CurrState == STATE_FLUSH_CLEAR_DIRTY);
|
(CurrState == STATE_FLUSH_CLEAR_DIRTY);
|
||||||
|
assign SRAMWordWriteEnable = (CurrState == STATE_READY & (DoAMOHit | DoWriteHit)) |
|
||||||
|
(CurrState == STATE_MISS_READ_WORD_DELAY & DoAMO) |
|
||||||
|
(CurrState == STATE_MISS_WRITE_WORD);
|
||||||
|
assign SRAMLineWriteEnable = (CurrState == STATE_MISS_WRITE_CACHE_LINE);
|
||||||
|
assign SelEvict = (CurrState == STATE_MISS_EVICT_DIRTY);
|
||||||
|
|
||||||
endmodule // cachefsm
|
endmodule // cachefsm
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user