mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
LSU and IFU cleanup.
This commit is contained in:
parent
2e00186eea
commit
ac50a36aac
@ -91,7 +91,9 @@ module ifu (
|
|||||||
logic [`XLEN-1:0] PCPlus2or4F, PCLinkD;
|
logic [`XLEN-1:0] PCPlus2or4F, PCLinkD;
|
||||||
logic [`XLEN-3:0] PCPlusUpperF;
|
logic [`XLEN-3:0] PCPlusUpperF;
|
||||||
logic CompressedF;
|
logic CompressedF;
|
||||||
logic [31:0] InstrRawD, FinalInstrRawF, InstrRawF;
|
logic [31:0] InstrRawD, InstrRawF;
|
||||||
|
logic [`XLEN-1:0] FinalInstrRawF;
|
||||||
|
|
||||||
logic [31:0] InstrE;
|
logic [31:0] InstrE;
|
||||||
logic [`XLEN-1:0] PCD;
|
logic [`XLEN-1:0] PCD;
|
||||||
|
|
||||||
@ -162,16 +164,10 @@ module ifu (
|
|||||||
assign PCPF = PCF;
|
assign PCPF = PCF;
|
||||||
assign CacheableF = '1;
|
assign CacheableF = '1;
|
||||||
end
|
end
|
||||||
// conditional
|
|
||||||
// 1. ram // controlled by `MEM_IROM
|
|
||||||
// 2. cache // `MEM_ICACHE
|
|
||||||
// 3. wire pass-through
|
|
||||||
|
|
||||||
// If we have `MEM_IROM we don't have the bus controller
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// otherwise we have the bus controller and either a cache or a passthrough.
|
// Memory
|
||||||
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// *** make this area look like LSU, including moving I$. Hide localparams in submodules when feasible
|
|
||||||
|
|
||||||
localparam integer WORDSPERLINE = `MEM_ICACHE ? `ICACHE_LINELENINBITS/`XLEN : 1;
|
localparam integer WORDSPERLINE = `MEM_ICACHE ? `ICACHE_LINELENINBITS/`XLEN : 1;
|
||||||
localparam integer LOGWPL = `MEM_ICACHE ? $clog2(WORDSPERLINE) : 1;
|
localparam integer LOGWPL = `MEM_ICACHE ? $clog2(WORDSPERLINE) : 1;
|
||||||
@ -181,23 +177,20 @@ module ifu (
|
|||||||
localparam integer LINEBYTELEN = LINELEN/8;
|
localparam integer LINEBYTELEN = LINELEN/8;
|
||||||
localparam integer OFFSETLEN = $clog2(LINEBYTELEN);
|
localparam integer OFFSETLEN = $clog2(LINEBYTELEN);
|
||||||
|
|
||||||
logic [LOGWPL-1:0] WordCount;
|
logic [LINELEN-1:0] ICacheMemWriteData; /// used outside bus
|
||||||
logic [LINELEN-1:0] ICacheMemWriteData;
|
|
||||||
logic ICacheBusAck;
|
logic ICacheBusAck;
|
||||||
logic [`PA_BITS-1:0] LocalIFUBusAdr;
|
logic [`PA_BITS-1:0] LocalIFUBusAdr;
|
||||||
logic [`PA_BITS-1:0] ICacheBusAdr;
|
logic [`PA_BITS-1:0] ICacheBusAdr;
|
||||||
logic SelUncachedAdr;
|
logic SelUncachedAdr; // used outside bus
|
||||||
|
|
||||||
if (`MEM_IROM) begin : irom
|
if (`MEM_IROM) begin : irom
|
||||||
logic [`XLEN-1:0] FinalInstrRawF_FIXME;
|
|
||||||
|
|
||||||
simpleram #(
|
simpleram #(
|
||||||
.BASE(`RAM_BASE), .RANGE(`RAM_RANGE)) ram (
|
.BASE(`RAM_BASE), .RANGE(`RAM_RANGE)) ram (
|
||||||
.clk,
|
.clk,
|
||||||
.a(CPUBusy | reset ? PCPF[31:0] : PCNextFSpill[31:0]), // mux is also inside $, have to replay address if CPU is stalled.
|
.a(CPUBusy | reset ? PCPF[31:0] : PCNextFSpill[31:0]), // mux is also inside $, have to replay address if CPU is stalled.
|
||||||
.we(1'b0),
|
.we(1'b0),
|
||||||
.wd(0), .rd(FinalInstrRawF_FIXME));
|
.wd(0), .rd(FinalInstrRawF));
|
||||||
assign FinalInstrRawF = FinalInstrRawF_FIXME[31:0];
|
|
||||||
assign BusStall = 0;
|
assign BusStall = 0;
|
||||||
assign IFUBusRead = 0;
|
assign IFUBusRead = 0;
|
||||||
assign ICacheBusAck = 0;
|
assign ICacheBusAck = 0;
|
||||||
@ -205,36 +198,36 @@ module ifu (
|
|||||||
assign IFUBusAdr = 0;
|
assign IFUBusAdr = 0;
|
||||||
assign ICacheStallF = '0;
|
assign ICacheStallF = '0;
|
||||||
end else begin : bus
|
end else begin : bus
|
||||||
genvar index;
|
logic [LOGWPL-1:0] WordCount;
|
||||||
for (index = 0; index < WORDSPERLINE; index++) begin:fetchbuffer
|
|
||||||
flopen #(`XLEN) fb(.clk(clk),
|
|
||||||
.en(IFUBusAck & IFUBusRead & (index == WordCount)),
|
|
||||||
.d(IFUBusHRDATA),
|
|
||||||
.q(ICacheMemWriteData[(index+1)*`XLEN-1:index*`XLEN]));
|
|
||||||
end
|
|
||||||
|
|
||||||
assign LocalIFUBusAdr = SelUncachedAdr ? PCPF : ICacheBusAdr;
|
genvar index;
|
||||||
assign IFUBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalIFUBusAdr;
|
for (index = 0; index < WORDSPERLINE; index++) begin:fetchbuffer
|
||||||
|
flopen #(`XLEN) fb(.clk(clk),
|
||||||
|
.en(IFUBusAck & IFUBusRead & (index == WordCount)),
|
||||||
|
.d(IFUBusHRDATA),
|
||||||
|
.q(ICacheMemWriteData[(index+1)*`XLEN-1:index*`XLEN]));
|
||||||
|
end
|
||||||
|
|
||||||
busfsm #(WordCountThreshold, LOGWPL, `MEM_ICACHE)
|
assign LocalIFUBusAdr = SelUncachedAdr ? PCPF : ICacheBusAdr;
|
||||||
busfsm(.clk, .reset, .IgnoreRequest(ITLBMissF),
|
assign IFUBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalIFUBusAdr;
|
||||||
.LSURWM(2'b10), .DCacheFetchLine(ICacheFetchLine), .DCacheWriteLine(1'b0),
|
|
||||||
.LSUBusAck(IFUBusAck),
|
busfsm #(WordCountThreshold, LOGWPL, `MEM_ICACHE)
|
||||||
.CPUBusy, .CacheableM(CacheableF),
|
busfsm(.clk, .reset, .IgnoreRequest(ITLBMissF),
|
||||||
.BusStall, .LSUBusWrite(), .LSUBusRead(IFUBusRead), .DCacheBusAck(ICacheBusAck),
|
.LSURWM(2'b10), .DCacheFetchLine(ICacheFetchLine), .DCacheWriteLine(1'b0),
|
||||||
.BusCommittedM(), .SelUncachedAdr(SelUncachedAdr), .WordCount);
|
.LSUBusAck(IFUBusAck),
|
||||||
|
.CPUBusy, .CacheableM(CacheableF),
|
||||||
|
.BusStall, .LSUBusWrite(), .LSUBusRead(IFUBusRead), .DCacheBusAck(ICacheBusAck),
|
||||||
|
.BusCommittedM(), .SelUncachedAdr(SelUncachedAdr), .WordCount);
|
||||||
|
|
||||||
if(`MEM_ICACHE) begin : icache
|
if(`MEM_ICACHE) begin : icache
|
||||||
logic [1:0] IFURWF;
|
logic [1:0] IFURWF;
|
||||||
assign IFURWF = CacheableF ? 2'b10 : 2'b00;
|
assign IFURWF = CacheableF ? 2'b10 : 2'b00;
|
||||||
|
|
||||||
logic [`XLEN-1:0] FinalInstrRawF_FIXME;
|
|
||||||
|
|
||||||
cache #(.LINELEN(`ICACHE_LINELENINBITS),
|
cache #(.LINELEN(`ICACHE_LINELENINBITS),
|
||||||
.NUMLINES(`ICACHE_WAYSIZEINBYTES*8/`ICACHE_LINELENINBITS),
|
.NUMLINES(`ICACHE_WAYSIZEINBYTES*8/`ICACHE_LINELENINBITS),
|
||||||
.NUMWAYS(`ICACHE_NUMWAYS), .DCACHE(0))
|
.NUMWAYS(`ICACHE_NUMWAYS), .DCACHE(0))
|
||||||
icache(.clk, .reset, .CPUBusy, .IgnoreRequest(ITLBMissF), .CacheMemWriteData(ICacheMemWriteData) , .CacheBusAck(ICacheBusAck),
|
icache(.clk, .reset, .CPUBusy, .IgnoreRequest(ITLBMissF), .CacheMemWriteData(ICacheMemWriteData) , .CacheBusAck(ICacheBusAck),
|
||||||
.CacheBusAdr(ICacheBusAdr), .CacheStall(ICacheStallF), .ReadDataWord(FinalInstrRawF_FIXME),
|
.CacheBusAdr(ICacheBusAdr), .CacheStall(ICacheStallF), .ReadDataWord(FinalInstrRawF),
|
||||||
.CacheFetchLine(ICacheFetchLine),
|
.CacheFetchLine(ICacheFetchLine),
|
||||||
.CacheWriteLine(),
|
.CacheWriteLine(),
|
||||||
.ReadDataLineSets(),
|
.ReadDataLineSets(),
|
||||||
@ -249,7 +242,6 @@ module ifu (
|
|||||||
.CacheCommitted(),
|
.CacheCommitted(),
|
||||||
.InvalidateCacheM(InvalidateICacheM));
|
.InvalidateCacheM(InvalidateICacheM));
|
||||||
|
|
||||||
assign FinalInstrRawF = FinalInstrRawF_FIXME[31:0];
|
|
||||||
end else begin : passthrough
|
end else begin : passthrough
|
||||||
assign ICacheFetchLine = '0;
|
assign ICacheFetchLine = '0;
|
||||||
assign ICacheBusAdr = '0;
|
assign ICacheBusAdr = '0;
|
||||||
@ -258,8 +250,6 @@ module ifu (
|
|||||||
assign ICacheAccess = CacheableF;
|
assign ICacheAccess = CacheableF;
|
||||||
assign ICacheMiss = CacheableF;
|
assign ICacheMiss = CacheableF;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -271,7 +261,7 @@ module ifu (
|
|||||||
|
|
||||||
// select between dcache and direct from the BUS. Always selected if no dcache.
|
// select between dcache and direct from the BUS. Always selected if no dcache.
|
||||||
// handled in the busfsm.
|
// handled in the busfsm.
|
||||||
mux2 #(32) UnCachedInstrMux(.d0(FinalInstrRawF), .d1(ICacheMemWriteData[31:0]), .s(SelUncachedAdr), .y(InstrRawF));
|
mux2 #(32) UnCachedInstrMux(.d0(FinalInstrRawF[31:0]), .d1(ICacheMemWriteData[31:0]), .s(SelUncachedAdr), .y(InstrRawF));
|
||||||
|
|
||||||
assign IFUCacheBusStallF = ICacheStallF | BusStall;
|
assign IFUCacheBusStallF = ICacheStallF | BusStall;
|
||||||
assign IFUStallF = IFUCacheBusStallF | SelNextSpillF;
|
assign IFUStallF = IFUCacheBusStallF | SelNextSpillF;
|
||||||
|
@ -270,13 +270,13 @@ module lsu (
|
|||||||
|
|
||||||
assign LocalLSUBusAdr = SelUncachedAdr ? LSUPAdrM : DCacheBusAdr ;
|
assign LocalLSUBusAdr = SelUncachedAdr ? LSUPAdrM : DCacheBusAdr ;
|
||||||
assign LSUBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalLSUBusAdr;
|
assign LSUBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalLSUBusAdr;
|
||||||
assign PreLSUBusHWDATA = ReadDataLineSetsM[WordCount];
|
assign PreLSUBusHWDATA = ReadDataLineSetsM[WordCount]; // only in lsu, not ifu
|
||||||
// exclude the subword write for uncached. We don't read the data first so we cannot
|
// exclude the subword write for uncached. We don't read the data first so we cannot
|
||||||
// select the subword by masking. Subword write also exists inside the uncore to
|
// select the subword by masking. Subword write also exists inside the uncore to
|
||||||
// suport subword masking for i/o. I'm not sure if this is necessary.
|
// suport subword masking for i/o. I'm not sure if this is necessary.
|
||||||
assign LSUBusHWDATA = SelUncachedAdr ? FinalAMOWriteDataM : PreLSUBusHWDATA;
|
assign LSUBusHWDATA = SelUncachedAdr ? FinalAMOWriteDataM : PreLSUBusHWDATA; // only in lsu, not ifu
|
||||||
|
|
||||||
assign LSUBusSize = SelUncachedAdr ? LSUFunct3M : (`XLEN == 32 ? 3'b010 : 3'b011);
|
assign LSUBusSize = SelUncachedAdr ? LSUFunct3M : (`XLEN == 32 ? 3'b010 : 3'b011); // ifu: always the XLEN value.
|
||||||
|
|
||||||
// select between dcache and direct from the BUS. Always selected if no dcache.
|
// select between dcache and direct from the BUS. Always selected if no dcache.
|
||||||
mux2 #(`XLEN) UnCachedDataMux(.d0(ReadDataWordM),
|
mux2 #(`XLEN) UnCachedDataMux(.d0(ReadDataWordM),
|
||||||
|
Loading…
Reference in New Issue
Block a user