mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Slower but correct implementation of flush.
This commit is contained in:
parent
0310df96a4
commit
da585b30f9
29
pipelined/src/cache/cache.sv
vendored
29
pipelined/src/cache/cache.sv
vendored
@ -32,7 +32,6 @@ module cache #(parameter integer LINELEN,
|
|||||||
(input logic clk,
|
(input logic clk,
|
||||||
input logic reset,
|
input logic reset,
|
||||||
input logic CPUBusy,
|
input logic CPUBusy,
|
||||||
|
|
||||||
// cpu side
|
// cpu side
|
||||||
input logic [1:0] RW,
|
input logic [1:0] RW,
|
||||||
input logic [1:0] Atomic,
|
input logic [1:0] Atomic,
|
||||||
@ -73,7 +72,7 @@ module cache #(parameter integer LINELEN,
|
|||||||
localparam integer LOGWPL = $clog2(WORDSPERLINE);
|
localparam integer LOGWPL = $clog2(WORDSPERLINE);
|
||||||
localparam integer LOGXLENBYTES = $clog2(`XLEN/8);
|
localparam integer LOGXLENBYTES = $clog2(`XLEN/8);
|
||||||
|
|
||||||
localparam integer FlushAdrThreshold = NUMLINES;
|
localparam integer FlushAdrThreshold = NUMLINES - 1;
|
||||||
|
|
||||||
logic [1:0] SelAdr;
|
logic [1:0] SelAdr;
|
||||||
logic [INDEXLEN-1:0] RAdr;
|
logic [INDEXLEN-1:0] RAdr;
|
||||||
@ -103,12 +102,10 @@ module cache #(parameter integer LINELEN,
|
|||||||
|
|
||||||
logic [INDEXLEN-1:0] FlushAdr;
|
logic [INDEXLEN-1:0] FlushAdr;
|
||||||
logic [INDEXLEN-1:0] FlushAdrP1;
|
logic [INDEXLEN-1:0] FlushAdrP1;
|
||||||
logic [INDEXLEN-1:0] FlushAdrQ;
|
|
||||||
logic [INDEXLEN-1:0] FlushAdrMux;
|
|
||||||
logic SelLastFlushAdr;
|
|
||||||
logic FlushAdrCntEn;
|
logic FlushAdrCntEn;
|
||||||
logic FlushAdrCntRst;
|
logic FlushAdrCntRst;
|
||||||
logic FlushAdrFlag;
|
logic FlushAdrFlag;
|
||||||
|
logic FlushWayFlag;
|
||||||
|
|
||||||
logic [NUMWAYS-1:0] FlushWay;
|
logic [NUMWAYS-1:0] FlushWay;
|
||||||
logic [NUMWAYS-1:0] NextFlushWay;
|
logic [NUMWAYS-1:0] NextFlushWay;
|
||||||
@ -126,13 +123,11 @@ module cache #(parameter integer LINELEN,
|
|||||||
mux3 #(INDEXLEN)
|
mux3 #(INDEXLEN)
|
||||||
AdrSelMux(.d0(LsuAdrE[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
|
AdrSelMux(.d0(LsuAdrE[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
|
||||||
.d1(PreLsuPAdrM[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
|
.d1(PreLsuPAdrM[INDEXLEN+OFFSETLEN-1:OFFSETLEN]),
|
||||||
.d2(FlushAdrMux),
|
.d2(FlushAdr),
|
||||||
.s(SelAdr),
|
.s(SelAdr),
|
||||||
.y(RAdr));
|
.y(RAdr));
|
||||||
|
|
||||||
mux2 #(INDEXLEN)
|
|
||||||
FlushAdrSelMux(.d0(FlushAdr), .d1(FlushAdrQ), .s(SelLastFlushAdr),
|
|
||||||
.y(FlushAdrMux));
|
|
||||||
|
|
||||||
cacheway #(.NUMLINES(NUMLINES), .LINELEN(LINELEN), .TAGLEN(TAGLEN),
|
cacheway #(.NUMLINES(NUMLINES), .LINELEN(LINELEN), .TAGLEN(TAGLEN),
|
||||||
.OFFSETLEN(OFFSETLEN), .INDEXLEN(INDEXLEN))
|
.OFFSETLEN(OFFSETLEN), .INDEXLEN(INDEXLEN))
|
||||||
@ -218,7 +213,7 @@ module cache #(parameter integer LINELEN,
|
|||||||
|
|
||||||
mux3 #(`PA_BITS) BaseAdrMux(.d0({LsuPAdrM[`PA_BITS-1:OFFSETLEN], {{OFFSETLEN}{1'b0}}}),
|
mux3 #(`PA_BITS) BaseAdrMux(.d0({LsuPAdrM[`PA_BITS-1:OFFSETLEN], {{OFFSETLEN}{1'b0}}}),
|
||||||
.d1({VictimTag, LsuPAdrM[INDEXLEN+OFFSETLEN-1:OFFSETLEN], {{OFFSETLEN}{1'b0}}}),
|
.d1({VictimTag, LsuPAdrM[INDEXLEN+OFFSETLEN-1:OFFSETLEN], {{OFFSETLEN}{1'b0}}}),
|
||||||
.d2({VictimTag, FlushAdrQ, {{OFFSETLEN}{1'b0}}}),
|
.d2({VictimTag, FlushAdr, {{OFFSETLEN}{1'b0}}}),
|
||||||
.s({SelFlush, SelEvict}),
|
.s({SelFlush, SelEvict}),
|
||||||
.y(CacheBusAdr));
|
.y(CacheBusAdr));
|
||||||
|
|
||||||
@ -228,17 +223,11 @@ module cache #(parameter integer LINELEN,
|
|||||||
flopenr #(INDEXLEN)
|
flopenr #(INDEXLEN)
|
||||||
FlushAdrReg(.clk,
|
FlushAdrReg(.clk,
|
||||||
.reset(reset | FlushAdrCntRst),
|
.reset(reset | FlushAdrCntRst),
|
||||||
.en(FlushAdrCntEn & FlushWay[NUMWAYS-2]),
|
.en(FlushAdrCntEn),
|
||||||
.d(FlushAdrP1),
|
.d(FlushAdrP1),
|
||||||
.q(FlushAdr));
|
.q(FlushAdr));
|
||||||
assign FlushAdrP1 = FlushAdr + 1'b1;
|
assign FlushAdrP1 = FlushAdr + 1'b1;
|
||||||
|
|
||||||
flopenr #(INDEXLEN)
|
|
||||||
FlushAdrQReg(.clk,
|
|
||||||
.reset(reset | FlushAdrCntRst),
|
|
||||||
.en(FlushAdrCntEn),
|
|
||||||
.d(FlushAdr),
|
|
||||||
.q(FlushAdrQ));
|
|
||||||
|
|
||||||
flopenl #(NUMWAYS)
|
flopenl #(NUMWAYS)
|
||||||
FlushWayReg(.clk,
|
FlushWayReg(.clk,
|
||||||
@ -252,7 +241,9 @@ module cache #(parameter integer LINELEN,
|
|||||||
|
|
||||||
assign NextFlushWay = {FlushWay[NUMWAYS-2:0], FlushWay[NUMWAYS-1]};
|
assign NextFlushWay = {FlushWay[NUMWAYS-2:0], FlushWay[NUMWAYS-1]};
|
||||||
|
|
||||||
assign FlushAdrFlag = FlushAdr == FlushAdrThreshold[INDEXLEN-1:0] & FlushWay[NUMWAYS-1];
|
//assign FlushAdrFlag = FlushAdr == FlushAdrThreshold[INDEXLEN-1:0] & FlushWay[NUMWAYS-1];
|
||||||
|
assign FlushAdrFlag = FlushAdr == FlushAdrThreshold[INDEXLEN-1:0];
|
||||||
|
assign FlushWayFlag = FlushWay[NUMWAYS-1];
|
||||||
|
|
||||||
// controller
|
// controller
|
||||||
// *** fixme
|
// *** fixme
|
||||||
@ -268,7 +259,7 @@ module cache #(parameter integer LINELEN,
|
|||||||
.ClearValid, .SetDirty, .ClearDirty, .SRAMWordWriteEnableM,
|
.ClearValid, .SetDirty, .ClearDirty, .SRAMWordWriteEnableM,
|
||||||
.SRAMLineWriteEnableM, .SelEvict, .SelFlush,
|
.SRAMLineWriteEnableM, .SelEvict, .SelFlush,
|
||||||
.FlushAdrCntEn, .FlushWayCntEn, .FlushAdrCntRst,
|
.FlushAdrCntEn, .FlushWayCntEn, .FlushAdrCntRst,
|
||||||
.FlushWayCntRst, .FlushAdrFlag, .FlushCache, .SelLastFlushAdr,
|
.FlushWayCntRst, .FlushAdrFlag, .FlushWayFlag, .FlushCache,
|
||||||
.VDWriteEnable, .LRUWriteEn);
|
.VDWriteEnable, .LRUWriteEn);
|
||||||
|
|
||||||
|
|
||||||
|
54
pipelined/src/cache/cachefsm.sv
vendored
54
pipelined/src/cache/cachefsm.sv
vendored
@ -43,6 +43,7 @@ module cachefsm
|
|||||||
input logic CacheHit,
|
input logic CacheHit,
|
||||||
input logic VictimDirty,
|
input logic VictimDirty,
|
||||||
input logic FlushAdrFlag,
|
input logic FlushAdrFlag,
|
||||||
|
input logic FlushWayFlag,
|
||||||
|
|
||||||
// hazard outputs
|
// hazard outputs
|
||||||
output logic CacheStall,
|
output logic CacheStall,
|
||||||
@ -65,7 +66,6 @@ module cachefsm
|
|||||||
output logic SelEvict,
|
output logic SelEvict,
|
||||||
output logic LRUWriteEn,
|
output logic LRUWriteEn,
|
||||||
output logic SelFlush,
|
output logic SelFlush,
|
||||||
output logic SelLastFlushAdr,
|
|
||||||
output logic FlushAdrCntEn,
|
output logic FlushAdrCntEn,
|
||||||
output logic FlushWayCntEn,
|
output logic FlushWayCntEn,
|
||||||
output logic FlushAdrCntRst,
|
output logic FlushAdrCntRst,
|
||||||
@ -90,6 +90,8 @@ module cachefsm
|
|||||||
STATE_CPU_BUSY_FINISH_AMO,
|
STATE_CPU_BUSY_FINISH_AMO,
|
||||||
|
|
||||||
STATE_FLUSH,
|
STATE_FLUSH,
|
||||||
|
STATE_FLUSH_CHECK,
|
||||||
|
STATE_FLUSH_INCR,
|
||||||
STATE_FLUSH_WRITE_BACK,
|
STATE_FLUSH_WRITE_BACK,
|
||||||
STATE_FLUSH_CLEAR_DIRTY} statetype;
|
STATE_FLUSH_CLEAR_DIRTY} statetype;
|
||||||
|
|
||||||
@ -126,7 +128,6 @@ module cachefsm
|
|||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
CacheFetchLine = 1'b0;
|
CacheFetchLine = 1'b0;
|
||||||
CacheWriteLine = 1'b0;
|
CacheWriteLine = 1'b0;
|
||||||
SelLastFlushAdr = 1'b0;
|
|
||||||
|
|
||||||
case (CurrState)
|
case (CurrState)
|
||||||
STATE_READY: begin
|
STATE_READY: begin
|
||||||
@ -152,10 +153,9 @@ module cachefsm
|
|||||||
// Flush dcache to next level of memory
|
// Flush dcache to next level of memory
|
||||||
else if(FlushCache) begin
|
else if(FlushCache) begin
|
||||||
NextState = STATE_FLUSH;
|
NextState = STATE_FLUSH;
|
||||||
CacheStall = 1'b1;
|
|
||||||
SelAdr = 2'b10;
|
|
||||||
FlushAdrCntRst = 1'b1;
|
FlushAdrCntRst = 1'b1;
|
||||||
FlushWayCntRst = 1'b1;
|
FlushWayCntRst = 1'b1;
|
||||||
|
CacheStall = 1'b1;
|
||||||
end
|
end
|
||||||
|
|
||||||
// amo hit
|
// amo hit
|
||||||
@ -338,33 +338,49 @@ module cachefsm
|
|||||||
end
|
end
|
||||||
|
|
||||||
STATE_FLUSH: begin
|
STATE_FLUSH: begin
|
||||||
|
// intialize flush counters
|
||||||
|
SelFlush = 1'b1;
|
||||||
|
CacheStall = 1'b1;
|
||||||
|
SelAdr = 2'b10;
|
||||||
|
NextState = STATE_FLUSH_CHECK;
|
||||||
|
end
|
||||||
|
|
||||||
|
STATE_FLUSH_CHECK: begin
|
||||||
CacheStall = 1'b1;
|
CacheStall = 1'b1;
|
||||||
SelAdr = 2'b10;
|
SelAdr = 2'b10;
|
||||||
SelFlush = 1'b1;
|
SelFlush = 1'b1;
|
||||||
FlushAdrCntEn = 1'b1;
|
|
||||||
FlushWayCntEn = 1'b1;
|
|
||||||
SelLastFlushAdr = 1'b0;
|
|
||||||
if(VictimDirty) begin
|
if(VictimDirty) begin
|
||||||
NextState = STATE_FLUSH_WRITE_BACK;
|
NextState = STATE_FLUSH_WRITE_BACK;
|
||||||
FlushAdrCntEn = 1'b0;
|
|
||||||
FlushWayCntEn = 1'b0;
|
FlushWayCntEn = 1'b0;
|
||||||
CacheWriteLine = 1'b1;
|
CacheWriteLine = 1'b1;
|
||||||
SelLastFlushAdr = 1'b1;
|
end else if (FlushAdrFlag & FlushWayFlag) begin
|
||||||
end else if (FlushAdrFlag) begin
|
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
CacheStall = 1'b0;
|
CacheStall = 1'b0;
|
||||||
FlushAdrCntEn = 1'b0;
|
SelAdr = 2'b00;
|
||||||
FlushWayCntEn = 1'b0;
|
FlushWayCntEn = 1'b0;
|
||||||
|
end else if(FlushWayFlag) begin
|
||||||
|
NextState = STATE_FLUSH_INCR;
|
||||||
|
FlushAdrCntEn = 1'b1;
|
||||||
|
|
||||||
|
FlushWayCntEn = 1'b1;
|
||||||
end else begin
|
end else begin
|
||||||
NextState = STATE_FLUSH;
|
FlushWayCntEn = 1'b1;
|
||||||
|
NextState = STATE_FLUSH_CHECK;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
STATE_FLUSH_INCR: begin
|
||||||
|
CacheStall = 1'b1;
|
||||||
|
SelAdr = 2'b10;
|
||||||
|
SelFlush = 1'b1;
|
||||||
|
FlushWayCntRst = 1'b1;
|
||||||
|
NextState = STATE_FLUSH_CHECK;
|
||||||
|
end
|
||||||
|
|
||||||
STATE_FLUSH_WRITE_BACK: begin
|
STATE_FLUSH_WRITE_BACK: begin
|
||||||
CacheStall = 1'b1;
|
CacheStall = 1'b1;
|
||||||
SelAdr = 2'b10;
|
SelAdr = 2'b10;
|
||||||
SelFlush = 1'b1;
|
SelFlush = 1'b1;
|
||||||
SelLastFlushAdr = 1'b1;
|
|
||||||
if(CacheBusAck) begin
|
if(CacheBusAck) begin
|
||||||
NextState = STATE_FLUSH_CLEAR_DIRTY;
|
NextState = STATE_FLUSH_CLEAR_DIRTY;
|
||||||
end else begin
|
end else begin
|
||||||
@ -378,16 +394,18 @@ module cachefsm
|
|||||||
VDWriteEnable = 1'b1;
|
VDWriteEnable = 1'b1;
|
||||||
SelFlush = 1'b1;
|
SelFlush = 1'b1;
|
||||||
SelAdr = 2'b10;
|
SelAdr = 2'b10;
|
||||||
FlushAdrCntEn = 1'b0;
|
|
||||||
FlushWayCntEn = 1'b0;
|
FlushWayCntEn = 1'b0;
|
||||||
SelLastFlushAdr = 1'b0;
|
if(FlushAdrFlag & FlushWayFlag) begin
|
||||||
if(FlushAdrFlag) begin
|
|
||||||
NextState = STATE_READY;
|
NextState = STATE_READY;
|
||||||
CacheStall = 1'b0;
|
CacheStall = 1'b0;
|
||||||
SelAdr = 2'b00;
|
SelAdr = 2'b00;
|
||||||
end else begin
|
end else if (FlushWayFlag) begin
|
||||||
NextState = STATE_FLUSH;
|
NextState = STATE_FLUSH_INCR;
|
||||||
FlushAdrCntEn = 1'b1;
|
FlushAdrCntEn = 1'b1;
|
||||||
|
|
||||||
|
FlushWayCntEn = 1'b1;
|
||||||
|
end else begin
|
||||||
|
NextState = STATE_FLUSH_CHECK;
|
||||||
FlushWayCntEn = 1'b1;
|
FlushWayCntEn = 1'b1;
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
2
pipelined/src/cache/cacheway.sv
vendored
2
pipelined/src/cache/cacheway.sv
vendored
@ -135,6 +135,8 @@ module cacheway #(parameter NUMLINES=512, parameter LINELEN = 256, TAGLEN = 26,
|
|||||||
end else begin:dirty
|
end else begin:dirty
|
||||||
assign Dirty = 1'b0;
|
assign Dirty = 1'b0;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
endmodule // DCacheMemWay
|
endmodule // DCacheMemWay
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user