From 90a178e31e8c840e8a5450b79a3c99f2815c1644 Mon Sep 17 00:00:00 2001 From: David Harris Date: Mon, 30 Oct 2023 19:13:43 -0700 Subject: [PATCH] Made 2-bit AdrReg conditional on being needed --- src/ifu/irom.sv | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/ifu/irom.sv b/src/ifu/irom.sv index 1339c26fa..0d4286e43 100644 --- a/src/ifu/irom.sv +++ b/src/ifu/irom.sv @@ -37,17 +37,21 @@ module irom import cvw::*; #(parameter cvw_t P) ( logic [P.XLEN-1:0] IROMInstrFFull; logic [31:0] RawIROMInstrF; - logic [1:0] AdrD; - flopen #(2) AdrReg(clk, ce, Adr[2:1], AdrD); + logic [2:1] AdrD; rom1p1r #(ADDR_WDITH, P.XLEN) rom(.clk, .ce, .addr(Adr[ADDR_WDITH+OFFSET-1:OFFSET]), .dout(IROMInstrFFull)); if (P.XLEN == 32) assign RawIROMInstrF = IROMInstrFFull; else begin // IROM is aligned to XLEN words, but instructions are 32 bits. Select between the two // haves. Adr is the Next PCF not PCF so we delay 1 cycle. - assign RawIROMInstrF = AdrD[1] ? IROMInstrFFull[63:32] : IROMInstrFFull[31:0]; + flopen #(1) AdrReg2(clk, ce, Adr[2], AdrD[2]); + assign RawIROMInstrF = AdrD[2] ? IROMInstrFFull[63:32] : IROMInstrFFull[31:0]; end // If the memory addres is aligned to 2 bytes return the upper 2 bytes in the lower 2 bytes. // The spill logic will handle merging the two together. - assign IROMInstrF = AdrD[0] ? {16'b0, RawIROMInstrF[31:16]} : RawIROMInstrF; + if (P.COMPRESSED_SUPPORTED) begin + flopen #(1) AdrReg1(clk, ce, Adr[1], AdrD[1]); + assign IROMInstrF = AdrD[1] ? {16'b0, RawIROMInstrF[31:16]} : RawIROMInstrF; + end else + assign IROMInstrF = RawIROMInstrF; endmodule