From 570e86afc38f4770dd428c5b4140dbb971ab87fd Mon Sep 17 00:00:00 2001 From: Alec Vercruysse Date: Wed, 5 Apr 2023 11:46:28 -0700 Subject: [PATCH] Make CacheWay flush and dirty logic dependent on !READ_ONLY_CACHE To increase coverage. Read-only caches do not have flushes since they do not have dirty bits. --- src/cache/cacheway.sv | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/src/cache/cacheway.sv b/src/cache/cacheway.sv index 32b0a6e82..174b82c59 100644 --- a/src/cache/cacheway.sv +++ b/src/cache/cacheway.sv @@ -74,17 +74,22 @@ module cacheway #(parameter NUMLINES=512, LINELEN = 256, TAGLEN = 26, logic ClearDirtyWay; logic SelNonHit; logic SelData; - logic FlushWayEn, VictimWayEn; - // FlushWay and VictimWay are part of a one hot way selection. Must clear them if FlushWay not selected - // or VictimWay not selected. - assign FlushWayEn = FlushWay & SelFlush; - assign VictimWayEn = VictimWay & SelWriteback; - - assign SelNonHit = FlushWayEn | SetValid | SelWriteback; - - mux2 #(1) seltagmux(VictimWay, FlushWay, SelFlush, SelTag); - + + if (!READ_ONLY_CACHE) begin:flushlogic + logic FlushWayEn; + + mux2 #(1) seltagmux(VictimWay, FlushWay, SelFlush, SelTag); + + // FlushWay is part of a one hot way selection. Must clear it if FlushWay not selected. + assign FlushWayEn = FlushWay & SelFlush; + assign SelNonHit = FlushWayEn | SetValid | SelWriteback; + end + else begin:flushlogic // no flush operation for read-only caches. + assign SelTag = VictimWay; + assign SelNonHit = SetValid; + end + mux2 #(1) selectedwaymux(HitWay, SelTag, SelNonHit , SelData); ///////////////////////////////////////////////////////////////////////////////////////////// @@ -92,11 +97,16 @@ module cacheway #(parameter NUMLINES=512, LINELEN = 256, TAGLEN = 26, ///////////////////////////////////////////////////////////////////////////////////////////// assign SetValidWay = SetValid & SelData; - assign SetDirtyWay = SetDirty & SelData; assign ClearDirtyWay = ClearDirty & SelData; - + if (!READ_ONLY_CACHE) begin + assign SetDirtyWay = SetDirty & SelData; + assign SelectedWriteWordEn = (SetValidWay | SetDirtyWay) & ~FlushStage; + end + else begin + assign SelectedWriteWordEn = SetValidWay & ~FlushStage; + end + // If writing the whole line set all write enables to 1, else only set the correct word. - assign SelectedWriteWordEn = (SetValidWay | SetDirtyWay) & ~FlushStage; assign FinalByteMask = SetValidWay ? '1 : LineByteMask; // OR assign SetValidEN = SetValidWay & ~FlushStage;