mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	changed DMEM and IMEM configurations to support BUS/TIM/CACHE
This commit is contained in:
		
							parent
							
								
									172a02551b
								
							
						
					
					
						commit
						bdf1a8ba73
					
				@ -48,10 +48,8 @@
 | 
			
		||||
`define UARCH_PIPELINED 1
 | 
			
		||||
`define UARCH_SUPERSCALR 0
 | 
			
		||||
`define UARCH_SINGLECYCLE 0
 | 
			
		||||
`define MEM_DTIM 0
 | 
			
		||||
`define MEM_DCACHE 1
 | 
			
		||||
`define MEM_IROM 0
 | 
			
		||||
`define MEM_ICACHE 1
 | 
			
		||||
`define DMEM `MEM_CACHE
 | 
			
		||||
`define IMEM `MEM_CACHE
 | 
			
		||||
`define MEM_VIRTMEM 1
 | 
			
		||||
`define VECTORED_INTERRUPTS_SUPPORTED 1 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -47,10 +47,8 @@
 | 
			
		||||
`define UARCH_PIPELINED 1
 | 
			
		||||
`define UARCH_SUPERSCALR 0
 | 
			
		||||
`define UARCH_SINGLECYCLE 0
 | 
			
		||||
`define MEM_DTIM 0
 | 
			
		||||
`define MEM_DCACHE 1
 | 
			
		||||
`define MEM_IROM 0
 | 
			
		||||
`define MEM_ICACHE 1
 | 
			
		||||
`define DMEM `MEM_CACHE
 | 
			
		||||
`define IMEM `MEM_CACHE
 | 
			
		||||
`define MEM_VIRTMEM 1
 | 
			
		||||
`define VECTORED_INTERRUPTS_SUPPORTED 1 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -48,10 +48,8 @@
 | 
			
		||||
`define UARCH_PIPELINED 1
 | 
			
		||||
`define UARCH_SUPERSCALR 0
 | 
			
		||||
`define UARCH_SINGLECYCLE 0
 | 
			
		||||
`define MEM_DTIM 1
 | 
			
		||||
`define MEM_DCACHE 0
 | 
			
		||||
`define MEM_IROM 1
 | 
			
		||||
`define MEM_ICACHE 0
 | 
			
		||||
`define DMEM `MEM_BUS
 | 
			
		||||
`define IMEM `MEM_BUS
 | 
			
		||||
`define MEM_VIRTMEM 0
 | 
			
		||||
`define VECTORED_INTERRUPTS_SUPPORTED 0 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -47,10 +47,8 @@
 | 
			
		||||
`define UARCH_PIPELINED 1
 | 
			
		||||
`define UARCH_SUPERSCALR 0
 | 
			
		||||
`define UARCH_SINGLECYCLE 0
 | 
			
		||||
`define MEM_DTIM 0
 | 
			
		||||
`define MEM_DCACHE 1
 | 
			
		||||
`define MEM_IROM 0
 | 
			
		||||
`define MEM_ICACHE 1
 | 
			
		||||
`define DMEM `MEM_CACHE
 | 
			
		||||
`define IMEM `MEM_CACHE
 | 
			
		||||
`define MEM_VIRTMEM 1
 | 
			
		||||
`define VECTORED_INTERRUPTS_SUPPORTED 1 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -47,10 +47,8 @@
 | 
			
		||||
`define UARCH_PIPELINED 1
 | 
			
		||||
`define UARCH_SUPERSCALR 0
 | 
			
		||||
`define UARCH_SINGLECYCLE 0
 | 
			
		||||
`define MEM_DTIM 0
 | 
			
		||||
`define MEM_DCACHE 0
 | 
			
		||||
`define MEM_IROM 0
 | 
			
		||||
`define MEM_ICACHE 0
 | 
			
		||||
`define DMEM `MEM_TIM
 | 
			
		||||
`define IMEM `MEM_TIM
 | 
			
		||||
`define MEM_VIRTMEM 0
 | 
			
		||||
`define VECTORED_INTERRUPTS_SUPPORTED 1 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -47,10 +47,8 @@
 | 
			
		||||
`define UARCH_PIPELINED 1
 | 
			
		||||
`define UARCH_SUPERSCALR 0
 | 
			
		||||
`define UARCH_SINGLECYCLE 0
 | 
			
		||||
`define MEM_DTIM 1
 | 
			
		||||
`define MEM_DCACHE 0
 | 
			
		||||
`define MEM_IROM 1
 | 
			
		||||
`define MEM_ICACHE 0
 | 
			
		||||
`define DMEM `MEM_TIM
 | 
			
		||||
`define IMEM `MEM_TIM
 | 
			
		||||
`define MEM_VIRTMEM 0
 | 
			
		||||
`define VECTORED_INTERRUPTS_SUPPORTED 1 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -49,10 +49,8 @@
 | 
			
		||||
`define UARCH_PIPELINED 1
 | 
			
		||||
`define UARCH_SUPERSCALR 0
 | 
			
		||||
`define UARCH_SINGLECYCLE 0
 | 
			
		||||
`define MEM_DTIM 0
 | 
			
		||||
`define MEM_DCACHE 1
 | 
			
		||||
`define MEM_IROM 0
 | 
			
		||||
`define MEM_ICACHE 1
 | 
			
		||||
`define DMEM `MEM_CACHE
 | 
			
		||||
`define IMEM `MEM_CACHE
 | 
			
		||||
`define MEM_VIRTMEM 1
 | 
			
		||||
`define VECTORED_INTERRUPTS_SUPPORTED 1 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -48,10 +48,8 @@
 | 
			
		||||
`define UARCH_PIPELINED 1
 | 
			
		||||
`define UARCH_SUPERSCALR 0
 | 
			
		||||
`define UARCH_SINGLECYCLE 0
 | 
			
		||||
`define MEM_DTIM 0
 | 
			
		||||
`define MEM_DCACHE 1
 | 
			
		||||
`define MEM_IROM 0
 | 
			
		||||
`define MEM_ICACHE 1
 | 
			
		||||
`define DMEM `MEM_CACHE
 | 
			
		||||
`define IMEM `MEM_CACHE
 | 
			
		||||
`define MEM_VIRTMEM 1
 | 
			
		||||
`define VECTORED_INTERRUPTS_SUPPORTED 1 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -48,10 +48,8 @@
 | 
			
		||||
`define UARCH_PIPELINED 1
 | 
			
		||||
`define UARCH_SUPERSCALR 0
 | 
			
		||||
`define UARCH_SINGLECYCLE 0
 | 
			
		||||
`define MEM_DTIM 0
 | 
			
		||||
`define MEM_DCACHE 1
 | 
			
		||||
`define MEM_IROM 0
 | 
			
		||||
`define MEM_ICACHE 1
 | 
			
		||||
`define DMEM `MEM_TIM
 | 
			
		||||
`define IMEM `MEM_TIM
 | 
			
		||||
`define MEM_VIRTMEM 0
 | 
			
		||||
`define VECTORED_INTERRUPTS_SUPPORTED 1 
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -50,3 +50,7 @@
 | 
			
		||||
`define SV39 8
 | 
			
		||||
`define SV48 9
 | 
			
		||||
 | 
			
		||||
`define MEM_BUS 1
 | 
			
		||||
`define MEM_TIM 2
 | 
			
		||||
`define MEM_CACHE 3
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -187,7 +187,7 @@ module controller(
 | 
			
		||||
  // Fences
 | 
			
		||||
  // Ordinary fence is presently a nop
 | 
			
		||||
  // FENCE.I flushes the D$ and invalidates the I$ if Zifencei is supported and I$ is implemented
 | 
			
		||||
  if (`ZIFENCEI_SUPPORTED & `MEM_ICACHE) begin:fencei
 | 
			
		||||
  if (`ZIFENCEI_SUPPORTED & (`IMEM == `MEM_CACHE)) begin:fencei
 | 
			
		||||
    logic FenceID;
 | 
			
		||||
    assign FenceID = FenceD & (Funct3D == 3'b001); // is it a FENCE.I instruction?
 | 
			
		||||
    assign InvalidateICacheD = FenceID;
 | 
			
		||||
 | 
			
		||||
@ -170,16 +170,16 @@ module ifu (
 | 
			
		||||
  assign InstrRawF = AllInstrRawF[31:0];
 | 
			
		||||
 | 
			
		||||
  
 | 
			
		||||
  if (`MEM_IROM) begin : irom
 | 
			
		||||
    dtim irom(.clk, .reset, .CPUBusy, .LSURWM(2'b10), .IEUAdrM(PCPF), .IEUAdrE(PCNextFSpill),
 | 
			
		||||
  if (`IMEM == `MEM_TIM) begin : irom // *** fix up dtim taking PA_BITS rather than XLEN
 | 
			
		||||
    dtim irom(.clk, .reset, .CPUBusy, .LSURWM(2'b10), .IEUAdrM(PCPF[31:0]), .IEUAdrE(PCNextFSpill),
 | 
			
		||||
              .TrapM(1'b0), .FinalWriteDataM(), 
 | 
			
		||||
              .ReadDataWordM(AllInstrRawF), .BusStall, .LSUBusWrite(), .LSUBusRead(IFUBusRead),
 | 
			
		||||
              .BusCommittedM(), .ReadDataWordMuxM(), .DCacheStallM(ICacheStallF), 
 | 
			
		||||
              .DCacheCommittedM(), .DCacheMiss(ICacheMiss), .DCacheAccess(ICacheAccess));
 | 
			
		||||
    
 | 
			
		||||
  end else begin : bus
 | 
			
		||||
    localparam integer   WORDSPERLINE = `MEM_ICACHE ? `ICACHE_LINELENINBITS/`XLEN : 1;
 | 
			
		||||
    localparam integer   LINELEN = `MEM_ICACHE ? `ICACHE_LINELENINBITS : `XLEN;
 | 
			
		||||
    localparam integer   WORDSPERLINE = (`IMEM == `MEM_CACHE) ? `ICACHE_LINELENINBITS/`XLEN : 1;
 | 
			
		||||
    localparam integer   LINELEN = (`IMEM == `MEM_CACHE) ? `ICACHE_LINELENINBITS : `XLEN;
 | 
			
		||||
    logic [LINELEN-1:0]  ICacheMemWriteData;
 | 
			
		||||
    logic [`PA_BITS-1:0] ICacheBusAdr;
 | 
			
		||||
    logic                ICacheBusAck;
 | 
			
		||||
@ -197,7 +197,7 @@ module ifu (
 | 
			
		||||
          .IgnoreRequest(ITLBMissF), .LSURWM(2'b10), .CPUBusy, .CacheableM(CacheableF),
 | 
			
		||||
          .BusStall, .BusCommittedM());
 | 
			
		||||
    
 | 
			
		||||
    if(`MEM_ICACHE) begin : icache
 | 
			
		||||
    if(`IMEM == `MEM_CACHE) begin : icache
 | 
			
		||||
      logic [1:0] IFURWF;
 | 
			
		||||
      assign IFURWF = CacheableF ? 2'b10 : 2'b00;
 | 
			
		||||
      
 | 
			
		||||
 | 
			
		||||
@ -48,7 +48,7 @@ module spillsupport (
 | 
			
		||||
  output logic             CompressedF);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  localparam integer   SPILLTHRESHOLD = `MEM_ICACHE ? `ICACHE_LINELENINBITS/32 : 1;
 | 
			
		||||
  localparam integer   SPILLTHRESHOLD = (`IMEM == `MEM_CACHE) ? `ICACHE_LINELENINBITS/32 : 1;
 | 
			
		||||
  logic [`XLEN-1:0] PCPlus2F;
 | 
			
		||||
  logic             TakeSpillF;
 | 
			
		||||
  logic             SpillF;
 | 
			
		||||
@ -91,7 +91,7 @@ module spillsupport (
 | 
			
		||||
  flopenr #(16) SpillInstrReg(.clk(clk),
 | 
			
		||||
                              .en(SpillSaveF),
 | 
			
		||||
                              .reset(reset),
 | 
			
		||||
                              .d(`MEM_ICACHE ? InstrRawF[15:0] : InstrRawF[31:16]),
 | 
			
		||||
                              .d((`IMEM == `MEM_CACHE) ? InstrRawF[15:0] : InstrRawF[31:16]),
 | 
			
		||||
                              .q(SpillDataLine0));
 | 
			
		||||
 | 
			
		||||
  assign PostSpillInstrRawF = SpillF ? {InstrRawF[15:0], SpillDataLine0} : InstrRawF;
 | 
			
		||||
 | 
			
		||||
@ -68,8 +68,8 @@ module busdp #(parameter WORDSPERLINE, parameter LINELEN)
 | 
			
		||||
  output logic                BusCommittedM);
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  localparam integer   WordCountThreshold = `MEM_DCACHE ? WORDSPERLINE - 1 : 0;
 | 
			
		||||
  localparam integer   LOGWPL = `MEM_DCACHE ? $clog2(WORDSPERLINE) : 1;
 | 
			
		||||
  localparam integer   WordCountThreshold = (`DMEM == `MEM_CACHE) ? WORDSPERLINE - 1 : 0;
 | 
			
		||||
  localparam integer   LOGWPL = (`DMEM == `MEM_CACHE) ? $clog2(WORDSPERLINE) : 1;
 | 
			
		||||
 | 
			
		||||
  logic                       SelUncachedAdr;
 | 
			
		||||
  logic [`XLEN-1:0]           PreLSUBusHWDATA;
 | 
			
		||||
@ -93,7 +93,7 @@ module busdp #(parameter WORDSPERLINE, parameter LINELEN)
 | 
			
		||||
  mux2 #(`XLEN) UnCachedDataMux(.d0(ReadDataWordM), .d1(DCacheMemWriteData[`XLEN-1:0]),
 | 
			
		||||
                                .s(SelUncachedAdr), .y(ReadDataWordMuxM));
 | 
			
		||||
 | 
			
		||||
  busfsm #(WordCountThreshold, LOGWPL, `MEM_DCACHE)
 | 
			
		||||
  busfsm #(WordCountThreshold, LOGWPL, (`DMEM == `MEM_CACHE)) // *** cleanup
 | 
			
		||||
  busfsm(.clk, .reset, .IgnoreRequest, .LSURWM, .DCacheFetchLine, .DCacheWriteLine,
 | 
			
		||||
		 .LSUBusAck, .CPUBusy, .CacheableM, .BusStall, .LSUBusWrite, .LSUBusRead,
 | 
			
		||||
		 .DCacheBusAck, .BusCommittedM, .SelUncachedAdr, .WordCount);
 | 
			
		||||
 | 
			
		||||
@ -174,15 +174,15 @@ module lsu (
 | 
			
		||||
  logic [`XLEN-1:0]    ReadDataWordM;
 | 
			
		||||
  logic [`XLEN-1:0]    ReadDataWordMuxM;
 | 
			
		||||
 | 
			
		||||
  if (`MEM_DTIM) begin : dtim
 | 
			
		||||
  if (`DMEM == `MEM_TIM) begin : dtim
 | 
			
		||||
    dtim dtim(.clk, .reset, .CPUBusy, .LSURWM, .IEUAdrM, .IEUAdrE, .TrapM, .FinalWriteDataM, 
 | 
			
		||||
              .ReadDataWordM, .BusStall, .LSUBusWrite,.LSUBusRead, .BusCommittedM,
 | 
			
		||||
              .ReadDataWordMuxM, .DCacheStallM, .DCacheCommittedM,
 | 
			
		||||
              .DCacheMiss, .DCacheAccess);
 | 
			
		||||
 | 
			
		||||
  end else begin : bus  
 | 
			
		||||
    localparam integer   WORDSPERLINE = `MEM_DCACHE ? `DCACHE_LINELENINBITS/`XLEN : 1;
 | 
			
		||||
    localparam integer   LINELEN = `MEM_DCACHE ? `DCACHE_LINELENINBITS : `XLEN;
 | 
			
		||||
    localparam integer   WORDSPERLINE = (`DMEM == `MEM_CACHE) ? `DCACHE_LINELENINBITS/`XLEN : 1;
 | 
			
		||||
    localparam integer   LINELEN = (`DMEM == `MEM_CACHE) ? `DCACHE_LINELENINBITS : `XLEN;
 | 
			
		||||
    logic [`XLEN-1:0]    ReadDataLineSetsM [WORDSPERLINE-1:0];
 | 
			
		||||
    logic [LINELEN-1:0]  DCacheMemWriteData;
 | 
			
		||||
    logic [`PA_BITS-1:0] DCacheBusAdr;
 | 
			
		||||
@ -198,7 +198,7 @@ module lsu (
 | 
			
		||||
          .ReadDataWordM, .ReadDataWordMuxM, .IgnoreRequest, .LSURWM, .CPUBusy, .CacheableM,
 | 
			
		||||
          .BusStall, .BusCommittedM);
 | 
			
		||||
    
 | 
			
		||||
    if(`MEM_DCACHE) begin : dcache
 | 
			
		||||
    if(`DMEM == `MEM_CACHE) begin : dcache
 | 
			
		||||
      cache #(.LINELEN(`DCACHE_LINELENINBITS), .NUMLINES(`DCACHE_WAYSIZEINBYTES*8/LINELEN),
 | 
			
		||||
              .NUMWAYS(`DCACHE_NUMWAYS), .DCACHE(1)) 
 | 
			
		||||
        dcache(.clk, .reset, .CPUBusy,
 | 
			
		||||
 | 
			
		||||
@ -782,17 +782,17 @@ module riscvassertions();
 | 
			
		||||
    assert (`PMP_ENTRIES == 0 | `PMP_ENTRIES==16 | `PMP_ENTRIES==64) else $error("Illegal number of PMP entries: PMP_ENTRIES must be 0, 16, or 64");
 | 
			
		||||
    assert (`F_SUPPORTED | ~`D_SUPPORTED) else $error("Can't support double without supporting float");
 | 
			
		||||
    assert (`XLEN == 64 | ~`D_SUPPORTED) else $error("Wally does not yet support D extensions on RV32");
 | 
			
		||||
    assert (`DCACHE_WAYSIZEINBYTES <= 4096 | `MEM_DCACHE == 0 | `MEM_VIRTMEM == 0) else $error("DCACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`DCACHE_LINELENINBITS >= 128 | `MEM_DCACHE == 0) else $error("DCACHE_LINELENINBITS must be at least 128 when caches are enabled");
 | 
			
		||||
    assert (`DCACHE_WAYSIZEINBYTES <= 4096 | (`DMEM != `MEM_CACHE) | `MEM_VIRTMEM == 0) else $error("DCACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`DCACHE_LINELENINBITS >= 128 | (`DMEM != `MEM_CACHE)) else $error("DCACHE_LINELENINBITS must be at least 128 when caches are enabled");
 | 
			
		||||
    assert (`DCACHE_LINELENINBITS < `DCACHE_WAYSIZEINBYTES*8) else $error("DCACHE_LINELENINBITS must be smaller than way size");
 | 
			
		||||
    assert (`ICACHE_WAYSIZEINBYTES <= 4096 | `MEM_ICACHE == 0 | `MEM_VIRTMEM == 0) else $error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`ICACHE_LINELENINBITS >= 32 | `MEM_ICACHE == 0) else $error("ICACHE_LINELENINBITS must be at least 32 when caches are enabled");
 | 
			
		||||
    assert (`ICACHE_WAYSIZEINBYTES <= 4096 | (`IMEM != `MEM_CACHE) | `MEM_VIRTMEM == 0) else $error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`ICACHE_LINELENINBITS >= 32 | (`IMEM != `MEM_CACHE)) else $error("ICACHE_LINELENINBITS must be at least 32 when caches are enabled");
 | 
			
		||||
    assert (`ICACHE_LINELENINBITS < `ICACHE_WAYSIZEINBYTES*8) else $error("ICACHE_LINELENINBITS must be smaller than way size");
 | 
			
		||||
    assert (2**$clog2(`DCACHE_LINELENINBITS) == `DCACHE_LINELENINBITS) else $error("DCACHE_LINELENINBITS must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ICACHE_LINELENINBITS) == `ICACHE_LINELENINBITS) else $error("ICACHE_LINELENINBITS must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2");
 | 
			
		||||
    assert (`ICACHE_NUMWAYS == 1 | `MEM_ICACHE == 0) else $warning("Multiple Instruction Cache ways not yet implemented");
 | 
			
		||||
    assert (`ICACHE_NUMWAYS == 1 | (`IMEM != `MEM_CACHE)) else $warning("Multiple Instruction Cache ways not yet implemented");
 | 
			
		||||
    assert (2**$clog2(`ITLB_ENTRIES) == `ITLB_ENTRIES) else $error("ITLB_ENTRIES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`DTLB_ENTRIES) == `DTLB_ENTRIES) else $error("DTLB_ENTRIES must be a power of 2");
 | 
			
		||||
    assert (`RAM_RANGE >= 56'h07FFFFFF) else $error("Some regression tests will fail if RAM_RANGE is less than 56'h07FFFFFF");
 | 
			
		||||
 | 
			
		||||
@ -351,16 +351,16 @@ module riscvassertions;
 | 
			
		||||
    assert (`DIV_BITSPERCYCLE == 1 | `DIV_BITSPERCYCLE==2 | `DIV_BITSPERCYCLE==4) else $error("Illegal number of divider bits/cycle: DIV_BITSPERCYCLE must be 1, 2, or 4");
 | 
			
		||||
    assert (`F_SUPPORTED | ~`D_SUPPORTED) else $error("Can't support double (D) without supporting float (F)");
 | 
			
		||||
    assert (`XLEN == 64 | ~`D_SUPPORTED) else $error("Wally does not yet support D extensions on RV32");
 | 
			
		||||
    assert (`DCACHE_WAYSIZEINBYTES <= 4096 | `MEM_DCACHE == 0 | `MEM_VIRTMEM == 0) else $error("DCACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`DCACHE_LINELENINBITS >= 128 | `MEM_DCACHE == 0) else $error("DCACHE_LINELENINBITS must be at least 128 when caches are enabled");
 | 
			
		||||
    assert (`DCACHE_WAYSIZEINBYTES <= 4096 | (`DMEM != `MEM_CACHE) | `MEM_VIRTMEM == 0) else $error("DCACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`DCACHE_LINELENINBITS >= 128 | (`DMEM != `MEM_CACHE)) else $error("DCACHE_LINELENINBITS must be at least 128 when caches are enabled");
 | 
			
		||||
    assert (`DCACHE_LINELENINBITS < `DCACHE_WAYSIZEINBYTES*8) else $error("DCACHE_LINELENINBITS must be smaller than way size");
 | 
			
		||||
    assert (`ICACHE_WAYSIZEINBYTES <= 4096 | `MEM_ICACHE == 0 | `MEM_VIRTMEM == 0) else $error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`ICACHE_LINELENINBITS >= 32 | `MEM_ICACHE == 0) else $error("ICACHE_LINELENINBITS must be at least 32 when caches are enabled");
 | 
			
		||||
    assert (`ICACHE_WAYSIZEINBYTES <= 4096 | (`IMEM != `MEM_CACHE) | `MEM_VIRTMEM == 0) else $error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`ICACHE_LINELENINBITS >= 32 | (`IMEM != `MEM_CACHE)) else $error("ICACHE_LINELENINBITS must be at least 32 when caches are enabled");
 | 
			
		||||
    assert (`ICACHE_LINELENINBITS < `ICACHE_WAYSIZEINBYTES*8) else $error("ICACHE_LINELENINBITS must be smaller than way size");
 | 
			
		||||
    assert (2**$clog2(`DCACHE_LINELENINBITS) == `DCACHE_LINELENINBITS | `MEM_DCACHE==0) else $error("DCACHE_LINELENINBITS must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES | `MEM_DCACHE==0) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ICACHE_LINELENINBITS) == `ICACHE_LINELENINBITS | `MEM_ICACHE==0) else $error("ICACHE_LINELENINBITS must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES | `MEM_ICACHE==0) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`DCACHE_LINELENINBITS) == `DCACHE_LINELENINBITS | (`DMEM != `MEM_CACHE)) else $error("DCACHE_LINELENINBITS must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES | (`DMEM != `MEM_CACHE)) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ICACHE_LINELENINBITS) == `ICACHE_LINELENINBITS | (`IMEM != `MEM_CACHE)) else $error("ICACHE_LINELENINBITS must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES | (`IMEM != `MEM_CACHE)) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ITLB_ENTRIES) == `ITLB_ENTRIES | `MEM_VIRTMEM==0) else $error("ITLB_ENTRIES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`DTLB_ENTRIES) == `DTLB_ENTRIES | `MEM_VIRTMEM==0) else $error("DTLB_ENTRIES must be a power of 2");
 | 
			
		||||
    assert (`RAM_RANGE >= 56'h07FFFFFF) else $warning("Some regression tests will fail if RAM_RANGE is less than 56'h07FFFFFF");
 | 
			
		||||
@ -384,7 +384,7 @@ module DCacheFlushFSM
 | 
			
		||||
 | 
			
		||||
  logic [`XLEN-1:0] ShadowRAM[`RAM_BASE>>(1+`XLEN/32):(`RAM_RANGE+`RAM_BASE)>>1+(`XLEN/32)];
 | 
			
		||||
  
 | 
			
		||||
	if(`MEM_DCACHE) begin
 | 
			
		||||
	if(`DMEM == `MEM_CACHE) begin
 | 
			
		||||
	  localparam integer numlines = testbench.dut.core.lsu.bus.dcache.dcache.NUMLINES;
 | 
			
		||||
	  localparam integer numways = testbench.dut.core.lsu.bus.dcache.dcache.NUMWAYS;
 | 
			
		||||
	  localparam integer linebytelen = testbench.dut.core.lsu.bus.dcache.dcache.LINEBYTELEN;
 | 
			
		||||
 | 
			
		||||
@ -198,7 +198,6 @@ logic [3:0] dummy;
 | 
			
		||||
      else pathname = tvpaths[1]; */
 | 
			
		||||
      memfilename = {pathname, tests[test], ".elf.memfile"};
 | 
			
		||||
      $readmemh(memfilename, dut.uncore.ram.ram.RAM);
 | 
			
		||||
      //if(`MEM_DTIM == 1) $readmemh(memfilename, dut.core.lsu.dtim.ram.RAM);
 | 
			
		||||
      ProgramAddrMapFile = {pathname, tests[test], ".elf.objdump.addr"};
 | 
			
		||||
      ProgramLabelMapFile = {pathname, tests[test], ".elf.objdump.lab"};
 | 
			
		||||
      $display("Read memfile %s", memfilename);
 | 
			
		||||
@ -288,7 +287,6 @@ logic [3:0] dummy;
 | 
			
		||||
            //pathname = tvpaths[tests[0]];
 | 
			
		||||
            memfilename = {pathname, tests[test], ".elf.memfile"};
 | 
			
		||||
            $readmemh(memfilename, dut.uncore.ram.ram.RAM);
 | 
			
		||||
            //if(`MEM_DTIM == 1) $readmemh(memfilename, dut.core.lsu.dtim.ram.RAM);
 | 
			
		||||
            ProgramAddrMapFile = {pathname, tests[test], ".elf.objdump.addr"};
 | 
			
		||||
            ProgramLabelMapFile = {pathname, tests[test], ".elf.objdump.lab"};
 | 
			
		||||
            $display("Read memfile %s", memfilename);
 | 
			
		||||
@ -341,25 +339,25 @@ module riscvassertions;
 | 
			
		||||
    assert (`F_SUPPORTED | ~`D_SUPPORTED) else $error("Can't support double (D) without supporting float (F)");
 | 
			
		||||
    assert (`I_SUPPORTED ^ `E_SUPPORTED) else $error("Exactly one of I and E must be supported");
 | 
			
		||||
    assert (`XLEN == 64 | ~`D_SUPPORTED) else $error("Wally does not yet support D extensions on RV32");
 | 
			
		||||
    assert (`DCACHE_WAYSIZEINBYTES <= 4096 | `MEM_DCACHE == 0 | `MEM_VIRTMEM == 0) else $error("DCACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`DCACHE_LINELENINBITS >= 128 | `MEM_DCACHE == 0) else $error("DCACHE_LINELENINBITS must be at least 128 when caches are enabled");
 | 
			
		||||
    assert (`DCACHE_WAYSIZEINBYTES <= 4096 | (`DMEM != `MEM_CACHE) | `MEM_VIRTMEM == 0) else $error("DCACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`DCACHE_LINELENINBITS >= 128 | (`DMEM != `MEM_CACHE)) else $error("DCACHE_LINELENINBITS must be at least 128 when caches are enabled");
 | 
			
		||||
    assert (`DCACHE_LINELENINBITS < `DCACHE_WAYSIZEINBYTES*8) else $error("DCACHE_LINELENINBITS must be smaller than way size");
 | 
			
		||||
    assert (`ICACHE_WAYSIZEINBYTES <= 4096 | `MEM_ICACHE == 0 | `MEM_VIRTMEM == 0) else $error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`ICACHE_LINELENINBITS >= 32 | `MEM_ICACHE == 0) else $error("ICACHE_LINELENINBITS must be at least 32 when caches are enabled");
 | 
			
		||||
    assert (`ICACHE_WAYSIZEINBYTES <= 4096 | (`IMEM != `MEM_CACHE) | `MEM_VIRTMEM == 0) else $error("ICACHE_WAYSIZEINBYTES cannot exceed 4 KiB when caches and vitual memory is enabled (to prevent aliasing)");
 | 
			
		||||
    assert (`ICACHE_LINELENINBITS >= 32 | (`IMEM != `MEM_CACHE)) else $error("ICACHE_LINELENINBITS must be at least 32 when caches are enabled");
 | 
			
		||||
    assert (`ICACHE_LINELENINBITS < `ICACHE_WAYSIZEINBYTES*8) else $error("ICACHE_LINELENINBITS must be smaller than way size");
 | 
			
		||||
    assert (2**$clog2(`DCACHE_LINELENINBITS) == `DCACHE_LINELENINBITS | `MEM_DCACHE==0) else $error("DCACHE_LINELENINBITS must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES | `MEM_DCACHE==0) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ICACHE_LINELENINBITS) == `ICACHE_LINELENINBITS | `MEM_ICACHE==0) else $error("ICACHE_LINELENINBITS must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES | `MEM_ICACHE==0) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`DCACHE_LINELENINBITS) == `DCACHE_LINELENINBITS | (`DMEM != `MEM_CACHE)) else $error("DCACHE_LINELENINBITS must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`DCACHE_WAYSIZEINBYTES) == `DCACHE_WAYSIZEINBYTES | (`DMEM != `MEM_CACHE)) else $error("DCACHE_WAYSIZEINBYTES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ICACHE_LINELENINBITS) == `ICACHE_LINELENINBITS | (`IMEM != `MEM_CACHE)) else $error("ICACHE_LINELENINBITS must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ICACHE_WAYSIZEINBYTES) == `ICACHE_WAYSIZEINBYTES | (`IMEM != `MEM_CACHE)) else $error("ICACHE_WAYSIZEINBYTES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`ITLB_ENTRIES) == `ITLB_ENTRIES | `MEM_VIRTMEM==0) else $error("ITLB_ENTRIES must be a power of 2");
 | 
			
		||||
    assert (2**$clog2(`DTLB_ENTRIES) == `DTLB_ENTRIES | `MEM_VIRTMEM==0) else $error("DTLB_ENTRIES must be a power of 2");
 | 
			
		||||
    assert (`RAM_RANGE >= 56'h07FFFFFF) else $warning("Some regression tests will fail if RAM_RANGE is less than 56'h07FFFFFF");
 | 
			
		||||
	  assert (`ZICSR_SUPPORTED == 1 | (`PMP_ENTRIES == 0 & `MEM_VIRTMEM == 0)) else $error("PMP_ENTRIES and MEM_VIRTMEM must be zero if ZICSR not supported.");
 | 
			
		||||
    assert (`ZICSR_SUPPORTED == 1 | (`S_SUPPORTED == 0 & `U_SUPPORTED == 0)) else $error("S and U modes not supported if ZISR not supported");
 | 
			
		||||
    assert (`U_SUPPORTED | (`S_SUPPORTED == 0)) else $error ("S mode only supported if U also is supported");
 | 
			
		||||
    assert (`MEM_DCACHE == 0 | `MEM_DTIM == 0) else $error("Can't simultaneously have a data cache and TIM");
 | 
			
		||||
    assert (`MEM_DTIM == 0 | `MEM_VIRTMEM ==0) else $error("DTIM doesn't play nicely with virtual memory");
 | 
			
		||||
    assert (`MEM_IROM == 0 | `MEM_VIRTMEM ==0) else $error("IROM doesn't play nicely with virtual memory");
 | 
			
		||||
//    assert (`MEM_DCACHE == 0 | `MEM_DTIM == 0) else $error("Can't simultaneously have a data cache and TIM");
 | 
			
		||||
    assert (`DMEM == `MEM_CACHE | `MEM_VIRTMEM ==0) else $error("Virtual memory needs dcache");
 | 
			
		||||
    assert (`IMEM == `MEM_CACHE | `MEM_VIRTMEM ==0) else $error("Virtual memory needs icache");
 | 
			
		||||
  end
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
@ -377,7 +375,7 @@ module DCacheFlushFSM
 | 
			
		||||
 | 
			
		||||
  logic [`XLEN-1:0] ShadowRAM[`RAM_BASE>>(1+`XLEN/32):(`RAM_RANGE+`RAM_BASE)>>1+(`XLEN/32)];
 | 
			
		||||
  
 | 
			
		||||
	if(`MEM_DCACHE) begin
 | 
			
		||||
	if(`DMEM == `MEM_CACHE) begin
 | 
			
		||||
	  localparam integer numlines = testbench.dut.core.lsu.bus.dcache.dcache.NUMLINES;
 | 
			
		||||
	  localparam integer numways = testbench.dut.core.lsu.bus.dcache.dcache.NUMWAYS;
 | 
			
		||||
	  localparam integer linebytelen = testbench.dut.core.lsu.bus.dcache.dcache.LINEBYTELEN;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user