mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Loads in modelsim, but the first store double does not function correctly. The write address is wrong so the cache is updated using the wrong address.
I think this is do to the cycle latency of stores. We probably need extra muxes to select between MemPAdrM and MemPAdrW depending on if the write is a full cache block or a word write from the CPU.
This commit is contained in:
parent
4c0cee1c19
commit
b1ceeb40df
66
wally-pipelined/src/cache/dcache.sv
vendored
66
wally-pipelined/src/cache/dcache.sv
vendored
@ -69,14 +69,12 @@ module dcache
|
|||||||
localparam integer TAGLEN = `PA_BITS - OFFSETLEN - INDEXLEN;
|
localparam integer TAGLEN = `PA_BITS - OFFSETLEN - INDEXLEN;
|
||||||
localparam integer WORDSPERLINE = BLOCKLEN/`XLEN;
|
localparam integer WORDSPERLINE = BLOCKLEN/`XLEN;
|
||||||
localparam integer LOGWPL = $clog2(WORDSPERLINE);
|
localparam integer LOGWPL = $clog2(WORDSPERLINE);
|
||||||
|
localparam integer LOGXLENBYTES = $clog2(`XLEN/8);
|
||||||
|
|
||||||
|
|
||||||
logic SelAdrM;
|
logic SelAdrM;
|
||||||
logic [`PA_BITS-1:0] MemPAdrW;
|
logic [`PA_BITS-1:0] MemPAdrW;
|
||||||
logic [INDEXLEN-1:0] SRAMAdr;
|
logic [INDEXLEN-1:0] SRAMAdr;
|
||||||
logic [NUMWAYS-1:0] WriteEnable;
|
|
||||||
logic [NUMWAYS-1:0] WriteWordEnable;
|
|
||||||
logic [BLOCKLEN-1:0] SRAMWriteData;
|
logic [BLOCKLEN-1:0] SRAMWriteData;
|
||||||
logic [BLOCKLEN-1:0] DCacheMemWriteData;
|
logic [BLOCKLEN-1:0] DCacheMemWriteData;
|
||||||
logic SetValidM, ClearValidM, SetValidW, ClearValidW;
|
logic SetValidM, ClearValidM, SetValidW, ClearValidW;
|
||||||
@ -95,7 +93,7 @@ module dcache
|
|||||||
logic [`XLEN-1:0] WriteDataW, FinalWriteDataW, FinalAMOWriteDataW;
|
logic [`XLEN-1:0] WriteDataW, FinalWriteDataW, FinalAMOWriteDataW;
|
||||||
logic [BLOCKLEN-1:0] FinalWriteDataWordsW;
|
logic [BLOCKLEN-1:0] FinalWriteDataWordsW;
|
||||||
logic [LOGWPL:0] FetchCount, NextFetchCount;
|
logic [LOGWPL:0] FetchCount, NextFetchCount;
|
||||||
logic [WORDSPERLINE-1:0] SRAMWordEnable [NUMWAYS-1:0];
|
logic [WORDSPERLINE-1:0] SRAMWordEnable;
|
||||||
logic SelMemWriteDataM, SelMemWriteDataW;
|
logic SelMemWriteDataM, SelMemWriteDataW;
|
||||||
logic [2:0] Funct3W;
|
logic [2:0] Funct3W;
|
||||||
|
|
||||||
@ -114,6 +112,7 @@ module dcache
|
|||||||
logic SelAMOWrite;
|
logic SelAMOWrite;
|
||||||
logic [6:0] Funct7W;
|
logic [6:0] Funct7W;
|
||||||
logic [INDEXLEN-1:0] AdrMuxOut;
|
logic [INDEXLEN-1:0] AdrMuxOut;
|
||||||
|
logic [2**LOGWPL-1:0] MemPAdrDecodedW;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -145,6 +144,13 @@ module dcache
|
|||||||
.s(SRAMWordWriteEnableW),
|
.s(SRAMWordWriteEnableW),
|
||||||
.y(SRAMAdr));
|
.y(SRAMAdr));
|
||||||
|
|
||||||
|
oneHotDecoder #(LOGWPL)
|
||||||
|
oneHotDecoder(.bin(MemPAdrW[LOGWPL+LOGXLENBYTES-1:LOGXLENBYTES]),
|
||||||
|
.decoded(MemPAdrDecodedW));
|
||||||
|
|
||||||
|
|
||||||
|
assign SRAMWordEnable = SRAMBlockWriteEnableM ? '1 : MemPAdrDecodedW;
|
||||||
|
|
||||||
|
|
||||||
genvar way;
|
genvar way;
|
||||||
generate
|
generate
|
||||||
@ -153,9 +159,9 @@ module dcache
|
|||||||
MemWay(.clk(clk),
|
MemWay(.clk(clk),
|
||||||
.reset(reset),
|
.reset(reset),
|
||||||
.Adr(SRAMAdr),
|
.Adr(SRAMAdr),
|
||||||
.WAdr(MemPAdrW[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
|
.WAdr(MemPAdrM[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
|
||||||
.WriteEnable(SRAMWayWriteEnable[way]),
|
.WriteEnable(SRAMWayWriteEnable[way]),
|
||||||
.WriteWordEnable(SRAMWordEnable[way]),
|
.WriteWordEnable(SRAMWordEnable),
|
||||||
.WriteData(SRAMWriteData),
|
.WriteData(SRAMWriteData),
|
||||||
.WriteTag(MemPAdrW[`PA_BITS-1:OFFSETLEN+INDEXLEN]),
|
.WriteTag(MemPAdrW[`PA_BITS-1:OFFSETLEN+INDEXLEN]),
|
||||||
.SetValid(SetValidW),
|
.SetValid(SetValidW),
|
||||||
@ -424,6 +430,12 @@ module dcache
|
|||||||
CntReset = 1'b1;
|
CntReset = 1'b1;
|
||||||
DCacheStall = 1'b1;
|
DCacheStall = 1'b1;
|
||||||
end
|
end
|
||||||
|
// write miss valid cached
|
||||||
|
else if(MemRWM[0] & ~UncachedM & ~FaultM & ~CacheHit & ~DTLBMissM) begin
|
||||||
|
NextState = STATE_WRITE_MISS_FETCH_WDV;
|
||||||
|
CntReset = 1'b1;
|
||||||
|
DCacheStall = 1'b1;
|
||||||
|
end
|
||||||
// fault
|
// fault
|
||||||
else if(|MemRWM & FaultM & ~DTLBMissM) begin
|
else if(|MemRWM & FaultM & ~DTLBMissM) begin
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
@ -468,10 +480,45 @@ module dcache
|
|||||||
|
|
||||||
STATE_READ_MISS_READ_WORD: begin
|
STATE_READ_MISS_READ_WORD: begin
|
||||||
DCacheStall = 1'b1;
|
DCacheStall = 1'b1;
|
||||||
SelAdrM = 1'b1;
|
SelAdrM = 1'b0;
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
STATE_WRITE_MISS_FETCH_WDV: begin
|
||||||
|
DCacheStall = 1'b1;
|
||||||
|
PreCntEn = 1'b1;
|
||||||
|
AHBRead = 1'b1;
|
||||||
|
if (FetchCountFlag & AHBAck) begin
|
||||||
|
NextState = STATE_WRITE_MISS_FETCH_DONE;
|
||||||
|
end else begin
|
||||||
|
NextState = STATE_WRITE_MISS_FETCH_WDV;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
STATE_WRITE_MISS_FETCH_DONE: begin
|
||||||
|
DCacheStall = 1'b1;
|
||||||
|
if(VictimDirty) begin
|
||||||
|
NextState = STATE_WRITE_MISS_CHECK_EVICTED_DIRTY;
|
||||||
|
end else begin
|
||||||
|
NextState = STATE_WRITE_MISS_WRITE_CACHE_BLOCK;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
STATE_WRITE_MISS_WRITE_CACHE_BLOCK: begin
|
||||||
|
SRAMBlockWriteEnableM = 1'b1;
|
||||||
|
DCacheStall = 1'b1;
|
||||||
|
NextState = STATE_WRITE_MISS_WRITE_WORD;
|
||||||
|
SelAdrM = 1'b1;
|
||||||
|
SetValidM = 1'b1;
|
||||||
|
end
|
||||||
|
|
||||||
|
STATE_WRITE_MISS_WRITE_WORD: begin
|
||||||
|
SRAMWordWriteEnableM = 1'b1;
|
||||||
|
DCacheStall = 1'b0;
|
||||||
|
NextState = STATE_READY;
|
||||||
|
SetDirtyM = 1'b1;
|
||||||
|
end
|
||||||
|
|
||||||
STATE_PTW_MISS_FETCH_WDV: begin
|
STATE_PTW_MISS_FETCH_WDV: begin
|
||||||
DCacheStall = 1'b1;
|
DCacheStall = 1'b1;
|
||||||
SelAdrM = 1'b1;
|
SelAdrM = 1'b1;
|
||||||
@ -481,6 +528,11 @@ module dcache
|
|||||||
NextState = STATE_PTW_MISS_FETCH_WDV;
|
NextState = STATE_PTW_MISS_FETCH_WDV;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
STATE_SRAM_BUSY: begin
|
||||||
|
DCacheStall = 1'b0;
|
||||||
|
NextState = STATE_READY;
|
||||||
|
end
|
||||||
default: begin
|
default: begin
|
||||||
end
|
end
|
||||||
endcase
|
endcase
|
||||||
|
@ -258,9 +258,6 @@ module lsu
|
|||||||
flopr #(1) committedMreg(clk,reset,(CommittedMfromDCache | CommitM) & StallM,preCommittedM);
|
flopr #(1) committedMreg(clk,reset,(CommittedMfromDCache | CommitM) & StallM,preCommittedM);
|
||||||
assign CommittedMfromDCache = preCommittedM | CommitM;
|
assign CommittedMfromDCache = preCommittedM | CommitM;
|
||||||
|
|
||||||
// Determine if address is valid
|
|
||||||
assign LoadMisalignedFaultM = DataMisalignedMfromDCache & MemRWMtoDCache[1];
|
|
||||||
assign StoreMisalignedFaultM = DataMisalignedMfromDCache & MemRWMtoDCache[0];
|
|
||||||
|
|
||||||
// Handle atomic load reserved / store conditional
|
// Handle atomic load reserved / store conditional
|
||||||
generate
|
generate
|
||||||
@ -288,6 +285,9 @@ module lsu
|
|||||||
endgenerate
|
endgenerate
|
||||||
-----/\----- EXCLUDED -----/\----- */
|
-----/\----- EXCLUDED -----/\----- */
|
||||||
|
|
||||||
|
// Determine if address is valid
|
||||||
|
assign LoadMisalignedFaultM = DataMisalignedMfromDCache & MemRWMtoDCache[1];
|
||||||
|
assign StoreMisalignedFaultM = DataMisalignedMfromDCache & MemRWMtoDCache[0];
|
||||||
|
|
||||||
// *** BUG
|
// *** BUG
|
||||||
assign MemAdrEtoDCache = MemAdrE; // needs to be muxed in lsuarb.
|
assign MemAdrEtoDCache = MemAdrE; // needs to be muxed in lsuarb.
|
||||||
|
Loading…
Reference in New Issue
Block a user