mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Minor busdp cleanup.
This commit is contained in:
parent
59a2c09c5e
commit
6a52f95cc8
@ -83,8 +83,8 @@ module ifu (
|
|||||||
output logic ICacheAccess,
|
output logic ICacheAccess,
|
||||||
output logic ICacheMiss
|
output logic ICacheMiss
|
||||||
);
|
);
|
||||||
|
localparam CACHE_ENABLED = `IMEM == `MEM_CACHE;
|
||||||
(* mark_debug = "true" *) logic [`XLEN-1:0] PCCorrectE, UnalignedPCNextF, PCNextF;
|
(* mark_debug = "true" *) logic [`XLEN-1:0] PCCorrectE, UnalignedPCNextF, PCNextF;
|
||||||
logic BranchMisalignedFaultE;
|
logic BranchMisalignedFaultE;
|
||||||
logic PrivilegedChangePCM;
|
logic PrivilegedChangePCM;
|
||||||
logic IllegalCompInstrD;
|
logic IllegalCompInstrD;
|
||||||
@ -182,8 +182,8 @@ module ifu (
|
|||||||
.DCacheCommittedM(), .DCacheMiss(ICacheMiss), .DCacheAccess(ICacheAccess));
|
.DCacheCommittedM(), .DCacheMiss(ICacheMiss), .DCacheAccess(ICacheAccess));
|
||||||
|
|
||||||
end else begin : bus
|
end else begin : bus
|
||||||
localparam integer WORDSPERLINE = (`IMEM == `MEM_CACHE) ? `ICACHE_LINELENINBITS/`XLEN : 1;
|
localparam integer WORDSPERLINE = (CACHE_ENABLED) ? `ICACHE_LINELENINBITS/`XLEN : 1;
|
||||||
localparam integer LINELEN = (`IMEM == `MEM_CACHE) ? `ICACHE_LINELENINBITS : `XLEN;
|
localparam integer LINELEN = (CACHE_ENABLED) ? `ICACHE_LINELENINBITS : `XLEN;
|
||||||
localparam integer LOGWPL = (`DMEM == `MEM_CACHE) ? $clog2(WORDSPERLINE) : 1;
|
localparam integer LOGWPL = (`DMEM == `MEM_CACHE) ? $clog2(WORDSPERLINE) : 1;
|
||||||
logic [LINELEN-1:0] ReadDataLine;
|
logic [LINELEN-1:0] ReadDataLine;
|
||||||
logic [LINELEN-1:0] ICacheBusWriteData;
|
logic [LINELEN-1:0] ICacheBusWriteData;
|
||||||
@ -193,7 +193,7 @@ module ifu (
|
|||||||
logic [31:0] temp;
|
logic [31:0] temp;
|
||||||
logic SelUncachedAdr;
|
logic SelUncachedAdr;
|
||||||
|
|
||||||
busdp #(WORDSPERLINE, LINELEN, LOGWPL)
|
busdp #(WORDSPERLINE, LINELEN, LOGWPL, CACHE_ENABLED)
|
||||||
busdp(.clk, .reset,
|
busdp(.clk, .reset,
|
||||||
.LSUBusHRDATA(IFUBusHRDATA), .LSUBusAck(IFUBusAck), .LSUBusWrite(), .LSUBusWriteCrit(),
|
.LSUBusHRDATA(IFUBusHRDATA), .LSUBusAck(IFUBusAck), .LSUBusWrite(), .LSUBusWriteCrit(),
|
||||||
.LSUBusRead(IFUBusRead), .LSUBusSize(),
|
.LSUBusRead(IFUBusRead), .LSUBusSize(),
|
||||||
@ -210,7 +210,7 @@ module ifu (
|
|||||||
.s(SelUncachedAdr), .y(AllInstrRawF[31:0]));
|
.s(SelUncachedAdr), .y(AllInstrRawF[31:0]));
|
||||||
|
|
||||||
|
|
||||||
if(`IMEM == `MEM_CACHE) begin : icache
|
if(CACHE_ENABLED) begin : icache
|
||||||
logic [1:0] IFURWF;
|
logic [1:0] IFURWF;
|
||||||
assign IFURWF = CacheableF ? 2'b10 : 2'b00;
|
assign IFURWF = CacheableF ? 2'b10 : 2'b00;
|
||||||
|
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
`include "wally-config.vh"
|
`include "wally-config.vh"
|
||||||
|
|
||||||
module busdp #(parameter WORDSPERLINE, LINELEN, LOGWPL, LSU=0)
|
module busdp #(parameter WORDSPERLINE, LINELEN, LOGWPL, CACHE_ENABLED)
|
||||||
(
|
(
|
||||||
input logic clk, reset,
|
input logic clk, reset,
|
||||||
// bus interface
|
// bus interface
|
||||||
@ -66,7 +66,7 @@ module busdp #(parameter WORDSPERLINE, LINELEN, LOGWPL, LSU=0)
|
|||||||
output logic BusCommittedM);
|
output logic BusCommittedM);
|
||||||
|
|
||||||
|
|
||||||
localparam integer WordCountThreshold = (`DMEM == `MEM_CACHE) ? WORDSPERLINE - 1 : 0;
|
localparam integer WordCountThreshold = CACHE_ENABLED ? WORDSPERLINE - 1 : 0;
|
||||||
|
|
||||||
logic [`PA_BITS-1:0] LocalLSUBusAdr;
|
logic [`PA_BITS-1:0] LocalLSUBusAdr;
|
||||||
genvar index;
|
genvar index;
|
||||||
@ -80,7 +80,7 @@ module busdp #(parameter WORDSPERLINE, LINELEN, LOGWPL, LSU=0)
|
|||||||
mux2 #(3) lsubussizemux(.d0(`XLEN == 32 ? 3'b010 : 3'b011), .d1(LSUFunct3M),
|
mux2 #(3) lsubussizemux(.d0(`XLEN == 32 ? 3'b010 : 3'b011), .d1(LSUFunct3M),
|
||||||
.s(SelUncachedAdr), .y(LSUBusSize));
|
.s(SelUncachedAdr), .y(LSUBusSize));
|
||||||
|
|
||||||
busfsm #(WordCountThreshold, LOGWPL, (`DMEM == `MEM_CACHE)) // *** cleanup Icache? must fix.
|
busfsm #(WordCountThreshold, LOGWPL, CACHE_ENABLED)
|
||||||
busfsm(.clk, .reset, .IgnoreRequest, .LSURWM, .DCacheFetchLine, .DCacheWriteLine,
|
busfsm(.clk, .reset, .IgnoreRequest, .LSURWM, .DCacheFetchLine, .DCacheWriteLine,
|
||||||
.LSUBusAck, .CPUBusy, .CacheableM, .BusStall, .LSUBusWrite, .LSUBusWriteCrit, .LSUBusRead,
|
.LSUBusAck, .CPUBusy, .CacheableM, .BusStall, .LSUBusWrite, .LSUBusWriteCrit, .LSUBusRead,
|
||||||
.DCacheBusAck, .BusCommittedM, .SelUncachedAdr, .WordCount);
|
.DCacheBusAck, .BusCommittedM, .SelUncachedAdr, .WordCount);
|
||||||
|
@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
|
|
||||||
module busfsm #(parameter integer WordCountThreshold,
|
module busfsm #(parameter integer WordCountThreshold,
|
||||||
parameter integer LOGWPL, parameter logic CacheEnabled )
|
parameter integer LOGWPL, parameter logic CACHE_ENABLED )
|
||||||
(input logic clk,
|
(input logic clk,
|
||||||
input logic reset,
|
input logic reset,
|
||||||
|
|
||||||
@ -88,7 +88,7 @@ module busfsm #(parameter integer WordCountThreshold,
|
|||||||
assign WordCountFlag = (WordCount == WordCountThreshold[LOGWPL-1:0]);
|
assign WordCountFlag = (WordCount == WordCountThreshold[LOGWPL-1:0]);
|
||||||
assign CntEn = PreCntEn & LSUBusAck;
|
assign CntEn = PreCntEn & LSUBusAck;
|
||||||
|
|
||||||
assign UnCachedAccess = ~CacheEnabled | ~CacheableM;
|
assign UnCachedAccess = ~CACHE_ENABLED | ~CacheableM;
|
||||||
|
|
||||||
always_ff @(posedge clk)
|
always_ff @(posedge clk)
|
||||||
if (reset) BusCurrState <= #1 STATE_BUS_READY;
|
if (reset) BusCurrState <= #1 STATE_BUS_READY;
|
||||||
@ -97,8 +97,8 @@ module busfsm #(parameter integer WordCountThreshold,
|
|||||||
always_comb begin
|
always_comb begin
|
||||||
case(BusCurrState)
|
case(BusCurrState)
|
||||||
STATE_BUS_READY: if(IgnoreRequest) BusNextState = STATE_BUS_READY;
|
STATE_BUS_READY: if(IgnoreRequest) BusNextState = STATE_BUS_READY;
|
||||||
else if(LSURWM[0] & (UnCachedAccess)) BusNextState = STATE_BUS_UNCACHED_WRITE;
|
else if(LSURWM[0] & UnCachedAccess) BusNextState = STATE_BUS_UNCACHED_WRITE;
|
||||||
else if(LSURWM[1] & (UnCachedAccess)) BusNextState = STATE_BUS_UNCACHED_READ;
|
else if(LSURWM[1] & UnCachedAccess) BusNextState = STATE_BUS_UNCACHED_READ;
|
||||||
else if(DCacheFetchLine) BusNextState = STATE_BUS_FETCH;
|
else if(DCacheFetchLine) BusNextState = STATE_BUS_FETCH;
|
||||||
else if(DCacheWriteLine) BusNextState = STATE_BUS_WRITE;
|
else if(DCacheWriteLine) BusNextState = STATE_BUS_WRITE;
|
||||||
else BusNextState = STATE_BUS_READY;
|
else BusNextState = STATE_BUS_READY;
|
||||||
@ -128,14 +128,14 @@ module busfsm #(parameter integer WordCountThreshold,
|
|||||||
(BusCurrState == STATE_BUS_FETCH) |
|
(BusCurrState == STATE_BUS_FETCH) |
|
||||||
(BusCurrState == STATE_BUS_WRITE);
|
(BusCurrState == STATE_BUS_WRITE);
|
||||||
assign PreCntEn = BusCurrState == STATE_BUS_FETCH | BusCurrState == STATE_BUS_WRITE;
|
assign PreCntEn = BusCurrState == STATE_BUS_FETCH | BusCurrState == STATE_BUS_WRITE;
|
||||||
assign UnCachedLSUBusWrite = (BusCurrState == STATE_BUS_READY & UnCachedAccess & (LSURWM[0] & ~IgnoreRequest)) |
|
assign UnCachedLSUBusWrite = (BusCurrState == STATE_BUS_READY & UnCachedAccess & LSURWM[0] & ~IgnoreRequest) |
|
||||||
(BusCurrState == STATE_BUS_UNCACHED_WRITE);
|
(BusCurrState == STATE_BUS_UNCACHED_WRITE);
|
||||||
assign LSUBusWrite = UnCachedLSUBusWrite | (BusCurrState == STATE_BUS_WRITE);
|
assign LSUBusWrite = UnCachedLSUBusWrite | (BusCurrState == STATE_BUS_WRITE);
|
||||||
assign LSUBusWriteCrit = (BusCurrState == STATE_BUS_READY & UnCachedAccess & (LSURWM[0])) |
|
assign LSUBusWriteCrit = (BusCurrState == STATE_BUS_READY & UnCachedAccess & LSURWM[0]) |
|
||||||
(BusCurrState == STATE_BUS_UNCACHED_WRITE) |
|
(BusCurrState == STATE_BUS_UNCACHED_WRITE) |
|
||||||
(BusCurrState == STATE_BUS_WRITE);
|
(BusCurrState == STATE_BUS_WRITE);
|
||||||
|
|
||||||
assign UnCachedLSUBusRead = (BusCurrState == STATE_BUS_READY & UnCachedAccess & (|LSURWM[1] & IgnoreRequest)) |
|
assign UnCachedLSUBusRead = (BusCurrState == STATE_BUS_READY & UnCachedAccess & LSURWM[1] & IgnoreRequest) |
|
||||||
(BusCurrState == STATE_BUS_UNCACHED_READ);
|
(BusCurrState == STATE_BUS_UNCACHED_READ);
|
||||||
assign LSUBusRead = UnCachedLSUBusRead | (BusCurrState == STATE_BUS_FETCH) | (BusCurrState == STATE_BUS_READY & DCacheFetchLine);
|
assign LSUBusRead = UnCachedLSUBusRead | (BusCurrState == STATE_BUS_FETCH) | (BusCurrState == STATE_BUS_READY & DCacheFetchLine);
|
||||||
|
|
||||||
@ -147,5 +147,5 @@ module busfsm #(parameter integer WordCountThreshold,
|
|||||||
BusCurrState == STATE_BUS_UNCACHED_READ_DONE |
|
BusCurrState == STATE_BUS_UNCACHED_READ_DONE |
|
||||||
BusCurrState == STATE_BUS_UNCACHED_WRITE |
|
BusCurrState == STATE_BUS_UNCACHED_WRITE |
|
||||||
BusCurrState == STATE_BUS_UNCACHED_WRITE_DONE) |
|
BusCurrState == STATE_BUS_UNCACHED_WRITE_DONE) |
|
||||||
~CacheEnabled; // if no dcache always select uncachedadr.
|
~CACHE_ENABLED; // if no dcache always select uncachedadr.
|
||||||
endmodule
|
endmodule
|
||||||
|
@ -82,6 +82,7 @@ module lsu (
|
|||||||
input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0] // *** this one especially has a large note attached to it in pmpchecker.
|
input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0] // *** this one especially has a large note attached to it in pmpchecker.
|
||||||
);
|
);
|
||||||
|
|
||||||
|
localparam CACHE_ENABLED = `DMEM == `MEM_CACHE;
|
||||||
logic [`XLEN+1:0] IEUAdrExtM;
|
logic [`XLEN+1:0] IEUAdrExtM;
|
||||||
logic [`PA_BITS-1:0] LSUPAdrM;
|
logic [`PA_BITS-1:0] LSUPAdrM;
|
||||||
logic DTLBMissM;
|
logic DTLBMissM;
|
||||||
@ -192,9 +193,9 @@ module lsu (
|
|||||||
.DCacheMiss, .DCacheAccess);
|
.DCacheMiss, .DCacheAccess);
|
||||||
assign SelUncachedAdr = '0; // value does not matter.
|
assign SelUncachedAdr = '0; // value does not matter.
|
||||||
end else begin : bus
|
end else begin : bus
|
||||||
localparam integer WORDSPERLINE = (`DMEM == `MEM_CACHE) ? `DCACHE_LINELENINBITS/`XLEN : 1;
|
localparam integer WORDSPERLINE = (CACHE_ENABLED) ? `DCACHE_LINELENINBITS/`XLEN : 1;
|
||||||
localparam integer LINELEN = (`DMEM == `MEM_CACHE) ? `DCACHE_LINELENINBITS : `XLEN;
|
localparam integer LINELEN = (CACHE_ENABLED) ? `DCACHE_LINELENINBITS : `XLEN;
|
||||||
localparam integer LOGWPL = (`DMEM == `MEM_CACHE) ? $clog2(WORDSPERLINE) : 1;
|
localparam integer LOGWPL = (CACHE_ENABLED) ? $clog2(WORDSPERLINE) : 1;
|
||||||
logic [LINELEN-1:0] ReadDataLineM;
|
logic [LINELEN-1:0] ReadDataLineM;
|
||||||
logic [LINELEN-1:0] DCacheBusWriteData;
|
logic [LINELEN-1:0] DCacheBusWriteData;
|
||||||
logic [`PA_BITS-1:0] DCacheBusAdr;
|
logic [`PA_BITS-1:0] DCacheBusAdr;
|
||||||
@ -206,7 +207,7 @@ module lsu (
|
|||||||
logic SelBus;
|
logic SelBus;
|
||||||
logic [LOGWPL-1:0] WordCount;
|
logic [LOGWPL-1:0] WordCount;
|
||||||
|
|
||||||
busdp #(WORDSPERLINE, LINELEN, LOGWPL, 1) busdp(
|
busdp #(WORDSPERLINE, LINELEN, LOGWPL, CACHE_ENABLED) busdp(
|
||||||
.clk, .reset,
|
.clk, .reset,
|
||||||
.LSUBusHRDATA, .LSUBusAck, .LSUBusWrite, .LSUBusRead, .LSUBusSize,
|
.LSUBusHRDATA, .LSUBusAck, .LSUBusWrite, .LSUBusRead, .LSUBusSize,
|
||||||
.WordCount, .LSUBusWriteCrit,
|
.WordCount, .LSUBusWriteCrit,
|
||||||
@ -224,7 +225,7 @@ module lsu (
|
|||||||
.y(WordOffsetAddr)); // *** can reduce width of mux. only need the offset.
|
.y(WordOffsetAddr)); // *** can reduce width of mux. only need the offset.
|
||||||
|
|
||||||
|
|
||||||
if(`DMEM == `MEM_CACHE) begin : dcache
|
if(CACHE_ENABLED) begin : dcache
|
||||||
logic [1:0] RW, Atomic;
|
logic [1:0] RW, Atomic;
|
||||||
assign RW = CacheableM ? LSURWM : 2'b00; // AND gate
|
assign RW = CacheableM ? LSURWM : 2'b00; // AND gate
|
||||||
assign Atomic = CacheableM ? LSUAtomicM : 2'b00; // AND gate
|
assign Atomic = CacheableM ? LSUAtomicM : 2'b00; // AND gate
|
||||||
|
Loading…
Reference in New Issue
Block a user