mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Extended HADDR to PA_BITS
This commit is contained in:
		
							parent
							
								
									f782fe9367
								
							
						
					
					
						commit
						6222e15946
					
				@ -64,7 +64,7 @@ module ahblite (
 | 
				
			|||||||
  // AHB-Lite external signals
 | 
					  // AHB-Lite external signals
 | 
				
			||||||
  (* mark_debug = "true" *) input logic HREADY, HRESP,
 | 
					  (* mark_debug = "true" *) input logic HREADY, HRESP,
 | 
				
			||||||
  (* mark_debug = "true" *) output logic HCLK, HRESETn,
 | 
					  (* mark_debug = "true" *) output logic HCLK, HRESETn,
 | 
				
			||||||
  (* mark_debug = "true" *) output logic [31:0] HADDR, // *** one day switch to a different bus that supports the full physical address
 | 
					  (* mark_debug = "true" *) output logic [`PA_BITS-1:0] HADDR, // *** one day switch to a different bus that supports the full physical address
 | 
				
			||||||
  (* mark_debug = "true" *) output logic [`AHBW-1:0] HWDATA,
 | 
					  (* mark_debug = "true" *) output logic [`AHBW-1:0] HWDATA,
 | 
				
			||||||
   output logic [`XLEN/8-1:0] HWSTRB,
 | 
					   output logic [`XLEN/8-1:0] HWSTRB,
 | 
				
			||||||
  (* mark_debug = "true" *) output logic HWRITE, 
 | 
					  (* mark_debug = "true" *) output logic HWRITE, 
 | 
				
			||||||
@ -74,7 +74,6 @@ module ahblite (
 | 
				
			|||||||
  (* mark_debug = "true" *) output logic [1:0] HTRANS,
 | 
					  (* mark_debug = "true" *) output logic [1:0] HTRANS,
 | 
				
			||||||
  (* mark_debug = "true" *) output logic HMASTLOCK,
 | 
					  (* mark_debug = "true" *) output logic HMASTLOCK,
 | 
				
			||||||
  // Delayed signals for writes
 | 
					  // Delayed signals for writes
 | 
				
			||||||
  (* mark_debug = "true" *) output logic [2:0] HADDRD,
 | 
					 | 
				
			||||||
  (* mark_debug = "true" *) output logic [3:0] HSIZED,
 | 
					  (* mark_debug = "true" *) output logic [3:0] HSIZED,
 | 
				
			||||||
  (* mark_debug = "true" *) output logic HWRITED
 | 
					  (* mark_debug = "true" *) output logic HWRITED
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
@ -82,6 +81,7 @@ module ahblite (
 | 
				
			|||||||
  typedef enum logic [1:0] {IDLE, MEMREAD, MEMWRITE, INSTRREAD} statetype;
 | 
					  typedef enum logic [1:0] {IDLE, MEMREAD, MEMWRITE, INSTRREAD} statetype;
 | 
				
			||||||
  statetype BusState, NextBusState;
 | 
					  statetype BusState, NextBusState;
 | 
				
			||||||
  logic LSUGrant;
 | 
					  logic LSUGrant;
 | 
				
			||||||
 | 
					  logic [2:0] HADDRD;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  assign HCLK = clk;
 | 
					  assign HCLK = clk;
 | 
				
			||||||
  assign HRESETn = ~reset;
 | 
					  assign HRESETn = ~reset;
 | 
				
			||||||
@ -113,15 +113,15 @@ module ahblite (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  //  LSU/IFU mux: choose source of access
 | 
					  //  LSU/IFU mux: choose source of access
 | 
				
			||||||
  assign #1 LSUGrant = (NextBusState == MEMREAD) | (NextBusState == MEMWRITE);
 | 
					  assign #1 LSUGrant = (NextBusState == MEMREAD) | (NextBusState == MEMWRITE);
 | 
				
			||||||
  assign HADDR = LSUGrant ? LSUHADDR[31:0] : IFUHADDR[31:0];
 | 
					  assign HADDR = LSUGrant ? LSUHADDR : IFUHADDR;
 | 
				
			||||||
  assign HSIZE = LSUGrant ? {1'b0, LSUHSIZE[1:0]} : 3'b010; // Instruction reads are always 32 bits
 | 
					  assign HSIZE = LSUGrant ? {1'b0, LSUHSIZE[1:0]} : 3'b010; // Instruction reads are always 32 bits
 | 
				
			||||||
  assign HBURST = LSUGrant ? LSUHBURST : IFUHBURST; // If doing memory accesses, use LSUburst, else use Instruction burst.
 | 
					  assign HBURST = LSUGrant ? LSUHBURST : IFUHBURST; // If doing memory accesses, use LSUburst, else use Instruction burst.
 | 
				
			||||||
  assign HTRANS = LSUGrant ? LSUHTRANS : IFUHTRANS; // SEQ if not first read or write, NONSEQ if first read or write, IDLE otherwise
 | 
					  assign HTRANS = LSUGrant ? LSUHTRANS : IFUHTRANS; // SEQ if not first read or write, NONSEQ if first read or write, IDLE otherwise
 | 
				
			||||||
   assign HPROT = 4'b0011; // not used; see Section 3.7
 | 
					  assign HPROT = 4'b0011; // not used; see Section 3.7
 | 
				
			||||||
 assign HMASTLOCK = 0; // no locking supported
 | 
					  assign HMASTLOCK = 0; // no locking supported
 | 
				
			||||||
  assign HWRITE = (NextBusState == MEMWRITE);
 | 
					  assign HWRITE = (NextBusState == MEMWRITE);
 | 
				
			||||||
  // Byte mask for HWSTRB
 | 
					  // Byte mask for HWSTRB
 | 
				
			||||||
  swbytemask swbytemask(.Size(HSIZED[1:0]), .Adr(HADDRD[2:0]), .ByteMask(HWSTRB));
 | 
					  swbytemask swbytemask(.Size(HSIZED[1:0]), .Adr(HADDRD), .ByteMask(HWSTRB));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // delay write data by one cycle for
 | 
					  // delay write data by one cycle for
 | 
				
			||||||
  flopen #(`XLEN) wdreg(HCLK, (LSUBusAck | LSUBusInit), LSUHWDATA, HWDATA); // delay HWDATA by 1 cycle per spec; *** assumes AHBW = XLEN
 | 
					  flopen #(`XLEN) wdreg(HCLK, (LSUBusAck | LSUBusInit), LSUHWDATA, HWDATA); // delay HWDATA by 1 cycle per spec; *** assumes AHBW = XLEN
 | 
				
			||||||
 | 
				
			|||||||
@ -32,7 +32,7 @@
 | 
				
			|||||||
module ahbapbbridge #(PERIPHS = 2) (
 | 
					module ahbapbbridge #(PERIPHS = 2) (
 | 
				
			||||||
  input  logic             HCLK, HRESETn,
 | 
					  input  logic             HCLK, HRESETn,
 | 
				
			||||||
  input  logic [PERIPHS-1:0] HSEL,  
 | 
					  input  logic [PERIPHS-1:0] HSEL,  
 | 
				
			||||||
  input  logic [31:0]      HADDR, 
 | 
					  input  logic [`PA_BITS-1:0]  HADDR, 
 | 
				
			||||||
  input  logic [`XLEN-1:0] HWDATA,
 | 
					  input  logic [`XLEN-1:0] HWDATA,
 | 
				
			||||||
  input  logic [`XLEN/8-1:0] HWSTRB,
 | 
					  input  logic [`XLEN/8-1:0] HWSTRB,
 | 
				
			||||||
  input  logic             HWRITE,
 | 
					  input  logic             HWRITE,
 | 
				
			||||||
@ -68,7 +68,7 @@ module ahbapbbridge #(PERIPHS = 2) (
 | 
				
			|||||||
  assign initTransSel = initTrans & |HSEL; // capture data and address if any of the peripherals are selected
 | 
					  assign initTransSel = initTrans & |HSEL; // capture data and address if any of the peripherals are selected
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // delay AHB Address phase signals to align with AHB Data phase because APB expects them at the same time
 | 
					  // delay AHB Address phase signals to align with AHB Data phase because APB expects them at the same time
 | 
				
			||||||
  flopen #(32) addrreg(HCLK, HREADY, HADDR, PADDR);
 | 
					  flopen #(32) addrreg(HCLK, HREADY, HADDR[31:0], PADDR);
 | 
				
			||||||
  flopenr #(1) writereg(HCLK, ~HRESETn, HREADY, HWRITE, PWRITE); 
 | 
					  flopenr #(1) writereg(HCLK, ~HRESETn, HREADY, HWRITE, PWRITE); 
 | 
				
			||||||
  flopenr #(PERIPHS) selreg(HCLK, ~HRESETn, HREADY, HSEL & {PERIPHS{initTrans}}, PSEL); 
 | 
					  flopenr #(PERIPHS) selreg(HCLK, ~HRESETn, HREADY, HSEL & {PERIPHS{initTrans}}, PSEL); 
 | 
				
			||||||
  // PPROT[2:0] = {Data/InstrB, Secure, Privileged};
 | 
					  // PPROT[2:0] = {Data/InstrB, Secure, Privileged};
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@
 | 
				
			|||||||
module ram_ahb #(parameter BASE=0, RANGE = 65535) (
 | 
					module ram_ahb #(parameter BASE=0, RANGE = 65535) (
 | 
				
			||||||
  input  logic             HCLK, HRESETn, 
 | 
					  input  logic             HCLK, HRESETn, 
 | 
				
			||||||
  input  logic             HSELRam,
 | 
					  input  logic             HSELRam,
 | 
				
			||||||
  input  logic [31:0]      HADDR,
 | 
					  input  logic [`PA_BITS-1:0]      HADDR,
 | 
				
			||||||
  input  logic             HWRITE,
 | 
					  input  logic             HWRITE,
 | 
				
			||||||
  input  logic             HREADY,
 | 
					  input  logic             HREADY,
 | 
				
			||||||
  input  logic [1:0]       HTRANS,
 | 
					  input  logic [1:0]       HTRANS,
 | 
				
			||||||
@ -47,7 +47,7 @@ module ram_ahb #(parameter BASE=0, RANGE = 65535) (
 | 
				
			|||||||
  localparam OFFSET = $clog2(`XLEN/8);   
 | 
					  localparam OFFSET = $clog2(`XLEN/8);   
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [`XLEN/8-1:0] 		  ByteMask;
 | 
					  logic [`XLEN/8-1:0] 		  ByteMask;
 | 
				
			||||||
  logic [31:0]        HADDRD, RamAddr;
 | 
					  logic [`PA_BITS-1:0]        HADDRD, RamAddr;
 | 
				
			||||||
  logic				  initTrans;
 | 
					  logic				  initTrans;
 | 
				
			||||||
  logic				  memwrite, memwriteD, memread;
 | 
					  logic				  memwrite, memwriteD, memread;
 | 
				
			||||||
  logic         nextHREADYRam;
 | 
					  logic         nextHREADYRam;
 | 
				
			||||||
@ -59,7 +59,7 @@ module ram_ahb #(parameter BASE=0, RANGE = 65535) (
 | 
				
			|||||||
  assign memread = initTrans & ~HWRITE;
 | 
					  assign memread = initTrans & ~HWRITE;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
  flopenr #(1) memwritereg(HCLK, ~HRESETn, HREADY, memwrite, memwriteD); 
 | 
					  flopenr #(1) memwritereg(HCLK, ~HRESETn, HREADY, memwrite, memwriteD); 
 | 
				
			||||||
  flopenr #(32)   haddrreg(HCLK, ~HRESETn, HREADY, HADDR, HADDRD);
 | 
					  flopenr #(`PA_BITS)   haddrreg(HCLK, ~HRESETn, HREADY, HADDR, HADDRD);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Stall on a read after a write because the RAM can't take both adddresses on the same cycle
 | 
					  // Stall on a read after a write because the RAM can't take both adddresses on the same cycle
 | 
				
			||||||
  assign nextHREADYRam = ~(memwriteD & memread);
 | 
					  assign nextHREADYRam = ~(memwriteD & memread);
 | 
				
			||||||
@ -67,7 +67,7 @@ module ram_ahb #(parameter BASE=0, RANGE = 65535) (
 | 
				
			|||||||
  assign HRESPRam = 0; // OK
 | 
					  assign HRESPRam = 0; // OK
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // On writes or during a wait state, use address delayed by one cycle to sync RamAddr with HWDATA or hold stalled address
 | 
					  // On writes or during a wait state, use address delayed by one cycle to sync RamAddr with HWDATA or hold stalled address
 | 
				
			||||||
  mux2 #(32) adrmux(HADDR, HADDRD, memwriteD | ~HREADY, RamAddr);
 | 
					  mux2 #(`PA_BITS) adrmux(HADDR, HADDRD, memwriteD | ~HREADY, RamAddr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // single-ported RAM
 | 
					  // single-ported RAM
 | 
				
			||||||
  bram1p1rw #(`XLEN/8, 8, ADDR_WIDTH, `FPGA)
 | 
					  bram1p1rw #(`XLEN/8, 8, ADDR_WIDTH, `FPGA)
 | 
				
			||||||
 | 
				
			|||||||
@ -33,7 +33,7 @@
 | 
				
			|||||||
module rom_ahb #(parameter BASE=0, RANGE = 65535) (
 | 
					module rom_ahb #(parameter BASE=0, RANGE = 65535) (
 | 
				
			||||||
  input  logic             HCLK, HRESETn, 
 | 
					  input  logic             HCLK, HRESETn, 
 | 
				
			||||||
  input  logic             HSELRom,
 | 
					  input  logic             HSELRom,
 | 
				
			||||||
  input  logic [31:0]      HADDR,
 | 
					  input  logic [`PA_BITS-1:0]  HADDR,
 | 
				
			||||||
  input  logic             HREADY,
 | 
					  input  logic             HREADY,
 | 
				
			||||||
  input  logic [1:0]       HTRANS,
 | 
					  input  logic [1:0]       HTRANS,
 | 
				
			||||||
  output logic [`XLEN-1:0] HREADRom,
 | 
					  output logic [`XLEN-1:0] HREADRom,
 | 
				
			||||||
 | 
				
			|||||||
@ -37,7 +37,7 @@ module uncore (
 | 
				
			|||||||
  // AHB Bus Interface
 | 
					  // AHB Bus Interface
 | 
				
			||||||
  input  logic             HCLK, HRESETn,
 | 
					  input  logic             HCLK, HRESETn,
 | 
				
			||||||
  input  logic             TIMECLK,
 | 
					  input  logic             TIMECLK,
 | 
				
			||||||
  input  logic [31:0]      HADDR,
 | 
					  input  logic [`PA_BITS-1:0] HADDR,
 | 
				
			||||||
  input  logic [`AHBW-1:0] HWDATA,
 | 
					  input  logic [`AHBW-1:0] HWDATA,
 | 
				
			||||||
  input  logic [`XLEN/8-1:0] HWSTRB,
 | 
					  input  logic [`XLEN/8-1:0] HWSTRB,
 | 
				
			||||||
  input  logic             HWRITE,
 | 
					  input  logic             HWRITE,
 | 
				
			||||||
@ -93,7 +93,7 @@ module uncore (
 | 
				
			|||||||
  // Determine which region of physical memory (if any) is being accessed
 | 
					  // Determine which region of physical memory (if any) is being accessed
 | 
				
			||||||
  // Use a trimmed down portion of the PMA checker - only the address decoders
 | 
					  // Use a trimmed down portion of the PMA checker - only the address decoders
 | 
				
			||||||
  // Set access types to all 1 as don't cares because the MMU has already done access checking
 | 
					  // Set access types to all 1 as don't cares because the MMU has already done access checking
 | 
				
			||||||
  adrdecs adrdecs({{(`PA_BITS-32){1'b0}}, HADDR}, 1'b1, 1'b1, 1'b1, HSIZE[1:0], HSELRegions);
 | 
					  adrdecs adrdecs(HADDR, 1'b1, 1'b1, 1'b1, HSIZE[1:0], HSELRegions);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // unswizzle HSEL signals
 | 
					  // unswizzle HSEL signals
 | 
				
			||||||
  assign {HSELEXT, HSELBootRom, HSELRam, HSELCLINT, HSELGPIO, HSELUART, HSELPLIC, HSELSDC} = HSELRegions[7:0];
 | 
					  assign {HSELEXT, HSELBootRom, HSELRam, HSELCLINT, HSELGPIO, HSELUART, HSELPLIC, HSELSDC} = HSELRegions[7:0];
 | 
				
			||||||
 | 
				
			|||||||
@ -40,7 +40,7 @@ module wallypipelinedcore (
 | 
				
			|||||||
   input logic [`AHBW-1:0]  HRDATA,
 | 
					   input logic [`AHBW-1:0]  HRDATA,
 | 
				
			||||||
   input logic             HREADY, HRESP,
 | 
					   input logic             HREADY, HRESP,
 | 
				
			||||||
   output logic         HCLK, HRESETn,
 | 
					   output logic         HCLK, HRESETn,
 | 
				
			||||||
   output logic [31:0]         HADDR,
 | 
					   output logic [`PA_BITS-1:0] HADDR,
 | 
				
			||||||
   output logic [`AHBW-1:0] HWDATA,
 | 
					   output logic [`AHBW-1:0] HWDATA,
 | 
				
			||||||
   output logic [`XLEN/8-1:0] HWSTRB,
 | 
					   output logic [`XLEN/8-1:0] HWSTRB,
 | 
				
			||||||
   output logic         HWRITE,
 | 
					   output logic         HWRITE,
 | 
				
			||||||
@ -311,8 +311,7 @@ module wallypipelinedcore (
 | 
				
			|||||||
 
 | 
					 
 | 
				
			||||||
     .HREADY, .HRESP, .HCLK, .HRESETn,
 | 
					     .HREADY, .HRESP, .HCLK, .HRESETn,
 | 
				
			||||||
     .HADDR, .HWDATA, .HWSTRB, .HWRITE, .HSIZE, .HBURST,
 | 
					     .HADDR, .HWDATA, .HWSTRB, .HWRITE, .HSIZE, .HBURST,
 | 
				
			||||||
     .HPROT, .HTRANS, .HMASTLOCK, .HADDRD, .HSIZED,
 | 
					     .HPROT, .HTRANS, .HMASTLOCK, .HSIZED, .HWRITED);
 | 
				
			||||||
     .HWRITED);
 | 
					 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
				
			|||||||
@ -46,7 +46,7 @@ module wallypipelinedsoc (
 | 
				
			|||||||
  output logic 		   HSELEXT,
 | 
					  output logic 		   HSELEXT,
 | 
				
			||||||
  // outputs to external memory, shared with uncore memory
 | 
					  // outputs to external memory, shared with uncore memory
 | 
				
			||||||
  output logic 		   HCLK, HRESETn,
 | 
					  output logic 		   HCLK, HRESETn,
 | 
				
			||||||
  output logic [31:0] 	   HADDR,
 | 
					  output logic [`PA_BITS-1:0] HADDR,
 | 
				
			||||||
  output logic [`AHBW-1:0] HWDATA,
 | 
					  output logic [`AHBW-1:0] HWDATA,
 | 
				
			||||||
  output logic [`XLEN/8-1:0] HWSTRB,
 | 
					  output logic [`XLEN/8-1:0] HWSTRB,
 | 
				
			||||||
  output logic 		   HWRITE,
 | 
					  output logic 		   HWRITE,
 | 
				
			||||||
 | 
				
			|||||||
@ -244,7 +244,7 @@ module testbench;
 | 
				
			|||||||
  logic             HCLK, HRESETn;
 | 
					  logic             HCLK, HRESETn;
 | 
				
			||||||
  logic             HREADY;
 | 
					  logic             HREADY;
 | 
				
			||||||
  logic 	    HSELEXT;
 | 
					  logic 	    HSELEXT;
 | 
				
			||||||
  logic [31:0]      HADDR;
 | 
					  logic [`PA_BITS-1:0] HADDR;
 | 
				
			||||||
  logic [`AHBW-1:0] HWDATA;
 | 
					  logic [`AHBW-1:0] HWDATA;
 | 
				
			||||||
  logic [`XLEN/8-1:0] HWSTRB;
 | 
					  logic [`XLEN/8-1:0] HWSTRB;
 | 
				
			||||||
  logic             HWRITE;
 | 
					  logic             HWRITE;
 | 
				
			||||||
 | 
				
			|||||||
@ -53,7 +53,7 @@ logic [3:0] dummy;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  logic [`AHBW-1:0] HRDATAEXT;
 | 
					  logic [`AHBW-1:0] HRDATAEXT;
 | 
				
			||||||
  logic             HREADYEXT, HRESPEXT;
 | 
					  logic             HREADYEXT, HRESPEXT;
 | 
				
			||||||
  logic [31:0]      HADDR;
 | 
					  logic [`PA_BITS-1:0] HADDR;
 | 
				
			||||||
  logic [`AHBW-1:0] HWDATA;
 | 
					  logic [`AHBW-1:0] HWDATA;
 | 
				
			||||||
  logic [`XLEN/8-1:0] HWSTRB;
 | 
					  logic [`XLEN/8-1:0] HWSTRB;
 | 
				
			||||||
  logic             HWRITE;
 | 
					  logic             HWRITE;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user