mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Further cleaning of PMA checker
This commit is contained in:
		
							parent
							
								
									91a13999a9
								
							
						
					
					
						commit
						8357b14957
					
				@ -35,14 +35,18 @@ module pmaadrdec (
 | 
			
		||||
  output logic        HSEL
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
  logic match;
 | 
			
		||||
  logic Match;
 | 
			
		||||
  logic SizeValid;
 | 
			
		||||
 | 
			
		||||
  // determine if an address is in a range starting at the base
 | 
			
		||||
  // for example, if Base = 0x04002000 and range = 0x00000FFF,
 | 
			
		||||
  // then anything address between 0x04002000 and 0x04002FFF should match (HSEL=1)
 | 
			
		||||
  assign Match = &((HADDR ~^ Base) | Range);
 | 
			
		||||
 | 
			
		||||
  assign match = &((HADDR ~^ Base) | Range);
 | 
			
		||||
  assign HSEL = match & Supported;
 | 
			
		||||
  // determine if legal size of access is being made (byte, halfword, word, doubleword)
 | 
			
		||||
  assign SizeValid = SizeMask[Size[1:0]]; 
 | 
			
		||||
  
 | 
			
		||||
  assign HSEL = Match && Supported && AccessValid && SizeValid;
 | 
			
		||||
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -46,14 +46,7 @@ module pmachecker (
 | 
			
		||||
  output logic        PMAStoreAccessFaultM
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
  // Signals are high if the memory access is within the given region
 | 
			
		||||
  logic BootTim, Tim, CLINT, GPIO, UART, PLIC;
 | 
			
		||||
  logic [5:0] Regions;
 | 
			
		||||
 | 
			
		||||
  // Actual HSEL signals sent to uncore
 | 
			
		||||
  logic HSELBootTim, HSELTim, HSELCLINT, HSELGPIO, HSELUART, HSELPLIC;
 | 
			
		||||
  logic ValidBootTim, ValidTim, ValidCLINT, ValidGPIO, ValidUART, ValidPLIC;
 | 
			
		||||
 | 
			
		||||
  // logic BootTim, Tim, CLINT, GPIO, UART, PLIC;
 | 
			
		||||
  logic PMAAccessFault;
 | 
			
		||||
  logic AccessRW, AccessRWX, AccessRX;
 | 
			
		||||
 | 
			
		||||
@ -62,43 +55,27 @@ module pmachecker (
 | 
			
		||||
  assign AccessRWX = ReadAccessM | WriteAccessM | ExecuteAccessF;
 | 
			
		||||
  assign AccessRX = ReadAccessM | ExecuteAccessF;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  // Determine which region of physical memory (if any) is being accessed
 | 
			
		||||
  pmaadrdec boottimdec(HADDR, `BOOTTIMBASE, `BOOTTIMRANGE, `BOOTTIMSUPPORTED, AccessRX, HSIZE, 4'b1111, BootTim);
 | 
			
		||||
  pmaadrdec timdec(HADDR, `TIMBASE, `TIMRANGE, `TIMSUPPORTED, AccessRWX, HSIZE, 4'b1111, Tim);
 | 
			
		||||
  pmaadrdec clintdec(HADDR, `CLINTBASE, `CLINTRANGE, `CLINTSUPPORTED, AccessRW, HSIZE, (`XLEN==64 ? 4'b1000 : 4'b0100), CLINT);
 | 
			
		||||
  pmaadrdec gpiodec(HADDR, `GPIOBASE, `GPIORANGE, `GPIOSUPPORTED, AccessRW, HSIZE, 4'b0100, GPIO);
 | 
			
		||||
  pmaadrdec uartdec(HADDR, `UARTBASE, `UARTRANGE, `UARTSUPPORTED, AccessRW, HSIZE, 4'b0001, UART);
 | 
			
		||||
  pmaadrdec plicdec(HADDR, `PLICBASE, `PLICRANGE, `PLICSUPPORTED, AccessRW, HSIZE, 4'b0100, PLIC);
 | 
			
		||||
 | 
			
		||||
  // Swizzle region bits
 | 
			
		||||
  assign Regions = {BootTim, Tim, CLINT, GPIO, UART, PLIC};
 | 
			
		||||
  // *** linux tests fail early when Access is anything other than 1b1
 | 
			
		||||
  pmaadrdec boottimdec(HADDR, `BOOTTIMBASE, `BOOTTIMRANGE, `BOOTTIMSUPPORTED, 1'b1/*AccessRX*/, HSIZE, 4'b1111, HSELRegions[5]);
 | 
			
		||||
  pmaadrdec timdec(HADDR, `TIMBASE, `TIMRANGE, `TIMSUPPORTED, 1'b1/*AccessRWX*/, HSIZE, 4'b1111, HSELRegions[4]);
 | 
			
		||||
  pmaadrdec clintdec(HADDR, `CLINTBASE, `CLINTRANGE, `CLINTSUPPORTED, AccessRW, HSIZE, (`XLEN==64 ? 4'b1000 : 4'b0100), HSELRegions[3]);
 | 
			
		||||
  pmaadrdec gpiodec(HADDR, `GPIOBASE, `GPIORANGE, `GPIOSUPPORTED, AccessRW, HSIZE, 4'b0100, HSELRegions[2]);
 | 
			
		||||
  pmaadrdec uartdec(HADDR, `UARTBASE, `UARTRANGE, `UARTSUPPORTED, AccessRW, HSIZE, 4'b0001, HSELRegions[1]);
 | 
			
		||||
  pmaadrdec plicdec(HADDR, `PLICBASE, `PLICRANGE, `PLICSUPPORTED, AccessRW, HSIZE, 4'b0100, HSELRegions[0]);
 | 
			
		||||
 | 
			
		||||
  // Only RAM memory regions are cacheable
 | 
			
		||||
  assign Cacheable = BootTim | Tim;
 | 
			
		||||
  assign Idempotent = Tim;
 | 
			
		||||
  assign AtomicAllowed = Tim;
 | 
			
		||||
  assign Cacheable = HSELRegions[5] | HSELRegions[4];
 | 
			
		||||
  assign Idempotent = HSELRegions[4];
 | 
			
		||||
  assign AtomicAllowed = HSELRegions[4];
 | 
			
		||||
 | 
			
		||||
  assign ValidBootTim = '1;
 | 
			
		||||
  assign ValidTim = '1;
 | 
			
		||||
  assign ValidCLINT = ~ExecuteAccessF && ((HSIZE == 3'b011 && `XLEN==64) || (HSIZE == 3'b010 && `XLEN==32));
 | 
			
		||||
  assign ValidGPIO  = ~ExecuteAccessF && (HSIZE == 3'b010);
 | 
			
		||||
  assign ValidUART  = ~ExecuteAccessF && (HSIZE == 3'b000);
 | 
			
		||||
  assign ValidPLIC  = ~ExecuteAccessF && (HSIZE == 3'b010);
 | 
			
		||||
 | 
			
		||||
  assign HSELBootTim = BootTim && ValidBootTim; 
 | 
			
		||||
  assign HSELTim     = Tim     && ValidTim;
 | 
			
		||||
  assign HSELCLINT   = CLINT   && ValidCLINT;
 | 
			
		||||
  assign HSELGPIO    = GPIO    && ValidGPIO;
 | 
			
		||||
  assign HSELUART    = UART    && ValidUART; // only byte writes to UART are supported
 | 
			
		||||
  assign HSELPLIC    = PLIC    && ValidPLIC;
 | 
			
		||||
  /*ExecuteAccessF | ReadAccessM | WriteAccessM; */
 | 
			
		||||
 | 
			
		||||
  // Swizzle region bits
 | 
			
		||||
  assign HSELRegions = {HSELBootTim, HSELTim, HSELCLINT, HSELGPIO, HSELUART, HSELPLIC};
 | 
			
		||||
 | 
			
		||||
  assign PMAAccessFault = ~|HSELRegions;
 | 
			
		||||
  //assign HSELRegions = {BootTim, Tim, CLINT, GPIO, UART, PLIC};
 | 
			
		||||
 | 
			
		||||
  // Detect access faults
 | 
			
		||||
  assign PMAAccessFault = ~|HSELRegions;
 | 
			
		||||
  assign PMAInstrAccessFaultF = ExecuteAccessF && PMAAccessFault;
 | 
			
		||||
  assign PMALoadAccessFaultM  = ReadAccessM    && PMAAccessFault;
 | 
			
		||||
  assign PMAStoreAccessFaultM = WriteAccessM   && PMAAccessFault;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user