mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Fixed rv32e LSU and IFU issues
This commit is contained in:
parent
671ea60f3e
commit
5f37e16b62
@ -1,10 +1,10 @@
|
|||||||
///////////////////////////////////////////
|
///////////////////////////////////////////
|
||||||
// busdp.sv
|
// cachedp.sv
|
||||||
//
|
//
|
||||||
// Written: Ross Thompson ross1728@gmail.com January 30, 2022
|
// Written: Ross Thompson ross1728@gmail.com January 30, 2022
|
||||||
// Modified:
|
// Modified:
|
||||||
//
|
//
|
||||||
// Purpose: Bus data path.
|
// Purpose: Cache/Bus data path.
|
||||||
// Bus Side logic
|
// Bus Side logic
|
||||||
// register the fetch data from the next level of memory.
|
// 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
|
// This register should be necessary for timing. There is no register in the uncore or
|
||||||
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
`include "wally-config.vh"
|
`include "wally-config.vh"
|
||||||
|
|
||||||
module busdp #(parameter WORDSPERLINE, LINELEN, LOGWPL, CACHE_ENABLED)
|
module cachedp #(parameter WORDSPERLINE, LINELEN, LOGWPL, CACHE_ENABLED)
|
||||||
(
|
(
|
||||||
input logic clk, reset,
|
input logic clk, reset,
|
||||||
|
|
@ -187,37 +187,17 @@ module ifu (
|
|||||||
if (`IROM) begin : irom
|
if (`IROM) begin : irom
|
||||||
irom irom(.clk, .reset, .Adr(CPUBusy | reset ? PCFSpill : PCNextFSpill), .ReadData(FinalInstrRawF));
|
irom irom(.clk, .reset, .Adr(CPUBusy | reset ? PCFSpill : PCNextFSpill), .ReadData(FinalInstrRawF));
|
||||||
|
|
||||||
assign {BusStall, IFUBusRead} = '0;
|
|
||||||
assign {ICacheStallF, ICacheMiss, ICacheAccess} = '0;
|
|
||||||
end
|
end
|
||||||
if (`BUS) begin : bus
|
if (`BUS) begin : bus
|
||||||
localparam integer WORDSPERLINE = `ICACHE ? `ICACHE_LINELENINBITS/`XLEN : 1;
|
localparam integer WORDSPERLINE = `ICACHE ? `ICACHE_LINELENINBITS/`XLEN : 1;
|
||||||
localparam integer LINELEN = `ICACHE ? `ICACHE_LINELENINBITS : `XLEN;
|
|
||||||
localparam integer LOGBWPL = `ICACHE ? $clog2(WORDSPERLINE) : 1;
|
localparam integer LOGBWPL = `ICACHE ? $clog2(WORDSPERLINE) : 1;
|
||||||
|
if(`ICACHE) begin : icache
|
||||||
|
localparam integer LINELEN = `ICACHE ? `ICACHE_LINELENINBITS : `XLEN;
|
||||||
logic [LINELEN-1:0] FetchBuffer;
|
logic [LINELEN-1:0] FetchBuffer;
|
||||||
logic [`PA_BITS-1:0] ICacheBusAdr;
|
logic [`PA_BITS-1:0] ICacheBusAdr;
|
||||||
logic ICacheBusAck;
|
logic ICacheBusAck;
|
||||||
logic SelUncachedAdr;
|
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
|
|
||||||
cache #(.LINELEN(`ICACHE_LINELENINBITS),
|
cache #(.LINELEN(`ICACHE_LINELENINBITS),
|
||||||
.NUMLINES(`ICACHE_WAYSIZEINBYTES*8/`ICACHE_LINELENINBITS),
|
.NUMLINES(`ICACHE_WAYSIZEINBYTES*8/`ICACHE_LINELENINBITS),
|
||||||
.NUMWAYS(`ICACHE_NUMWAYS), .LOGBWPL(LOGBWPL), .WORDLEN(32), .MUXINTERVAL(16), .DCACHE(0))
|
.NUMWAYS(`ICACHE_NUMWAYS), .LOGBWPL(LOGBWPL), .WORDLEN(32), .MUXINTERVAL(16), .DCACHE(0))
|
||||||
@ -235,12 +215,39 @@ module ifu (
|
|||||||
.NextAdr(PCNextFSpill[11:0]),
|
.NextAdr(PCNextFSpill[11:0]),
|
||||||
.PAdr(PCPF),
|
.PAdr(PCPF),
|
||||||
.CacheCommitted(), .InvalidateCache(InvalidateICacheM));
|
.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
|
end else begin : passthrough
|
||||||
assign {ICacheFetchLine, ICacheBusAdr, ICacheStallF, FinalInstrRawF} = '0;
|
assign IFUHADDR = PCPF;
|
||||||
assign ICacheAccess = CacheableF; assign ICacheMiss = CacheableF;
|
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
|
||||||
end else begin : nobus // block: bus
|
end else begin : nobus // block: bus
|
||||||
|
assign {BusStall, IFUBusRead} = '0;
|
||||||
|
assign {ICacheStallF, ICacheMiss, ICacheAccess} = '0;
|
||||||
assign AllInstrRawF = FinalInstrRawF;
|
assign AllInstrRawF = FinalInstrRawF;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -210,15 +210,14 @@ module lsu (
|
|||||||
end
|
end
|
||||||
if (`BUS) begin : bus
|
if (`BUS) begin : bus
|
||||||
localparam integer WORDSPERLINE = `DCACHE ? `DCACHE_LINELENINBITS/`XLEN : 1;
|
localparam integer WORDSPERLINE = `DCACHE ? `DCACHE_LINELENINBITS/`XLEN : 1;
|
||||||
localparam integer LINELEN = `DCACHE ? `DCACHE_LINELENINBITS : `XLEN;
|
|
||||||
localparam integer LOGBWPL = `DCACHE ? $clog2(WORDSPERLINE) : 1;
|
localparam integer LOGBWPL = `DCACHE ? $clog2(WORDSPERLINE) : 1;
|
||||||
|
if(`DCACHE) begin : dcache
|
||||||
|
localparam integer LINELEN = `DCACHE ? `DCACHE_LINELENINBITS : `XLEN;
|
||||||
logic [LINELEN-1:0] FetchBuffer;
|
logic [LINELEN-1:0] FetchBuffer;
|
||||||
logic [`PA_BITS-1:0] DCacheBusAdr;
|
logic [`PA_BITS-1:0] DCacheBusAdr;
|
||||||
logic DCacheWriteLine;
|
logic DCacheWriteLine;
|
||||||
logic DCacheFetchLine;
|
logic DCacheFetchLine;
|
||||||
logic [LOGBWPL-1:0] WordCount;
|
logic [LOGBWPL-1:0] WordCount;
|
||||||
|
|
||||||
if(`DCACHE) begin : dcache
|
|
||||||
logic SelUncachedAdr, DCacheBusAck;
|
logic SelUncachedAdr, DCacheBusAck;
|
||||||
logic SelBusWord;
|
logic SelBusWord;
|
||||||
|
|
||||||
@ -233,7 +232,7 @@ module lsu (
|
|||||||
.CacheBusAdr(DCacheBusAdr), .ReadDataWord(ReadDataWordM),
|
.CacheBusAdr(DCacheBusAdr), .ReadDataWord(ReadDataWordM),
|
||||||
.FetchBuffer, .CacheFetchLine(DCacheFetchLine),
|
.FetchBuffer, .CacheFetchLine(DCacheFetchLine),
|
||||||
.CacheWriteLine(DCacheWriteLine), .CacheBusAck(DCacheBusAck), .InvalidateCache(1'b0));
|
.CacheWriteLine(DCacheWriteLine), .CacheBusAck(DCacheBusAck), .InvalidateCache(1'b0));
|
||||||
busdp #(WORDSPERLINE, LINELEN, LOGBWPL, `DCACHE) busdp(
|
cachedp #(WORDSPERLINE, LINELEN, LOGBWPL, `DCACHE) cachedp(
|
||||||
.clk, .reset,
|
.clk, .reset,
|
||||||
.HRDATA, .BusAck(LSUBusAck), .BusInit(LSUBusInit), .BusWrite(LSUBusWrite),
|
.HRDATA, .BusAck(LSUBusAck), .BusInit(LSUBusInit), .BusWrite(LSUBusWrite),
|
||||||
.BusRead(LSUBusRead), .HSIZE(LSUHSIZE), .HBURST(LSUHBURST), .HTRANS(LSUHTRANS), .BusTransComplete(LSUTransComplete),
|
.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]),
|
mux2 #(`XLEN) LSUHWDATAMux(.d0(ReadDataWordM[`XLEN-1:0]), .d1(LSUWriteDataM[`XLEN-1:0]),
|
||||||
.s(SelUncachedAdr), .y(LSUHWDATA));
|
.s(SelUncachedAdr), .y(LSUHWDATA));
|
||||||
end else begin : passthrough // just needs a register to hold the value from the bus
|
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));
|
flopen #(`XLEN) fb(.clk, .en(LSUBusRead), .d(HRDATA), .q(ReadDataWordMuxM));
|
||||||
assign LSUHWDATA = LSUWriteDataM[`XLEN-1:0];
|
assign LSUHWDATA = LSUWriteDataM[`XLEN-1:0];
|
||||||
|
|
||||||
@ -260,7 +262,7 @@ module lsu (
|
|||||||
// *** possible bug - ReadDatWordM vs. ReadDataWordMuxW - is byte swapping needed for endian
|
// *** possible bug - ReadDatWordM vs. ReadDataWordMuxW - is byte swapping needed for endian
|
||||||
assign LSUHBURST = 3'b0;
|
assign LSUHBURST = 3'b0;
|
||||||
assign LSUTransComplete = LSUBusAck;
|
assign LSUTransComplete = LSUBusAck;
|
||||||
assign {ReadDataWordM, DCacheStallM, DCacheCommittedM, DCacheFetchLine, DCacheWriteLine} = '0;
|
assign {ReadDataWordM, DCacheStallM, DCacheCommittedM} = '0;
|
||||||
assign {DCacheMiss, DCacheAccess} = '0;
|
assign {DCacheMiss, DCacheAccess} = '0;
|
||||||
end
|
end
|
||||||
end else begin: nobus // block: bus
|
end else begin: nobus // block: bus
|
||||||
|
Loading…
Reference in New Issue
Block a user