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