From a52a36e19979c4be8dbd773f7f8c5b7061b0c63f Mon Sep 17 00:00:00 2001 From: Karlis Susters Date: Thu, 2 Mar 2023 15:42:37 +0000 Subject: [PATCH] Push config for L1LL I Single window-2 prefetcher --- builds/Resources/Include_RISCY_Config.mk | 2 +- .../RISCY_OOO/coherence/src/Prefetcher.bsv | 30 ++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/builds/Resources/Include_RISCY_Config.mk b/builds/Resources/Include_RISCY_Config.mk index c0be439..ee59540 100644 --- a/builds/Resources/Include_RISCY_Config.mk +++ b/builds/Resources/Include_RISCY_Config.mk @@ -45,7 +45,7 @@ SIM_LLC_ARBITER_LAT ?= # default check cache deadlock and rename error CHECK_DEADLOCK ?= true RENAME_DEBUG ?= false -INSTR_PREFETCHER_LOCATION ?= L1 +INSTR_PREFETCHER_LOCATION ?= L1LL INSTR_PREFETCHER_TYPE ?= SINGLE_WINDOW DATA_PREFETCHER_LOCATION ?= NONE DATA_PREFETCHER_TYPE ?= BLOCK diff --git a/src_Core/RISCY_OOO/coherence/src/Prefetcher.bsv b/src_Core/RISCY_OOO/coherence/src/Prefetcher.bsv index 0adfd70..7966f21 100644 --- a/src_Core/RISCY_OOO/coherence/src/Prefetcher.bsv +++ b/src_Core/RISCY_OOO/coherence/src/Prefetcher.bsv @@ -139,6 +139,34 @@ module mkSingleWindowPrefetcher(Prefetcher); endmethod endmodule +module mkSingleWindowL1LLPrefetcher(Prefetcher); + Integer cacheLinesInRange = 2; + Reg#(LineAddr) rangeEnd <- mkReg(0); //Points to one CLine after end of range + Reg#(LineAddr) nextToAsk <- mkReg(0); + method Action reportAccess(Addr addr, HitOrMiss hitMiss); + let cl = getLineAddr(addr); + if (rangeEnd - fromInteger(cacheLinesInRange) - 1 <= cl && + cl < rangeEnd) begin + + let nextEnd = cl + fromInteger(cacheLinesInRange) + 1; + $display("%t Prefetcher report HIT %h, moving window end to %h", $time, addr, Addr'{nextEnd, '0}); + rangeEnd <= nextEnd; + end + else if (hitMiss == MISS) begin + $display("%t Prefetcher report MISS %h", $time, addr); + //Reset window + nextToAsk <= getLineAddr(addr) + 1; + rangeEnd <= getLineAddr(addr) + fromInteger(cacheLinesInRange) + 1; + end + endmethod + method ActionValue#(Addr) getNextPrefetchAddr if (nextToAsk != rangeEnd); + nextToAsk <= nextToAsk + 1; + let retAddr = Addr'{nextToAsk, '0}; //extend cache line address to regular address + $display("%t Prefetcher getNextPrefetchAddr requesting %h", $time, retAddr); + return retAddr; + endmethod +endmodule + typedef struct { LineAddr rangeEnd; @@ -1326,7 +1354,7 @@ module mkLLIPrefetcherInL1I(Prefetcher); `elsif INSTR_PREFETCHER_NEXT_LINE_ON_MISS let m <- mkNextLineOnMissPrefetcher; `elsif INSTR_PREFETCHER_SINGLE_WINDOW - let m <- mkSingleWindowPrefetcher; + let m <- mkSingleWindowL1LLPrefetcher; `elsif INSTR_PREFETCHER_SINGLE_WINDOW_TARGET let m <- mkBRAMSingleWindowTargetPrefetcher; `elsif INSTR_PREFETCHER_MULTI_WINDOW