mirror of
https://github.com/openhwgroup/cvw
synced 2025-02-11 06:05:49 +00:00
Adding decoding for dtim. Added rv32ic_wally32periph test, which should hang until decoder overrides bus
This commit is contained in:
parent
e526fea68a
commit
3959902c5b
@ -82,7 +82,7 @@ for test in tests32gc:
|
|||||||
grepstr="All tests ran without failures")
|
grepstr="All tests ran without failures")
|
||||||
configs.append(tc)
|
configs.append(tc)
|
||||||
|
|
||||||
tests32ic = ["arch32i", "arch32c", "imperas32i", "imperas32c"]
|
tests32ic = ["arch32i", "arch32c", "imperas32i", "imperas32c", "wally32priv", "wally32periph"]
|
||||||
for test in tests32ic:
|
for test in tests32ic:
|
||||||
tc = TestCase(
|
tc = TestCase(
|
||||||
name=test,
|
name=test,
|
||||||
|
@ -31,8 +31,8 @@
|
|||||||
|
|
||||||
module dtim(
|
module dtim(
|
||||||
input logic clk, reset,
|
input logic clk, reset,
|
||||||
input logic [1:0] LSURWM,
|
input logic [1:0] MemRWM,
|
||||||
input logic [`XLEN-1:0] IEUAdrE,
|
input logic [`PA_BITS-1:0] Adr,
|
||||||
input logic TrapM,
|
input logic TrapM,
|
||||||
input logic [`LLEN-1:0] WriteDataM,
|
input logic [`LLEN-1:0] WriteDataM,
|
||||||
input logic [`LLEN/8-1:0] ByteMaskM,
|
input logic [`LLEN/8-1:0] ByteMaskM,
|
||||||
@ -44,9 +44,9 @@ module dtim(
|
|||||||
localparam ADDR_WDITH = $clog2(`DTIM_RANGE/8);
|
localparam ADDR_WDITH = $clog2(`DTIM_RANGE/8);
|
||||||
localparam OFFSET = $clog2(`LLEN/8);
|
localparam OFFSET = $clog2(`LLEN/8);
|
||||||
|
|
||||||
assign we = LSURWM[0] & ~TrapM; // have to ignore write if Trap.
|
assign we = MemRWM[0] & ~TrapM; // have to ignore write if Trap.
|
||||||
|
|
||||||
bram1p1rw #(`LLEN/8, 8, ADDR_WDITH)
|
bram1p1rw #(`LLEN/8, 8, ADDR_WDITH)
|
||||||
ram(.clk, .we, .bwe(ByteMaskM), .addr(IEUAdrE[ADDR_WDITH+OFFSET-1:OFFSET]), .dout(ReadDataWordM), .din(WriteDataM));
|
ram(.clk, .we, .bwe(ByteMaskM), .addr(Adr[ADDR_WDITH+OFFSET-1:OFFSET]), .dout(ReadDataWordM), .din(WriteDataM));
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
@ -101,6 +101,7 @@ module lsu (
|
|||||||
logic [1:0] LSUAtomicM;
|
logic [1:0] LSUAtomicM;
|
||||||
(* mark_debug = "true" *) logic [`XLEN+1:0] PreLSUPAdrM;
|
(* mark_debug = "true" *) logic [`XLEN+1:0] PreLSUPAdrM;
|
||||||
logic [11:0] LSUAdrE;
|
logic [11:0] LSUAdrE;
|
||||||
|
logic SelDTIM;
|
||||||
logic CPUBusy;
|
logic CPUBusy;
|
||||||
logic DCacheStallM;
|
logic DCacheStallM;
|
||||||
logic CacheableM;
|
logic CacheableM;
|
||||||
@ -114,8 +115,6 @@ module lsu (
|
|||||||
logic [`LLEN-1:0] ReadDataM;
|
logic [`LLEN-1:0] ReadDataM;
|
||||||
logic [(`LLEN-1)/8:0] ByteMaskM;
|
logic [(`LLEN-1)/8:0] ByteMaskM;
|
||||||
|
|
||||||
// *** TO DO: Burst mode
|
|
||||||
|
|
||||||
flopenrc #(`XLEN) AddressMReg(clk, reset, FlushM, ~StallM, IEUAdrE, IEUAdrM);
|
flopenrc #(`XLEN) AddressMReg(clk, reset, FlushM, ~StallM, IEUAdrE, IEUAdrM);
|
||||||
assign IEUAdrExtM = {2'b00, IEUAdrM};
|
assign IEUAdrExtM = {2'b00, IEUAdrM};
|
||||||
assign LSUStallM = DCacheStallM | InterlockStall | BusStall;
|
assign LSUStallM = DCacheStallM | InterlockStall | BusStall;
|
||||||
@ -194,21 +193,25 @@ module lsu (
|
|||||||
logic IgnoreRequest;
|
logic IgnoreRequest;
|
||||||
assign IgnoreRequest = IgnoreRequestTLB | TrapM;
|
assign IgnoreRequest = IgnoreRequestTLB | TrapM;
|
||||||
|
|
||||||
// The LSU allows both a DTIM and bus with cache. However, the PMA decoding presently
|
|
||||||
// use the same UNCORE_RAM_BASE addresss for both the DTIM and any RAM in the Uncore.
|
|
||||||
// *** becomes DTIM_RAM_BASE
|
|
||||||
|
|
||||||
if (`DTIM_SUPPORTED) begin : dtim
|
if (`DTIM_SUPPORTED) begin : dtim
|
||||||
|
logic [`PA_BITS-1:0] DTIMAdr;
|
||||||
|
logic DTIMAccessRW;
|
||||||
|
|
||||||
// The DTIM uses untranslated addresses, so it is not compatible with virtual memory.
|
// The DTIM uses untranslated addresses, so it is not compatible with virtual memory.
|
||||||
dtim dtim(.clk, .reset, .LSURWM,
|
// Don't perform size checking on DTIM
|
||||||
.IEUAdrE(CPUBusy | LSURWM[0] | reset ? IEUAdrM : IEUAdrE),
|
/* verilator lint_off WIDTH */
|
||||||
|
assign DTIMAdr = CPUBusy | MemRWM[0] | reset ? IEUAdrM : IEUAdrE; // zero extend or contract to PA_BITS
|
||||||
|
/* verilator lint_on WIDTH */
|
||||||
|
assign DTIMAccessRW = |MemRWM;
|
||||||
|
adrdec dtimdec(DTIMAdr, `DTIM_BASE, `DTIM_RANGE, `DTIM_SUPPORTED, DTIMAccessRW, 2'b10, 4'b1111, SelDTIM);
|
||||||
|
|
||||||
|
dtim dtim(.clk, .reset, .MemRWM,
|
||||||
|
.Adr(DTIMAdr),
|
||||||
.TrapM, .WriteDataM(LSUWriteDataM),
|
.TrapM, .WriteDataM(LSUWriteDataM),
|
||||||
.ReadDataWordM(ReadDataWordM[`XLEN-1:0]), .ByteMaskM(ByteMaskM[`XLEN/8-1:0]));
|
.ReadDataWordM(ReadDataWordM[`XLEN-1:0]), .ByteMaskM(ByteMaskM[`XLEN/8-1:0]));
|
||||||
|
end else begin
|
||||||
// since we have a local memory the bus connections are all disabled.
|
assign SelDTIM = 0;
|
||||||
// There are no peripherals supported.
|
end
|
||||||
// *** 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 WORDSPERLINE = `DCACHE ? `DCACHE_LINELENINBITS/`XLEN : 1;
|
||||||
localparam integer LOGBWPL = `DCACHE ? $clog2(WORDSPERLINE) : 1;
|
localparam integer LOGBWPL = `DCACHE ? $clog2(WORDSPERLINE) : 1;
|
||||||
|
Loading…
Reference in New Issue
Block a user