forked from Github_Repos/cvw
		
	Fix Issue 145
This commit is contained in:
		
							parent
							
								
									c91fa8e69e
								
							
						
					
					
						commit
						77fb1b57f4
					
				@ -90,7 +90,7 @@ module ifu (
 | 
			
		||||
  output logic 				ITLBMissF,                                // ITLB miss causes HPTW (hardware pagetable walker) walk
 | 
			
		||||
  output logic              InstrUpdateDAF,                           // ITLB hit needs to update dirty or access bits
 | 
			
		||||
  input  var logic [7:0] PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0],         // PMP configuration from privileged unit
 | 
			
		||||
  input  var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0],  // PMP address from privileged unit
 | 
			
		||||
  input  var logic [`PA_BITS-3:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0],  // PMP address from privileged unit
 | 
			
		||||
  output logic 				InstrAccessFaultF,                        // Instruction access fault 
 | 
			
		||||
  output logic              ICacheAccess,                             // Report I$ read to performance counters
 | 
			
		||||
  output logic              ICacheMiss                                // Report I$ miss to performance counters
 | 
			
		||||
 | 
			
		||||
@ -88,7 +88,7 @@ module lsu (
 | 
			
		||||
  output logic                ITLBWriteF,                           // Write PTE to ITLB
 | 
			
		||||
  output logic                SelHPTW,                              // During a HPTW walk the effective privilege mode becomes S_MODE
 | 
			
		||||
  input var logic [7:0]       PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0],     // PMP configuration from privileged unit
 | 
			
		||||
  input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0]  // PMP address from privileged unit
 | 
			
		||||
  input var logic [`PA_BITS-3:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0]  // PMP address from privileged unit
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
  logic [`XLEN+1:0]         IEUAdrExtM;                             // Memory stage address zero-extended to PA_BITS or XLEN whichever is longer
 | 
			
		||||
 | 
			
		||||
@ -56,7 +56,7 @@ module mmu #(parameter TLB_ENTRIES = 8, IMMU = 0) (
 | 
			
		||||
  // PMA checker signals
 | 
			
		||||
  input  logic                 AtomicAccessM, ExecuteAccessF, WriteAccessM, ReadAccessM,  // access type
 | 
			
		||||
  input var logic [7:0]       PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0],                        // PMP configuration
 | 
			
		||||
  input var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0]                        // PMP addresses
 | 
			
		||||
  input var logic [`PA_BITS-3:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0]                        // PMP addresses
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
  logic [`PA_BITS-1:0]        TLBPAdr;                  // physical address for TLB                   
 | 
			
		||||
 | 
			
		||||
@ -35,7 +35,7 @@
 | 
			
		||||
module pmpadrdec (
 | 
			
		||||
  input  logic [`PA_BITS-1:0]   PhysicalAddress,
 | 
			
		||||
  input  logic [7:0]            PMPCfg,
 | 
			
		||||
  input  logic [`XLEN-1:0]      PMPAdr,
 | 
			
		||||
  input  logic [`PA_BITS-3:0]      PMPAdr,
 | 
			
		||||
  input  logic                  PAgePMPAdrIn,
 | 
			
		||||
  output logic                  PAgePMPAdrOut,
 | 
			
		||||
  output logic                  Match, Active, 
 | 
			
		||||
@ -60,7 +60,7 @@ module pmpadrdec (
 | 
			
		||||
 
 | 
			
		||||
  // Top-of-range (TOR)
 | 
			
		||||
  // Append two implicit trailing 0's to PMPAdr value
 | 
			
		||||
  assign CurrentAdrFull  = {PMPAdr[`PA_BITS-3:0],  2'b00};
 | 
			
		||||
  assign CurrentAdrFull  = {PMPAdr,  2'b00};
 | 
			
		||||
  assign PAltPMPAdr = {1'b0, PhysicalAddress} < {1'b0, CurrentAdrFull}; // unsigned comparison
 | 
			
		||||
  assign PAgePMPAdrOut = ~PAltPMPAdr;
 | 
			
		||||
  assign TORMatch = PAgePMPAdrIn & PAltPMPAdr;
 | 
			
		||||
@ -69,10 +69,10 @@ module pmpadrdec (
 | 
			
		||||
  logic [`PA_BITS-1:0] NAMask, NABase;
 | 
			
		||||
 | 
			
		||||
  assign NAMask[1:0] = {2'b11};
 | 
			
		||||
  assign NAMask[`PA_BITS-1:2] = (PMPAdr[`PA_BITS-3:0] + {{(`PA_BITS-3){1'b0}}, (AdrMode == NAPOT)}) ^ PMPAdr[`PA_BITS-3:0];
 | 
			
		||||
  assign NAMask[`PA_BITS-1:2] = (PMPAdr + {{(`PA_BITS-3){1'b0}}, (AdrMode == NAPOT)}) ^ PMPAdr;
 | 
			
		||||
  // form a mask where the bottom k bits are 1, corresponding to a size of 2^k bytes for this memory region. 
 | 
			
		||||
  // This assumes we're using at least an NA4 region, but works for any size NAPOT region.
 | 
			
		||||
  assign NABase = {(PMPAdr[`PA_BITS-3:0] & ~NAMask[`PA_BITS-1:2]), 2'b00}; // base physical address of the pmp. 
 | 
			
		||||
  assign NABase = {(PMPAdr & ~NAMask[`PA_BITS-1:2]), 2'b00}; // base physical address of the pmp. 
 | 
			
		||||
  
 | 
			
		||||
  assign NAMatch = &((NABase ~^ PhysicalAddress) | NAMask); // check if upper bits of base address match, ignore lower bits correspoonding to inside the memory range
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -42,7 +42,7 @@ module pmpchecker (
 | 
			
		||||
  // keyword, the compiler warns us that it's interpreting the signal as a var,
 | 
			
		||||
  // which we might not intend.
 | 
			
		||||
  input  var logic [7:0]           PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0],
 | 
			
		||||
  input  var logic [`XLEN-1:0]     PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0],
 | 
			
		||||
  input  var logic [`PA_BITS-3:0]  PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0],
 | 
			
		||||
  input  logic                     ExecuteAccessF, WriteAccessM, ReadAccessM,
 | 
			
		||||
  output logic                     PMPInstrAccessFaultF,
 | 
			
		||||
  output logic                     PMPLoadAccessFaultM,
 | 
			
		||||
 | 
			
		||||
@ -85,7 +85,7 @@ module csr #(parameter
 | 
			
		||||
  output logic             STATUS_MXR, STATUS_SUM, STATUS_MPRV, STATUS_TW,
 | 
			
		||||
  output logic [1:0]       STATUS_FS,
 | 
			
		||||
  output var logic [7:0]   PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0],
 | 
			
		||||
  output var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0],
 | 
			
		||||
  output var logic [`PA_BITS-3:0] PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0],
 | 
			
		||||
  output logic [2:0]       FRM_REGW, 
 | 
			
		||||
  //
 | 
			
		||||
  output logic [`XLEN-1:0] CSRReadValW,               // value read from CSR
 | 
			
		||||
 | 
			
		||||
@ -85,7 +85,7 @@ module csrm #(parameter
 | 
			
		||||
  output logic [`XLEN-1:0] MEDELEG_REGW,
 | 
			
		||||
  output logic [11:0]      MIDELEG_REGW,
 | 
			
		||||
  output var logic [7:0]    PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0],
 | 
			
		||||
  output var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0],
 | 
			
		||||
  output var logic [`PA_BITS-3:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0],
 | 
			
		||||
  output logic 	            WriteMSTATUSM, WriteMSTATUSHM,
 | 
			
		||||
  output logic 	            IllegalCSRMAccessM, IllegalCSRMWriteReadonlyM
 | 
			
		||||
);
 | 
			
		||||
@ -113,7 +113,7 @@ module csrm #(parameter
 | 
			
		||||
        assign ADDRLocked[i] = PMPCFG_ARRAY_REGW[i][7] | (PMPCFG_ARRAY_REGW[i+1][7] & PMPCFG_ARRAY_REGW[i+1][4:3] == 2'b01);
 | 
			
		||||
      
 | 
			
		||||
      assign WritePMPADDRM[i] = (CSRMWriteM & (CSRAdrM == (PMPADDR0+i))) & InstrValidNotFlushedM & ~ADDRLocked[i];
 | 
			
		||||
      flopenr #(`XLEN) PMPADDRreg(clk, reset, WritePMPADDRM[i], CSRWriteValM, PMPADDR_ARRAY_REGW[i]);
 | 
			
		||||
      flopenr #(`PA_BITS-2) PMPADDRreg(clk, reset, WritePMPADDRM[i], CSRWriteValM[`PA_BITS-3:0], PMPADDR_ARRAY_REGW[i]);
 | 
			
		||||
      if (`XLEN==64) begin
 | 
			
		||||
        assign WritePMPCFGM[i] = (CSRMWriteM & (CSRAdrM == (PMPCFG0+2*(i/8)))) & InstrValidNotFlushedM & ~CFGLocked[i];
 | 
			
		||||
        flopenr #(8) PMPCFGreg(clk, reset, WritePMPCFGM[i], CSRWriteValM[(i%8)*8+7:(i%8)*8], PMPCFG_ARRAY_REGW[i]);
 | 
			
		||||
@ -171,7 +171,7 @@ module csrm #(parameter
 | 
			
		||||
    entry = '0;
 | 
			
		||||
    IllegalCSRMAccessM = !(`S_SUPPORTED) & (CSRAdrM == MEDELEG | CSRAdrM == MIDELEG); // trap on DELEG register access when no S or N-mode
 | 
			
		||||
    if (CSRAdrM >= PMPADDR0 & CSRAdrM < PMPADDR0 + `PMP_ENTRIES) // reading a PMP entry
 | 
			
		||||
      CSRMReadValM = PMPADDR_ARRAY_REGW[CSRAdrM - PMPADDR0];
 | 
			
		||||
      CSRMReadValM = {{(`XLEN-(`PA_BITS-2)){1'b0}}, PMPADDR_ARRAY_REGW[CSRAdrM - PMPADDR0]};
 | 
			
		||||
    else if (CSRAdrM >= PMPCFG0 & CSRAdrM < PMPCFG0 + `PMP_ENTRIES/4) begin
 | 
			
		||||
      if (`XLEN==64) begin
 | 
			
		||||
        entry = ({CSRAdrM[11:1], 1'b0} - PMPCFG0)*4; // disregard odd entries in RV64
 | 
			
		||||
 | 
			
		||||
@ -81,7 +81,7 @@ module privileged (
 | 
			
		||||
  output logic             STATUS_MXR, STATUS_SUM, STATUS_MPRV,       // status register bits
 | 
			
		||||
  output logic [1:0]       STATUS_MPP, STATUS_FS,                     // status register bits
 | 
			
		||||
  output var logic [7:0]   PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0],       // PMP configuration entries to MMU
 | 
			
		||||
  output var logic [`XLEN-1:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0], // PMP address entries to MMU
 | 
			
		||||
  output var logic [`PA_BITS-3:0] PMPADDR_ARRAY_REGW [`PMP_ENTRIES-1:0], // PMP address entries to MMU
 | 
			
		||||
  output logic [2:0]       FRM_REGW,                                  // FPU rounding mode
 | 
			
		||||
  // PC logic output in privileged unit
 | 
			
		||||
  output logic [`XLEN-1:0] UnalignedPCNextF,                          // Next PC from trap/return PC logic
 | 
			
		||||
 | 
			
		||||
@ -110,7 +110,7 @@ module wallypipelinedcore (
 | 
			
		||||
  logic                          SelHPTW;
 | 
			
		||||
 | 
			
		||||
  // PMA checker signals
 | 
			
		||||
  var logic [`XLEN-1:0]           PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0];
 | 
			
		||||
  var logic [`PA_BITS-3:0]           PMPADDR_ARRAY_REGW[`PMP_ENTRIES-1:0];
 | 
			
		||||
  var logic [7:0]                PMPCFG_ARRAY_REGW[`PMP_ENTRIES-1:0];
 | 
			
		||||
 | 
			
		||||
  // IMem stalls
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user