diff --git a/pipelined/src/lsu/buscachefsm.sv b/pipelined/src/cache/buscachefsm.sv similarity index 100% rename from pipelined/src/lsu/buscachefsm.sv rename to pipelined/src/cache/buscachefsm.sv diff --git a/pipelined/src/lsu/busdp.sv b/pipelined/src/cache/cachedp.sv similarity index 97% rename from pipelined/src/lsu/busdp.sv rename to pipelined/src/cache/cachedp.sv index 730309484..e61fe2a31 100644 --- a/pipelined/src/lsu/busdp.sv +++ b/pipelined/src/cache/cachedp.sv @@ -1,10 +1,10 @@ /////////////////////////////////////////// -// busdp.sv +// cachedp.sv // // Written: Ross Thompson ross1728@gmail.com January 30, 2022 // Modified: // -// Purpose: Bus data path. +// Purpose: Cache/Bus data path. // Bus Side logic // register the fetch data from the next level of memory. // This register should be necessary for timing. There is no register in the uncore or @@ -34,7 +34,7 @@ `include "wally-config.vh" -module busdp #(parameter WORDSPERLINE, LINELEN, LOGWPL, CACHE_ENABLED) +module cachedp #(parameter WORDSPERLINE, LINELEN, LOGWPL, CACHE_ENABLED) ( input logic clk, reset, diff --git a/pipelined/src/ifu/ifu.sv b/pipelined/src/ifu/ifu.sv index 4577b4206..244b63c63 100644 --- a/pipelined/src/ifu/ifu.sv +++ b/pipelined/src/ifu/ifu.sv @@ -187,37 +187,17 @@ module ifu ( if (`IROM) begin : irom irom irom(.clk, .reset, .Adr(CPUBusy | reset ? PCFSpill : PCNextFSpill), .ReadData(FinalInstrRawF)); - assign {BusStall, IFUBusRead} = '0; - assign {ICacheStallF, ICacheMiss, ICacheAccess} = '0; end if (`BUS) begin : bus localparam integer WORDSPERLINE = `ICACHE ? `ICACHE_LINELENINBITS/`XLEN : 1; - localparam integer LINELEN = `ICACHE ? `ICACHE_LINELENINBITS : `XLEN; localparam integer LOGBWPL = `ICACHE ? $clog2(WORDSPERLINE) : 1; - logic [LINELEN-1:0] FetchBuffer; - logic [`PA_BITS-1:0] ICacheBusAdr; - logic ICacheBusAck; - logic SelUncachedAdr; - - busdp #(WORDSPERLINE, LINELEN, LOGBWPL, `ICACHE) - busdp(.clk, .reset, - .HRDATA(HRDATA), .BusAck(IFUBusAck), .BusInit(IFUBusInit), .BusWrite(), .SelBusWord(), - .BusRead(IFUBusRead), .HSIZE(), .HBURST(IFUHBURST), .HTRANS(IFUHTRANS), .BusTransComplete(IFUTransComplete), - .Funct3(3'b010), .HADDR(IFUHADDR), .CacheBusAdr(ICacheBusAdr), - .WordCount(), - .CacheFetchLine(ICacheFetchLine), - .CacheWriteLine(1'b0), .CacheBusAck(ICacheBusAck), - .FetchBuffer, .PAdr(PCPF), - .SelUncachedAdr, - .IgnoreRequest(ITLBMissF), .RW(2'b10), .CPUBusy, .Cacheable(CacheableF), - .BusStall, .BusCommitted()); - - - mux2 #(32) UnCachedDataMux(.d0(FinalInstrRawF), .d1(FetchBuffer[32-1:0]), - .s(SelUncachedAdr), .y(AllInstrRawF[31:0])); - - if(`ICACHE) begin : icache + localparam integer LINELEN = `ICACHE ? `ICACHE_LINELENINBITS : `XLEN; + logic [LINELEN-1:0] FetchBuffer; + logic [`PA_BITS-1:0] ICacheBusAdr; + logic ICacheBusAck; + logic SelUncachedAdr; + cache #(.LINELEN(`ICACHE_LINELENINBITS), .NUMLINES(`ICACHE_WAYSIZEINBYTES*8/`ICACHE_LINELENINBITS), .NUMWAYS(`ICACHE_NUMWAYS), .LOGBWPL(LOGBWPL), .WORDLEN(32), .MUXINTERVAL(16), .DCACHE(0)) @@ -235,12 +215,39 @@ module ifu ( .NextAdr(PCNextFSpill[11:0]), .PAdr(PCPF), .CacheCommitted(), .InvalidateCache(InvalidateICacheM)); + cachedp #(WORDSPERLINE, LINELEN, LOGBWPL, `ICACHE) + cachedp(.clk, .reset, + .HRDATA(HRDATA), .BusAck(IFUBusAck), .BusInit(IFUBusInit), .BusWrite(), .SelBusWord(), + .BusRead(IFUBusRead), .HSIZE(), .HBURST(IFUHBURST), .HTRANS(IFUHTRANS), .BusTransComplete(IFUTransComplete), + .Funct3(3'b010), .HADDR(IFUHADDR), .CacheBusAdr(ICacheBusAdr), + .WordCount(), + .CacheFetchLine(ICacheFetchLine), + .CacheWriteLine(1'b0), .CacheBusAck(ICacheBusAck), + .FetchBuffer, .PAdr(PCPF), + .SelUncachedAdr, + .IgnoreRequest(ITLBMissF), .RW(2'b10), .CPUBusy, .Cacheable(CacheableF), + .BusStall, .BusCommitted()); + mux2 #(32) UnCachedDataMux(.d0(FinalInstrRawF), .d1(FetchBuffer[32-1:0]), + .s(SelUncachedAdr), .y(AllInstrRawF[31:0])); end else begin : passthrough - assign {ICacheFetchLine, ICacheBusAdr, ICacheStallF, FinalInstrRawF} = '0; - assign ICacheAccess = CacheableF; assign ICacheMiss = CacheableF; + assign IFUHADDR = PCPF; + flopen #(`XLEN) fb(.clk, .en(IFUBusRead), .d(HRDATA), .q(AllInstrRawF[31:0])); + + busfsm #(LOGBWPL) busfsm( + .clk, .reset, .IgnoreRequest(ITLBMissF), .RW(2'b10), + .BusAck(IFUBusAck), .BusInit(IFUBusInit), .CPUBusy, + .BusStall, .BusWrite(), .BusRead(IFUBusRead), + .HTRANS(IFUHTRANS), .BusCommitted()); + + assign IFUHBURST = 3'b0; + assign IFUTransComplete = IFUBusAck; + assign {ICacheFetchLine, ICacheStallF, FinalInstrRawF} = '0; + assign {ICacheMiss, ICacheAccess} = '0; end end else begin : nobus // block: bus + assign {BusStall, IFUBusRead} = '0; + assign {ICacheStallF, ICacheMiss, ICacheAccess} = '0; assign AllInstrRawF = FinalInstrRawF; end diff --git a/pipelined/src/lsu/lsu.sv b/pipelined/src/lsu/lsu.sv index 41b441738..0a2ca212c 100644 --- a/pipelined/src/lsu/lsu.sv +++ b/pipelined/src/lsu/lsu.sv @@ -208,19 +208,18 @@ module lsu ( // There are no peripherals supported. // *** this will have to change to support TIM and bus (DH 8/25/22) end - if (`BUS) begin : bus + if (`BUS) begin : bus localparam integer WORDSPERLINE = `DCACHE ? `DCACHE_LINELENINBITS/`XLEN : 1; - localparam integer LINELEN = `DCACHE ? `DCACHE_LINELENINBITS : `XLEN; localparam integer LOGBWPL = `DCACHE ? $clog2(WORDSPERLINE) : 1; - logic [LINELEN-1:0] FetchBuffer; - logic [`PA_BITS-1:0] DCacheBusAdr; - logic DCacheWriteLine; - logic DCacheFetchLine; - logic [LOGBWPL-1:0] WordCount; - if(`DCACHE) begin : dcache + localparam integer LINELEN = `DCACHE ? `DCACHE_LINELENINBITS : `XLEN; + logic [LINELEN-1:0] FetchBuffer; + logic [`PA_BITS-1:0] DCacheBusAdr; + logic DCacheWriteLine; + logic DCacheFetchLine; + logic [LOGBWPL-1:0] WordCount; logic SelUncachedAdr, DCacheBusAck; - logic SelBusWord; + logic SelBusWord; cache #(.LINELEN(`DCACHE_LINELENINBITS), .NUMLINES(`DCACHE_WAYSIZEINBYTES*8/LINELEN), .NUMWAYS(`DCACHE_NUMWAYS), .LOGBWPL(LOGBWPL), .WORDLEN(`LLEN), .MUXINTERVAL(`XLEN), .DCACHE(1)) dcache( @@ -233,7 +232,7 @@ module lsu ( .CacheBusAdr(DCacheBusAdr), .ReadDataWord(ReadDataWordM), .FetchBuffer, .CacheFetchLine(DCacheFetchLine), .CacheWriteLine(DCacheWriteLine), .CacheBusAck(DCacheBusAck), .InvalidateCache(1'b0)); - busdp #(WORDSPERLINE, LINELEN, LOGBWPL, `DCACHE) busdp( + cachedp #(WORDSPERLINE, LINELEN, LOGBWPL, `DCACHE) cachedp( .clk, .reset, .HRDATA, .BusAck(LSUBusAck), .BusInit(LSUBusInit), .BusWrite(LSUBusWrite), .BusRead(LSUBusRead), .HSIZE(LSUHSIZE), .HBURST(LSUHBURST), .HTRANS(LSUHTRANS), .BusTransComplete(LSUTransComplete), @@ -248,6 +247,9 @@ module lsu ( mux2 #(`XLEN) LSUHWDATAMux(.d0(ReadDataWordM[`XLEN-1:0]), .d1(LSUWriteDataM[`XLEN-1:0]), .s(SelUncachedAdr), .y(LSUHWDATA)); end else begin : passthrough // just needs a register to hold the value from the bus + assign LSUHADDR = LSUPAdrM; + assign LSUHSIZE = LSUFunct3M; + flopen #(`XLEN) fb(.clk, .en(LSUBusRead), .d(HRDATA), .q(ReadDataWordMuxM)); assign LSUHWDATA = LSUWriteDataM[`XLEN-1:0]; @@ -260,7 +262,7 @@ module lsu ( // *** possible bug - ReadDatWordM vs. ReadDataWordMuxW - is byte swapping needed for endian assign LSUHBURST = 3'b0; assign LSUTransComplete = LSUBusAck; - assign {ReadDataWordM, DCacheStallM, DCacheCommittedM, DCacheFetchLine, DCacheWriteLine} = '0; + assign {ReadDataWordM, DCacheStallM, DCacheCommittedM} = '0; assign {DCacheMiss, DCacheAccess} = '0; end end else begin: nobus // block: bus