forked from Github_Repos/cvw
completed read miss branch through dcache fsm.
The challenge now is to connect to ahb and lsu.
This commit is contained in:
parent
910ddb83ae
commit
93aa39ca31
42
wally-pipelined/src/cache/dcache.sv
vendored
42
wally-pipelined/src/cache/dcache.sv
vendored
@ -81,6 +81,7 @@ module dcache
|
||||
logic SetValidM, ClearValidM, SetValidW, ClearValidW;
|
||||
logic SetDirtyM, ClearDirtyM, SetDirtyW, ClearDirtyW;
|
||||
logic [BLOCKLEN-1:0] ReadDataM, ReadDataMaskedM [NUMWAYS-1:0];
|
||||
logic [BLOCKLEN-1:0] VictimReadDataMaskedM [NUMWAYS-1:0];
|
||||
logic [TAGLEN-1:0] TagData [NUMWAYS-1:0];
|
||||
logic [NUMWAYS-1:0] Valid, Dirty, WayHit;
|
||||
logic CacheHit;
|
||||
@ -102,7 +103,11 @@ module dcache
|
||||
|
||||
logic SaveSRAMRead;
|
||||
logic [1:0] AtomicW;
|
||||
|
||||
logic [NUMWAYS-1:0] VictimWay;
|
||||
logic [NUMWAYS-1:0] VictimDirtyWay;
|
||||
logic [BLOCKLEN-1:0] VictimReadDataSelectWayM;
|
||||
logic VictimDirty;
|
||||
|
||||
|
||||
|
||||
|
||||
@ -149,7 +154,11 @@ module dcache
|
||||
.Valid(Valid[way]),
|
||||
.Dirty(Dirty[way]));
|
||||
assign WayHit = Valid & (ReadTag[way] == MemAdrM);
|
||||
assign ReadDataMaskedM = Valid[way] ? ReadDataM[way] : '0; // first part of AO mux.
|
||||
assign ReadDataMaskedM[way] = Valid[way] ? ReadDataM[way] : '0; // first part of AO mux.
|
||||
|
||||
// the cache block candiate for eviction
|
||||
assign VictimReadDataMaskedM[way] = VictimWay[way] & ReadDataM[way];
|
||||
assign VictimDirtyWay[way] = VictimWay[way] & Dirty[way] & Valid[way];
|
||||
end
|
||||
endgenerate
|
||||
|
||||
@ -160,9 +169,14 @@ module dcache
|
||||
|
||||
// *** TODO add replacement policy
|
||||
assign NewReplacement = '0;
|
||||
assign VictimWay = 4'b0001;
|
||||
assign SRAMWriteEnable = SRAMBlockWriteEnableM ? VictimWay : '0;
|
||||
|
||||
assign CacheHit = |WayHit;
|
||||
assign ReadDataSelectWayM = |ReadDataMaskedM; // second part of AO mux.
|
||||
assign VictimReadDataSelectWayM = | VictimReadDataMaskedM;
|
||||
assign VictimDirty = | VictimDirtyWay;
|
||||
|
||||
|
||||
// Convert the Read data bus ReadDataSelectWay into sets of XLEN so we can
|
||||
// easily build a variable input mux.
|
||||
@ -344,7 +358,9 @@ module dcache
|
||||
SRAMBlockWriteEnableM = 1'b0;
|
||||
SaveSRAMRead = 1'b1;
|
||||
CntReset = 1'b0;
|
||||
|
||||
AHBRead = 1'b0;
|
||||
AHBWrite = 1'b0;
|
||||
|
||||
case (CurrState)
|
||||
STATE_READY: begin
|
||||
// sram busy
|
||||
@ -397,6 +413,7 @@ module dcache
|
||||
STATE_READ_MISS_FETCH_WDV: begin
|
||||
DCacheStall = 1'b1;
|
||||
PreCntEn = 1'b1;
|
||||
AHBRead = 1'b1;
|
||||
if (FetchCountFlag & AHBAck) begin
|
||||
NextState = STATE_READ_MISS_FETCH_DONE;
|
||||
end else begin
|
||||
@ -406,7 +423,24 @@ module dcache
|
||||
|
||||
STATE_READ_MISS_FETCH_DONE: begin
|
||||
DCacheStall = 1'b1;
|
||||
NextState = STATE_READ_MISS_CHECK_EVICTED_DIRTY;
|
||||
if(VictimDirt) begin
|
||||
NextState = STATE_READ_MISS_CHECK_EVICTED_DIRTY;
|
||||
end else begin
|
||||
NextState = STATE_READ_MISS_WRITE_CACHE_BLOCK;
|
||||
end
|
||||
end
|
||||
|
||||
STATE_READ_MISS_WRITE_CACHE_BLOCK: begin
|
||||
SRAMBlockWriteEnableM = 1'b1;
|
||||
DCacheStall = 1'b1;
|
||||
NextState = STATE_READ_MISS_READ_WORD;
|
||||
SelAdrM = 1'b1;
|
||||
end
|
||||
|
||||
STATE_READ_MISS_READ_WORD: begin
|
||||
DCacheStall = 1'b1;
|
||||
SelAdrM = 1'b1;
|
||||
NextState = STATE_READY;
|
||||
end
|
||||
|
||||
STATE_PTW_MISS_FETCH_WDV: begin
|
||||
|
@ -109,16 +109,11 @@ module ahblite (
|
||||
// interface that might be used in place of the ahblite.
|
||||
always_comb
|
||||
case (BusState)
|
||||
IDLE: /*if (MMUTranslate) ProposedNextBusState = MMUTRANSLATE;
|
||||
else*/ if (AtomicMaskedM[1]) ProposedNextBusState = ATOMICREAD;
|
||||
IDLE: if (AtomicMaskedM[1]) ProposedNextBusState = ATOMICREAD;
|
||||
else if (MemReadM) ProposedNextBusState = MEMREAD; // Memory has priority over instructions
|
||||
else if (MemWriteM) ProposedNextBusState = MEMWRITE;
|
||||
else if (InstrReadF) ProposedNextBusState = INSTRREAD;
|
||||
else ProposedNextBusState = IDLE;
|
||||
/* -----\/----- EXCLUDED -----\/-----
|
||||
MMUTRANSLATE: if (~HREADY) ProposedNextBusState = MMUTRANSLATE;
|
||||
else ProposedNextBusState = IDLE;
|
||||
-----/\----- EXCLUDED -----/\----- */
|
||||
ATOMICREAD: if (~HREADY) ProposedNextBusState = ATOMICREAD;
|
||||
else ProposedNextBusState = ATOMICWRITE;
|
||||
ATOMICWRITE: if (~HREADY) ProposedNextBusState = ATOMICWRITE;
|
||||
|
@ -84,8 +84,6 @@ module ifu (
|
||||
output logic InstrAccessFaultF,
|
||||
|
||||
output logic ISquashBusAccessF
|
||||
// output logic [5:0] IHSELRegionsF
|
||||
|
||||
);
|
||||
|
||||
logic [`XLEN-1:0] PCCorrectE, UnalignedPCNextF, PCNextF;
|
||||
|
Loading…
Reference in New Issue
Block a user