mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Found the ahb burst bug.
We had instruction fetches fixed HSIZE = 2 (4 bytes) for all requests. It should be HSIZE = 3 (8 bytes) for cache fetches and 4 for uncached reads. The reason this worked for non burst is the DDR4 memory controller returns the full double word even for 4 byte reads. In burst mode the second beat ending up pointing to the next 4 bytes rather than the next 8 bytes.
This commit is contained in:
		
							parent
							
								
									3f4c825a1a
								
							
						
					
					
						commit
						cc1ba84637
					
				@ -34,7 +34,7 @@
 | 
			
		||||
 | 
			
		||||
`include "wally-config.vh"
 | 
			
		||||
 | 
			
		||||
module ahbinterface #(parameter WRITEABLE = 0)
 | 
			
		||||
module ahbinterface #(parameter WRITEABLE = 0) // **** modify to use LSU/ifu parameter to control widths of buses
 | 
			
		||||
  (
 | 
			
		||||
  input logic                HCLK, HRESETn,
 | 
			
		||||
  
 | 
			
		||||
@ -57,6 +57,7 @@ module ahbinterface #(parameter WRITEABLE = 0)
 | 
			
		||||
  
 | 
			
		||||
  logic                       CaptureEn;
 | 
			
		||||
 | 
			
		||||
  /// *** only 32 bit for IFU.
 | 
			
		||||
  flopen #(`XLEN) fb(.clk(HCLK), .en(CaptureEn), .d(HRDATA), .q(ReadDataWord));
 | 
			
		||||
 | 
			
		||||
  if(WRITEABLE) begin
 | 
			
		||||
 | 
			
		||||
@ -41,6 +41,7 @@ module ahbmulticontroller
 | 
			
		||||
   input logic                clk, reset,
 | 
			
		||||
   // Signals from IFU
 | 
			
		||||
   input logic [`PA_BITS-1:0] IFUHADDR, 
 | 
			
		||||
   input logic [2:0]          IFUHSIZE,
 | 
			
		||||
   input logic [2:0]          IFUHBURST,
 | 
			
		||||
   input logic [1:0]          IFUHTRANS,
 | 
			
		||||
   output logic               IFUHREADY, 
 | 
			
		||||
@ -69,28 +70,23 @@ module ahbmulticontroller
 | 
			
		||||
   (* mark_debug = "true" *) output logic HMASTLOCK
 | 
			
		||||
   );
 | 
			
		||||
 | 
			
		||||
  localparam                  ADRBITS = $clog2(`XLEN/8); // address bits for Byte Mask generator
 | 
			
		||||
 | 
			
		||||
  typedef enum                logic [1:0] {IDLE, ARBITRATE} statetype;
 | 
			
		||||
  statetype CurrState, NextState;
 | 
			
		||||
  logic                       LSUGrant;
 | 
			
		||||
  logic [ADRBITS-1:0]         HADDRD;
 | 
			
		||||
  logic [1:0]                 HSIZED;
 | 
			
		||||
 | 
			
		||||
  logic [1:0]                 save, restore, dis, sel;
 | 
			
		||||
  logic                       both;
 | 
			
		||||
 | 
			
		||||
  logic [`PA_BITS-1:0]        IFUHADDRSave, IFUHADDROut;
 | 
			
		||||
  logic [1:0]                 IFUHTRANSSave, IFUHTRANSOut;
 | 
			
		||||
  logic [2:0]                 IFUHBURSTSave, IFUHBURSTOut;
 | 
			
		||||
  logic [`PA_BITS-1:0]        IFUHADDROut;
 | 
			
		||||
  logic [1:0]                 IFUHTRANSOut;
 | 
			
		||||
  logic [2:0]                 IFUHBURSTOut;
 | 
			
		||||
  logic [2:0]                 IFUHSIZEOut;
 | 
			
		||||
  logic                       IFUHWRITEOut;
 | 
			
		||||
  
 | 
			
		||||
  logic [`PA_BITS-1:0]        LSUHADDRSave, LSUHADDROut;
 | 
			
		||||
  logic [1:0]                 LSUHTRANSSave, LSUHTRANSOut;
 | 
			
		||||
  logic [2:0]                 LSUHBURSTSave, LSUHBURSTOut;
 | 
			
		||||
  logic [2:0]                 LSUHSIZESave, LSUHSIZEOut;
 | 
			
		||||
  logic                       LSUHWRITESave, LSUHWRITEOut;
 | 
			
		||||
  logic [`PA_BITS-1:0]        LSUHADDROut;
 | 
			
		||||
  logic [1:0]                 LSUHTRANSOut;
 | 
			
		||||
  logic [2:0]                 LSUHBURSTOut;
 | 
			
		||||
  logic [2:0]                 LSUHSIZEOut;
 | 
			
		||||
  logic                       LSUHWRITEOut;
 | 
			
		||||
 | 
			
		||||
  logic                       IFUReq, LSUReq;
 | 
			
		||||
  logic                       IFUActive, LSUActive;
 | 
			
		||||
@ -112,7 +108,7 @@ module ahbmulticontroller
 | 
			
		||||
  // input stage IFU
 | 
			
		||||
  controllerinputstage IFUInput(.HCLK, .HRESETn, .Save(save[0]), .Restore(restore[0]), .Disable(dis[0]),
 | 
			
		||||
    .Request(IFUReq), .Active(IFUActive),
 | 
			
		||||
    .HWRITEin(1'b0), .HSIZEin(3'b010), .HBURSTin(IFUHBURST), .HTRANSin(IFUHTRANS), .HADDRin(IFUHADDR),
 | 
			
		||||
    .HWRITEin(1'b0), .HSIZEin(IFUHSIZE), .HBURSTin(IFUHBURST), .HTRANSin(IFUHTRANS), .HADDRin(IFUHADDR),
 | 
			
		||||
    .HWRITEOut(IFUHWRITEOut), .HSIZEOut(IFUHSIZEOut), .HBURSTOut(IFUHBURSTOut), .HREADYOut(IFUHREADY),
 | 
			
		||||
    .HTRANSOut(IFUHTRANSOut), .HADDROut(IFUHADDROut), .HREADYin(HREADY));
 | 
			
		||||
 | 
			
		||||
@ -125,7 +121,7 @@ module ahbmulticontroller
 | 
			
		||||
 | 
			
		||||
  // output mux //*** rewrite for general number of controllers.
 | 
			
		||||
  assign HADDR = sel[1] ? LSUHADDROut : sel[0] ? IFUHADDROut : '0;
 | 
			
		||||
  assign HSIZE = sel[1] ? LSUHSIZEOut : sel[0] ? 3'b010: '0; // Instruction reads are always 32 bits
 | 
			
		||||
  assign HSIZE = sel[1] ? LSUHSIZEOut : sel[0] ? IFUHSIZEOut: '0; 
 | 
			
		||||
  assign HBURST = sel[1] ? LSUHBURSTOut : sel[0] ? IFUHBURSTOut : '0; // If doing memory accesses, use LSUburst, else use Instruction burst.
 | 
			
		||||
  assign HTRANS = sel[1] ? LSUHTRANSOut : sel[0] ? IFUHTRANSOut: '0; // SEQ if not first read or write, NONSEQ if first read or write, IDLE otherwise
 | 
			
		||||
  assign HWRITE = sel[1] ? LSUHWRITEOut : sel[0] ? 1'b0 : '0;
 | 
			
		||||
 | 
			
		||||
@ -41,6 +41,7 @@ module ifu (
 | 
			
		||||
(* mark_debug = "true" *)	output logic 				IFUStallF,
 | 
			
		||||
(* mark_debug = "true" *) output logic [2:0]  IFUHBURST,
 | 
			
		||||
(* mark_debug = "true" *) output logic [1:0]  IFUHTRANS,
 | 
			
		||||
(* mark_debug = "true" *) output logic [2:0]  IFUHSIZE,
 | 
			
		||||
(* mark_debug = "true" *) output logic  IFUHWRITE,
 | 
			
		||||
(* mark_debug = "true" *) input logic   IFUHREADY,
 | 
			
		||||
	(* mark_debug = "true" *) output logic [`XLEN-1:0] PCF, 
 | 
			
		||||
@ -234,7 +235,7 @@ module ifu (
 | 
			
		||||
      ahbcacheinterface #(WORDSPERLINE, LINELEN, LOGBWPL, `ICACHE) 
 | 
			
		||||
      ahbcacheinterface(.HCLK(clk), .HRESETn(~reset),
 | 
			
		||||
            .HRDATA,
 | 
			
		||||
            .CacheRW, .HSIZE(), .HBURST(IFUHBURST), .HTRANS(IFUHTRANS),
 | 
			
		||||
            .CacheRW, .HSIZE(IFUHSIZE), .HBURST(IFUHBURST), .HTRANS(IFUHTRANS),
 | 
			
		||||
            .Funct3(3'b010), .HADDR(IFUHADDR), .HREADY(IFUHREADY), .HWRITE(IFUHWRITE), .CacheBusAdr(ICacheBusAdr),
 | 
			
		||||
            .WordCount(), .SelUncachedAdr, .SelBusWord(),
 | 
			
		||||
              .CacheBusAck(ICacheBusAck), 
 | 
			
		||||
@ -249,6 +250,7 @@ module ifu (
 | 
			
		||||
      logic CaptureEn;
 | 
			
		||||
      logic [1:0] RW;
 | 
			
		||||
      assign RW = NonIROMMemRWM & ~{ITLBMissF, ITLBMissF};
 | 
			
		||||
      assign IFUHSIZE = 3'b010;
 | 
			
		||||
 | 
			
		||||
      ahbinterface #(0) ahbinterface(.HCLK(clk), .HRESETn(~reset), .HREADY(IFUHREADY), 
 | 
			
		||||
        .HRDATA(HRDATA), .HTRANS(IFUHTRANS), .HWRITE(IFUHWRITE), .HWDATA(),
 | 
			
		||||
 | 
			
		||||
@ -216,7 +216,8 @@ module lsu (
 | 
			
		||||
    assign MemStage = CPUBusy | MemRWM[0] | reset; // 1 = M stage; 0 = E stage
 | 
			
		||||
    assign DTIMAdr = MemStage ? IEUAdrExtM : IEUAdrExtE; // zero extend or contract to PA_BITS
 | 
			
		||||
    /* verilator lint_on WIDTH */
 | 
			
		||||
    assign DTIMAccessRW = |MemRWM; 
 | 
			
		||||
    assign DTIMAccessRW = |MemRWM;
 | 
			
		||||
    // *** Ross remove this.
 | 
			
		||||
    adrdec dtimdec(IEUAdrExtM, `DTIM_BASE, `DTIM_RANGE, `DTIM_SUPPORTED, DTIMAccessRW, 2'b10, 4'b1111, SelDTIM); // maybe we pull this out of the mmu?
 | 
			
		||||
    //assign NonDTIMMemRWM = MemRWM & ~{2{SelDTIM}}; // disable access to bus-based memory map when DTIM is selected
 | 
			
		||||
    assign NonDTIMMemRWM = MemRWM; // *** fix
 | 
			
		||||
 | 
			
		||||
@ -132,18 +132,19 @@ module wallypipelinedcore (
 | 
			
		||||
  logic             CommittedM;
 | 
			
		||||
 | 
			
		||||
  // AHB ifu interface
 | 
			
		||||
  logic [`PA_BITS-1:0]         IFUHADDR;
 | 
			
		||||
  logic [2:0]       IFUHBURST;
 | 
			
		||||
  logic [1:0]       IFUHTRANS;
 | 
			
		||||
  logic                     IFUHWRITE;
 | 
			
		||||
  logic                     IFUHREADY;
 | 
			
		||||
  logic [`PA_BITS-1:0] IFUHADDR;
 | 
			
		||||
  logic [2:0]          IFUHBURST;
 | 
			
		||||
  logic [1:0]          IFUHTRANS;
 | 
			
		||||
  logic [2:0]          IFUHSIZE;
 | 
			
		||||
  logic                IFUHWRITE;
 | 
			
		||||
  logic                IFUHREADY;
 | 
			
		||||
  
 | 
			
		||||
  // AHB LSU interface
 | 
			
		||||
  logic [`PA_BITS-1:0]         LSUHADDR;
 | 
			
		||||
  logic [`XLEN-1:0]         LSUHWDATA;
 | 
			
		||||
  logic [`XLEN/8-1:0]       LSUHWSTRB;
 | 
			
		||||
  logic                     LSUHWRITE;
 | 
			
		||||
  logic                     LSUHREADY;
 | 
			
		||||
  logic [`PA_BITS-1:0] LSUHADDR;
 | 
			
		||||
  logic [`XLEN-1:0]    LSUHWDATA;
 | 
			
		||||
  logic [`XLEN/8-1:0]  LSUHWSTRB;
 | 
			
		||||
  logic                LSUHWRITE;
 | 
			
		||||
  logic                LSUHREADY;
 | 
			
		||||
  
 | 
			
		||||
  logic             BPPredWrongE;
 | 
			
		||||
  logic             BPPredDirWrongM;
 | 
			
		||||
@ -172,7 +173,7 @@ module wallypipelinedcore (
 | 
			
		||||
    .FlushF, .FlushD, .FlushE, .FlushM, 
 | 
			
		||||
    // Fetch
 | 
			
		||||
    .HRDATA, .PCF, .IFUHADDR,
 | 
			
		||||
    .IFUStallF, .IFUHBURST, .IFUHTRANS,
 | 
			
		||||
    .IFUStallF, .IFUHBURST, .IFUHTRANS, .IFUHSIZE,
 | 
			
		||||
          .IFUHREADY, .IFUHWRITE,
 | 
			
		||||
    .ICacheAccess, .ICacheMiss,
 | 
			
		||||
 | 
			
		||||
@ -295,6 +296,7 @@ module wallypipelinedcore (
 | 
			
		||||
     .IFUHBURST, 
 | 
			
		||||
     .IFUHTRANS, 
 | 
			
		||||
     .IFUHREADY,
 | 
			
		||||
     .IFUHSIZE,
 | 
			
		||||
     // LSU interface
 | 
			
		||||
     .LSUHADDR,
 | 
			
		||||
     .LSUHWDATA,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user