mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
partial ifu cleanup.
This commit is contained in:
parent
b05abc1795
commit
a04aa283cb
@ -169,36 +169,32 @@ module ifu (
|
|||||||
// Memory
|
// Memory
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
localparam integer WORDSPERLINE = `MEM_ICACHE ? `ICACHE_LINELENINBITS/`XLEN : 1;
|
|
||||||
localparam integer LOGWPL = `MEM_ICACHE ? $clog2(WORDSPERLINE) : 1;
|
|
||||||
localparam integer LINELEN = `MEM_ICACHE ? `ICACHE_LINELENINBITS : `XLEN;
|
|
||||||
localparam integer WordCountThreshold = `MEM_ICACHE ? WORDSPERLINE - 1 : 0;
|
|
||||||
|
|
||||||
localparam integer LINEBYTELEN = LINELEN/8;
|
|
||||||
localparam integer OFFSETLEN = $clog2(LINEBYTELEN);
|
|
||||||
|
|
||||||
logic [LINELEN-1:0] ICacheMemWriteData; /// used outside bus
|
|
||||||
logic ICacheBusAck;
|
|
||||||
logic [`PA_BITS-1:0] LocalIFUBusAdr;
|
|
||||||
logic [`PA_BITS-1:0] ICacheBusAdr;
|
|
||||||
logic SelUncachedAdr; // used outside bus
|
|
||||||
|
|
||||||
if (`MEM_IROM) begin : irom
|
if (`MEM_IROM) begin : irom
|
||||||
|
logic [`XLEN-1:0] AllInstrRawF;
|
||||||
|
dtim irom(.clk, .reset, .CPUBusy, .LSURWM(2'b10), .IEUAdrM(PCPF), .IEUAdrE(PCNextFSpill),
|
||||||
|
.TrapM(1'b0), .FinalWriteDataM(),
|
||||||
|
.ReadDataWordM(AllInstrRawF), .BusStall, .LSUBusWrite(), .LSUBusRead(IFUBusRead),
|
||||||
|
.BusCommittedM(), .ReadDataWordMuxM(), .DCacheStallM(ICacheStallF),
|
||||||
|
.DCacheCommittedM(), .DCacheMiss(ICacheMiss), .DCacheAccess(ICacheAccess));
|
||||||
|
assign InstrRawF = AllInstrRawF[31:0];
|
||||||
|
|
||||||
simpleram #(
|
|
||||||
.BASE(`RAM_BASE), .RANGE(`RAM_RANGE)) ram (
|
|
||||||
.clk,
|
|
||||||
.a(CPUBusy | reset ? PCPF[31:0] : PCNextFSpill[31:0]), // mux is also inside $, have to replay address if CPU is stalled.
|
|
||||||
.we(1'b0),
|
|
||||||
.wd(0), .rd(FinalInstrRawF));
|
|
||||||
assign BusStall = 0;
|
|
||||||
assign IFUBusRead = 0;
|
|
||||||
assign ICacheBusAck = 0;
|
|
||||||
assign SelUncachedAdr = 0;
|
|
||||||
assign IFUBusAdr = 0;
|
|
||||||
assign ICacheStallF = '0;
|
|
||||||
end else begin : bus
|
end else begin : bus
|
||||||
|
localparam integer WORDSPERLINE = `MEM_ICACHE ? `ICACHE_LINELENINBITS/`XLEN : 1;
|
||||||
|
localparam integer LOGWPL = `MEM_ICACHE ? $clog2(WORDSPERLINE) : 1;
|
||||||
|
localparam integer LINELEN = `MEM_ICACHE ? `ICACHE_LINELENINBITS : `XLEN;
|
||||||
|
localparam integer WordCountThreshold = `MEM_ICACHE ? WORDSPERLINE - 1 : 0;
|
||||||
|
|
||||||
|
localparam integer LINEBYTELEN = LINELEN/8;
|
||||||
|
localparam integer OFFSETLEN = $clog2(LINEBYTELEN);
|
||||||
|
|
||||||
logic [LOGWPL-1:0] WordCount;
|
logic [LOGWPL-1:0] WordCount;
|
||||||
|
logic SelUncachedAdr;
|
||||||
|
logic [LINELEN-1:0] ICacheMemWriteData;
|
||||||
|
logic ICacheBusAck;
|
||||||
|
logic [`PA_BITS-1:0] LocalIFUBusAdr;
|
||||||
|
logic [`PA_BITS-1:0] ICacheBusAdr;
|
||||||
|
|
||||||
genvar index;
|
genvar index;
|
||||||
for (index = 0; index < WORDSPERLINE; index++) begin:fetchbuffer
|
for (index = 0; index < WORDSPERLINE; index++) begin:fetchbuffer
|
||||||
@ -208,6 +204,9 @@ module ifu (
|
|||||||
.q(ICacheMemWriteData[(index+1)*`XLEN-1:index*`XLEN]));
|
.q(ICacheMemWriteData[(index+1)*`XLEN-1:index*`XLEN]));
|
||||||
end
|
end
|
||||||
|
|
||||||
|
// select between dcache and direct from the BUS. Always selected if no dcache.
|
||||||
|
// handled in the busfsm.
|
||||||
|
mux2 #(32) UnCachedInstrMux(.d0(FinalInstrRawF[31:0]), .d1(ICacheMemWriteData[31:0]), .s(SelUncachedAdr), .y(InstrRawF));
|
||||||
assign LocalIFUBusAdr = SelUncachedAdr ? PCPF : ICacheBusAdr;
|
assign LocalIFUBusAdr = SelUncachedAdr ? PCPF : ICacheBusAdr;
|
||||||
assign IFUBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalIFUBusAdr;
|
assign IFUBusAdr = ({{`PA_BITS-LOGWPL{1'b0}}, WordCount} << $clog2(`XLEN/8)) + LocalIFUBusAdr;
|
||||||
|
|
||||||
@ -259,9 +258,6 @@ module ifu (
|
|||||||
logic [4:0] InstrClassD, InstrClassE;
|
logic [4:0] InstrClassD, InstrClassE;
|
||||||
|
|
||||||
|
|
||||||
// select between dcache and direct from the BUS. Always selected if no dcache.
|
|
||||||
// handled in the busfsm.
|
|
||||||
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;
|
||||||
|
@ -50,7 +50,7 @@ module dtim(
|
|||||||
|
|
||||||
simpleram #(.BASE(`RAM_BASE), .RANGE(`RAM_RANGE)) ram (
|
simpleram #(.BASE(`RAM_BASE), .RANGE(`RAM_RANGE)) ram (
|
||||||
.clk,
|
.clk,
|
||||||
.a(CPUBusy | LSURWM[0] ? IEUAdrM[31:0] : IEUAdrE[31:0]),
|
.a(CPUBusy | LSURWM[0] | reset ? IEUAdrM[31:0] : IEUAdrE[31:0]),
|
||||||
.we(LSURWM[0] & ~TrapM), // have to ignore write if Trap.
|
.we(LSURWM[0] & ~TrapM), // have to ignore write if Trap.
|
||||||
.wd(FinalWriteDataM), .rd(ReadDataWordM));
|
.wd(FinalWriteDataM), .rd(ReadDataWordM));
|
||||||
|
|
||||||
|
@ -204,7 +204,7 @@ logic [3:0] dummy;
|
|||||||
//`endif
|
//`endif
|
||||||
// if(`MEM_IROM == 1) begin
|
// if(`MEM_IROM == 1) begin
|
||||||
// $display("here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
|
// $display("here!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
|
||||||
$readmemh(memfilename, dut.core.ifu.irom.ram.RAM);
|
$readmemh(memfilename, dut.core.ifu.irom.irom.ram.RAM);
|
||||||
// end
|
// end
|
||||||
ProgramAddrMapFile = {pathname, tests[test], ".elf.objdump.addr"};
|
ProgramAddrMapFile = {pathname, tests[test], ".elf.objdump.addr"};
|
||||||
ProgramLabelMapFile = {pathname, tests[test], ".elf.objdump.lab"};
|
ProgramLabelMapFile = {pathname, tests[test], ".elf.objdump.lab"};
|
||||||
@ -298,7 +298,7 @@ logic [3:0] dummy;
|
|||||||
$readmemh(memfilename, dut.core.ifu.irom.ram.RAM);
|
$readmemh(memfilename, dut.core.ifu.irom.ram.RAM);
|
||||||
`endif
|
`endif
|
||||||
-----/\----- EXCLUDED -----/\----- */
|
-----/\----- EXCLUDED -----/\----- */
|
||||||
$readmemh(memfilename, dut.core.ifu.irom.ram.RAM);
|
$readmemh(memfilename, dut.core.ifu.irom.irom.ram.RAM);
|
||||||
//if(`MEM_IROM == 1) $readmemh(memfilename, dut.core.ifu.irom.ram.RAM);
|
//if(`MEM_IROM == 1) $readmemh(memfilename, dut.core.ifu.irom.ram.RAM);
|
||||||
ProgramAddrMapFile = {pathname, tests[test], ".elf.objdump.addr"};
|
ProgramAddrMapFile = {pathname, tests[test], ".elf.objdump.addr"};
|
||||||
ProgramLabelMapFile = {pathname, tests[test], ".elf.objdump.lab"};
|
ProgramLabelMapFile = {pathname, tests[test], ".elf.objdump.lab"};
|
||||||
|
Loading…
Reference in New Issue
Block a user