mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
replace instances of code duplication for i$ exclusions w/commands
This commit is contained in:
parent
a52eb01407
commit
862d1e0116
@ -62,6 +62,17 @@ coverage exclude -scope /dut/core/ifu/bus/icache/icache/cachefsm -linerange $sta
|
|||||||
coverage exclude -scope /dut/core/ifu/bus/icache/icache/cachefsm -linerange [GetLineNum ../src/cache/cachefsm.sv "exclusion-tag: icache CacheBusW"]
|
coverage exclude -scope /dut/core/ifu/bus/icache/icache/cachefsm -linerange [GetLineNum ../src/cache/cachefsm.sv "exclusion-tag: icache CacheBusW"]
|
||||||
coverage exclude -scope /dut/core/ifu/bus/icache/icache/cachefsm -linerange [GetLineNum ../src/cache/cachefsm.sv "exclusion-tag: icache SelAdrCauses"] -item e 1 -fecexprrow 4 10
|
coverage exclude -scope /dut/core/ifu/bus/icache/icache/cachefsm -linerange [GetLineNum ../src/cache/cachefsm.sv "exclusion-tag: icache SelAdrCauses"] -item e 1 -fecexprrow 4 10
|
||||||
coverage exclude -scope /dut/core/ifu/bus/icache/icache/cachefsm -linerange [GetLineNum ../src/cache/cachefsm.sv "exclusion-tag: icache CacheBusRCauses"] -item e 1 -fecexprrow 1-2 12
|
coverage exclude -scope /dut/core/ifu/bus/icache/icache/cachefsm -linerange [GetLineNum ../src/cache/cachefsm.sv "exclusion-tag: icache CacheBusRCauses"] -item e 1 -fecexprrow 1-2 12
|
||||||
|
# cache.sv AdrSelMux and CacheBusAdrMux, excluding unhit Flush branch
|
||||||
|
coverage exclude -scope /dut/core/ifu/bus/icache/icache/AdrSelMux -linerange [GetLineNum ../src/generic/mux.sv "exclusion-tag: mux3"] -item b 1
|
||||||
|
coverage exclude -scope /dut/core/ifu/bus/icache/icache/CacheBusAdrMux -linerange [GetLineNum ../src/generic/mux.sv "exclusion-tag: mux3"] -item b 1 3
|
||||||
|
# CacheWay Dirty logic. -scope does not accept wildcards.
|
||||||
|
set numcacheways 4
|
||||||
|
for {set i 0} {$i < $numcacheways} {incr i} {
|
||||||
|
coverage exclude -scope /dut/core/ifu/bus/icache/icache/CacheWays[$i] -linerange [GetLineNum ../src/cache/cacheway.sv "exclusion-tag: icache SetDirtyWay"] -item e 1
|
||||||
|
coverage exclude -scope /dut/core/ifu/bus/icache/icache/CacheWays[$i] -linerange [GetLineNum ../src/cache/cacheway.sv "exclusion-tag: icache SelectedWiteWordEn"] -item e 1 -fecexprrow 4 6
|
||||||
|
# below: flushD can't go high during an icache write b/c of pipeline stall
|
||||||
|
coverage exclude -scope /dut/core/ifu/bus/icache/icache/CacheWays[$i] -linerange [GetLineNum ../src/cache/cacheway.sv "exclusion-tag: icache SetValidEN"] -item e 1 -fecexprrow 4
|
||||||
|
}
|
||||||
|
|
||||||
######################
|
######################
|
||||||
# Toggle exclusions
|
# Toggle exclusions
|
||||||
|
28
src/cache/cache.sv
vendored
28
src/cache/cache.sv
vendored
@ -73,6 +73,7 @@ module cache #(parameter LINELEN, NUMLINES, NUMWAYS, LOGBWPL, WORDLEN, MUXINTE
|
|||||||
|
|
||||||
|
|
||||||
logic SelAdr;
|
logic SelAdr;
|
||||||
|
logic [1:0] AdrSelMuxSel;
|
||||||
logic [SETLEN-1:0] CacheSet;
|
logic [SETLEN-1:0] CacheSet;
|
||||||
logic [LINELEN-1:0] LineWriteData;
|
logic [LINELEN-1:0] LineWriteData;
|
||||||
logic ClearDirty, SetDirty, SetValid;
|
logic ClearDirty, SetDirty, SetValid;
|
||||||
@ -108,18 +109,10 @@ module cache #(parameter LINELEN, NUMLINES, NUMWAYS, LOGBWPL, WORDLEN, MUXINTE
|
|||||||
// and FlushAdr when handling D$ flushes
|
// and FlushAdr when handling D$ flushes
|
||||||
// The icache must update to the newest PCNextF on flush as it is probably a trap. Trap
|
// The icache must update to the newest PCNextF on flush as it is probably a trap. Trap
|
||||||
// sets PCNextF to XTVEC and the icache must start reading the instruction.
|
// sets PCNextF to XTVEC and the icache must start reading the instruction.
|
||||||
if (!READ_ONLY_CACHE) begin
|
assign AdrSelMuxSel = {SelFlush, ((SelAdr | SelHPTW) & ~((READ_ONLY_CACHE == 1) & FlushStage))};
|
||||||
logic [1:0] AdrSelMuxSel;
|
mux3 #(SETLEN) AdrSelMux(NextSet[SETTOP-1:OFFSETLEN], PAdr[SETTOP-1:OFFSETLEN], FlushAdr,
|
||||||
assign AdrSelMuxSel = {SelFlush, SelAdr | SelHPTW};
|
|
||||||
mux3 #(SETLEN) AdrSelMux(NextSet[SETTOP-1:OFFSETLEN], PAdr[SETTOP-1:OFFSETLEN], FlushAdr,
|
|
||||||
AdrSelMuxSel, CacheSet);
|
AdrSelMuxSel, CacheSet);
|
||||||
end
|
|
||||||
else begin
|
|
||||||
logic AdrSelMuxSel;
|
|
||||||
assign AdrSelMuxSel = ((SelAdr | SelHPTW) & ~FlushStage);
|
|
||||||
mux2 #(SETLEN) AdrSelMux(NextSet[SETTOP-1:OFFSETLEN], PAdr[SETTOP-1:OFFSETLEN],
|
|
||||||
AdrSelMuxSel, CacheSet);
|
|
||||||
end
|
|
||||||
// Array of cache ways, along with victim, hit, dirty, and read merging logic
|
// Array of cache ways, along with victim, hit, dirty, and read merging logic
|
||||||
cacheway #(NUMLINES, LINELEN, TAGLEN, OFFSETLEN, SETLEN, READ_ONLY_CACHE) CacheWays[NUMWAYS-1:0](
|
cacheway #(NUMLINES, LINELEN, TAGLEN, OFFSETLEN, SETLEN, READ_ONLY_CACHE) CacheWays[NUMWAYS-1:0](
|
||||||
.clk, .reset, .CacheEn, .CacheSet, .PAdr, .LineWriteData, .LineByteMask,
|
.clk, .reset, .CacheEn, .CacheSet, .PAdr, .LineWriteData, .LineByteMask,
|
||||||
@ -159,14 +152,11 @@ module cache #(parameter LINELEN, NUMLINES, NUMWAYS, LOGBWPL, WORDLEN, MUXINTE
|
|||||||
.PAdr(WordOffsetAddr), .ReadDataLine, .ReadDataWord);
|
.PAdr(WordOffsetAddr), .ReadDataLine, .ReadDataWord);
|
||||||
|
|
||||||
// Bus address for fetch, writeback, or flush writeback
|
// Bus address for fetch, writeback, or flush writeback
|
||||||
if (!READ_ONLY_CACHE)
|
mux3 #(`PA_BITS) CacheBusAdrMux(.d0({PAdr[`PA_BITS-1:OFFSETLEN], {OFFSETLEN{1'b0}}}),
|
||||||
mux3 #(`PA_BITS) CacheBusAdrMux(.d0({PAdr[`PA_BITS-1:OFFSETLEN], {OFFSETLEN{1'b0}}}),
|
.d1({Tag, PAdr[SETTOP-1:OFFSETLEN], {OFFSETLEN{1'b0}}}),
|
||||||
.d1({Tag, PAdr[SETTOP-1:OFFSETLEN], {OFFSETLEN{1'b0}}}),
|
.d2({Tag, FlushAdr, {OFFSETLEN{1'b0}}}),
|
||||||
.d2({Tag, FlushAdr, {OFFSETLEN{1'b0}}}),
|
.s({SelFlush, SelWriteback}), .y(CacheBusAdr));
|
||||||
.s({SelFlush, SelWriteback}), .y(CacheBusAdr));
|
|
||||||
else
|
|
||||||
assign CacheBusAdr = {PAdr[`PA_BITS-1:OFFSETLEN], {OFFSETLEN{1'b0}}};
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Write Path
|
// Write Path
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
20
src/cache/cacheway.sv
vendored
20
src/cache/cacheway.sv
vendored
@ -97,22 +97,10 @@ module cacheway #(parameter NUMLINES=512, LINELEN = 256, TAGLEN = 26,
|
|||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
assign SetValidWay = SetValid & SelData;
|
assign SetValidWay = SetValid & SelData;
|
||||||
if (!READ_ONLY_CACHE) begin
|
assign SetDirtyWay = SetDirty & SelData; // exclusion-tag: icache SetDirtyWay
|
||||||
assign SetDirtyWay = SetDirty & SelData;
|
assign ClearDirtyWay = ClearDirty & SelData;
|
||||||
assign ClearDirtyWay = ClearDirty & SelData;
|
assign SelectedWriteWordEn = (SetValidWay | SetDirtyWay) & ~FlushStage; // exclusion-tag: icache SelectedWiteWordEn
|
||||||
assign SelectedWriteWordEn = (SetValidWay | SetDirtyWay) & ~FlushStage;
|
assign SetValidEN = SetValidWay & ~FlushStage; // exclusion-tag: icache SetValidEN
|
||||||
assign SetValidEN = SetValidWay & ~FlushStage;
|
|
||||||
end
|
|
||||||
else begin
|
|
||||||
// Don't cover FlushStage assertion during SetValidWay.
|
|
||||||
// it's not explicitely gated anywhere, but for read-only caches,
|
|
||||||
// there's no way that a FlushD can happen during the write stage
|
|
||||||
// of a fetch.
|
|
||||||
// coverage off -item e 1 -fecexprrow 4
|
|
||||||
assign SelectedWriteWordEn = SetValidWay & ~FlushStage;
|
|
||||||
// coverage off -item e 1 -fecexprrow 4
|
|
||||||
assign SetValidEN = SetValidWay & ~FlushStage;
|
|
||||||
end
|
|
||||||
|
|
||||||
// If writing the whole line set all write enables to 1, else only set the correct word.
|
// If writing the whole line set all write enables to 1, else only set the correct word.
|
||||||
assign FinalByteMask = SetValidWay ? '1 : LineByteMask; // OR
|
assign FinalByteMask = SetValidWay ? '1 : LineByteMask; // OR
|
||||||
|
@ -40,7 +40,7 @@ module mux3 #(parameter WIDTH = 8) (
|
|||||||
input logic [1:0] s,
|
input logic [1:0] s,
|
||||||
output logic [WIDTH-1:0] y);
|
output logic [WIDTH-1:0] y);
|
||||||
|
|
||||||
assign y = s[1] ? d2 : (s[0] ? d1 : d0);
|
assign y = s[1] ? d2 : (s[0] ? d1 : d0); // exclusion-tag: mux3
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
module mux4 #(parameter WIDTH = 8) (
|
module mux4 #(parameter WIDTH = 8) (
|
||||||
|
Loading…
Reference in New Issue
Block a user