mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	HPTW cleanup
This commit is contained in:
		
							parent
							
								
									c06da6e6fe
								
							
						
					
					
						commit
						60cfa0d69c
					
				| @ -42,7 +42,7 @@ module hptw | ||||
|    input logic [1:0]           STATUS_MPP, | ||||
|    input logic [1:0]           PrivilegeModeW, | ||||
|    (* mark_debug = "true" *) input logic ITLBMissOrDAFaultNoTrapF, DTLBMissOrDAFaultNoTrapM, // TLB Miss
 | ||||
|    input logic [`XLEN-1:0]     HPTWReadPTE, // page table entry from LSU
 | ||||
|    input logic [`XLEN-1:0]     HPTWReadPTE, // page table entry from LSU  *** change to ReadDataM
 | ||||
|    input logic                 DCacheStallM, // stall from LSU
 | ||||
|    output logic [`XLEN-1:0]    PTE, // page table entry to TLBs
 | ||||
|    output logic [1:0]          PageType, // page type to TLBs
 | ||||
| @ -106,7 +106,6 @@ module hptw | ||||
| 
 | ||||
|   if(`HPTW_WRITES_SUPPORTED) begin : hptwwrites | ||||
| 
 | ||||
|     logic                     SV39Mode; | ||||
|     logic                     ReadAccess, WriteAccess; | ||||
|     logic                     InvalidRead, InvalidWrite; | ||||
|     logic                     UpperBitsUnequalPageFault;  | ||||
| @ -136,19 +135,9 @@ module hptw | ||||
|     assign ImproperPrivilege = ((EffectivePrivilegeMode == `U_MODE) & ~PTE_U) | | ||||
|                                ((EffectivePrivilegeMode == `S_MODE) & PTE_U & (~STATUS_SUM & DTLBWalk)); | ||||
| 
 | ||||
|     // *** turn into module common with code in tlbcontrol.
 | ||||
|     if (`XLEN==64) begin:rv64 | ||||
|       assign SV39Mode = (SATP_REGW[`XLEN-1:`XLEN-`SVMODE_BITS] == `SV39); | ||||
|       // page fault if upper bits aren't all the same
 | ||||
|       logic UpperEqual39, UpperEqual48; | ||||
|       assign UpperEqual39 = &(TranslationVAdr[63:38]) | ~|(TranslationVAdr[63:38]); | ||||
|       assign UpperEqual48 = &(TranslationVAdr[63:47]) | ~|(TranslationVAdr[63:47]);  | ||||
|       assign UpperBitsUnequalPageFault = SV39Mode ? ~UpperEqual39 : ~UpperEqual48; | ||||
|     end else begin | ||||
|       assign SV39Mode = 0; | ||||
|       assign UpperBitsUnequalPageFault = 0; | ||||
|     end            | ||||
| 
 | ||||
|     // Check for page faults
 | ||||
| 	vm64check vm64check(.SATP_MODE(SATP_REGW[`XLEN-1:`XLEN-`SVMODE_BITS]), .VAdr(TranslationVAdr),  | ||||
| 	                               .SV39Mode(), .UpperBitsUnequalPageFault); | ||||
|     assign InvalidRead = ReadAccess & ~Readable & (~STATUS_MXR | ~Executable); | ||||
|     assign InvalidWrite = WriteAccess & ~Writable; | ||||
|     assign OtherPageFault = DTLBWalk? ImproperPrivilege | InvalidRead | InvalidWrite | UpperBitsUnequalPageFault | Misaligned | ~Valid : | ||||
| @ -228,11 +217,6 @@ module hptw | ||||
| 	end | ||||
| 
 | ||||
| 	// Page Table Walker FSM
 | ||||
| 	// If the setup time on the D$ RAM is short, it should be possible to merge the LEVELx_READ and LEVELx states
 | ||||
| 	// to decrease the latency of the HPTW.  However, if the D$ is a cycle limiter, it's better to leave the
 | ||||
| 	// HPTW as shown below to keep the D$ setup time out of the critical path.
 | ||||
| 	// *** Is this really true.  Talk with Ross.  Seems like it's the next state logic on critical path instead.
 | ||||
| 	// *** address TYPE(statetype)
 | ||||
| 	flopenl #(.TYPE(statetype)) WalkerStateReg(clk, reset, 1'b1, NextWalkerState, IDLE, WalkerState);  | ||||
| 	always_comb  | ||||
| 		case (WalkerState) | ||||
| @ -241,20 +225,16 @@ module hptw | ||||
| 			L3_ADR:                     								NextWalkerState = L3_RD; // first access in SV48
 | ||||
| 			L3_RD: if (DCacheStallM)    								NextWalkerState = L3_RD; | ||||
| 				   else     											NextWalkerState = L2_ADR; | ||||
| 	L2_ADR: if (InitialWalkerState == L2_ADR)    NextWalkerState = L2_RD; // first access in SV39
 | ||||
| 			else if (ValidLeafPTE & ~Misaligned) NextWalkerState = LEAF; // could shortcut this by a cyle for all Lx_ADR superpages
 | ||||
| 			else if (ValidNonLeafPTE)            NextWalkerState = L2_RD; | ||||
| 			L2_ADR: if (InitialWalkerState == L2_ADR | ValidNonLeafPTE) NextWalkerState = L2_RD; // first access in SV39
 | ||||
| 					else 				                 				NextWalkerState = LEAF; | ||||
| 			L2_RD: if (DCacheStallM)                     				NextWalkerState = L2_RD; | ||||
| 				else                                     				NextWalkerState = L1_ADR; | ||||
| 	L1_ADR: if (InitialWalkerState == L1_ADR)    NextWalkerState = L1_RD; // first access in SV32
 | ||||
| 			else if (ValidLeafPTE & ~Misaligned) NextWalkerState = LEAF; // could shortcut this by a cyle for all Lx_ADR superpages
 | ||||
| 			L1_ADR: if (InitialWalkerState == L1_ADR | ValidNonLeafPTE) NextWalkerState = L1_RD; // first access in SV32
 | ||||
| 					else if (ValidNonLeafPTE)            				NextWalkerState = L1_RD; | ||||
| 					else 				                				NextWalkerState = LEAF;	 | ||||
| 			L1_RD: if (DCacheStallM)                     				NextWalkerState = L1_RD; | ||||
| 				else                                     				NextWalkerState = L0_ADR; | ||||
| 	L0_ADR: if (ValidLeafPTE & ~Misaligned)      NextWalkerState = LEAF; // could shortcut this by a cyle for all Lx_ADR superpages
 | ||||
| 			else if (ValidNonLeafPTE)            NextWalkerState = L0_RD; | ||||
| 			L0_ADR: if (ValidNonLeafPTE)                 				NextWalkerState = L0_RD; | ||||
| 					else                                 				NextWalkerState = LEAF; | ||||
| 			L0_RD: if (DCacheStallM)                     				NextWalkerState = L0_RD; | ||||
| 				   else                                     			NextWalkerState = LEAF; | ||||
| @ -262,9 +242,7 @@ module hptw | ||||
| 				  else 													NextWalkerState = IDLE; | ||||
| 			UPDATE_PTE: if(`HPTW_WRITES_SUPPORTED & DCacheStallM) 		NextWalkerState = UPDATE_PTE; | ||||
| 						else 											NextWalkerState = LEAF; | ||||
| 	default: begin | ||||
| 		NextWalkerState = IDLE; // should never be reached
 | ||||
| 	end | ||||
| 			default: 													NextWalkerState = IDLE; // should never be reached
 | ||||
| 		endcase // case (WalkerState)
 | ||||
| 
 | ||||
|   assign IgnoreRequestTLB = WalkerState == IDLE & TLBMiss; | ||||
|  | ||||
| @ -68,22 +68,12 @@ module tlbcontrol #(parameter ITLB = 0) ( | ||||
|   // Grab the sv mode from SATP and determine whether translation should occur
 | ||||
|   assign EffectivePrivilegeMode = (ITLB == 1) ? PrivilegeModeW : (STATUS_MPRV ? STATUS_MPP : PrivilegeModeW); // DTLB uses MPP mode when MPRV is 1
 | ||||
|   assign Translate = (SATP_MODE != `NO_TRANSLATE) & (EffectivePrivilegeMode != `M_MODE) & ~DisableTranslation;  | ||||
|   if (`XLEN==64) begin:rv64 | ||||
|       assign SV39Mode = (SATP_MODE == `SV39); | ||||
|       // page fault if upper bits aren't all the same
 | ||||
|       logic UpperEqual39, UpperEqual48; | ||||
|       assign UpperEqual39 = &(VAdr[63:38]) | ~|(VAdr[63:38]); | ||||
|       assign UpperEqual48 = &(VAdr[63:47]) | ~|(VAdr[63:47]);  | ||||
|       assign UpperBitsUnequalPageFault = SV39Mode ? ~UpperEqual39 : ~UpperEqual48; | ||||
|   end else begin | ||||
|       assign SV39Mode = 0; | ||||
|       assign UpperBitsUnequalPageFault = 0; | ||||
|   end            | ||||
| 
 | ||||
|   // Determine whether TLB is being used
 | ||||
|   assign TLBAccess = ReadAccess | WriteAccess; | ||||
| 
 | ||||
|   // Check whether upper bits of virtual addresss are all equal
 | ||||
|   vm64check vm64check(.SATP_MODE, .VAdr, .SV39Mode, .UpperBitsUnequalPageFault); | ||||
| 
 | ||||
|   // unswizzle useful PTE bits
 | ||||
|   assign {PTE_D, PTE_A} = PTEAccessBits[7:6]; | ||||
|  | ||||
							
								
								
									
										50
									
								
								pipelined/src/mmu/vm64check.sv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								pipelined/src/mmu/vm64check.sv
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,50 @@ | ||||
| ///////////////////////////////////////////
 | ||||
| // vm64check.sv
 | ||||
| //
 | ||||
| // Written: David_Harris@hmc.edu 4 November 2022
 | ||||
| // Modified: 
 | ||||
| //
 | ||||
| // Purpose: Check for good upper address bits in RV64 mode
 | ||||
| // 
 | ||||
| // A component of the Wally configurable RISC-V project.
 | ||||
| // 
 | ||||
| // Copyright (C) 2021 Harvey Mudd College & Oklahoma State University
 | ||||
| //
 | ||||
| // MIT LICENSE
 | ||||
| // Permission is hereby granted, free of charge, to any person obtaining a copy of this 
 | ||||
| // software and associated documentation files (the "Software"), to deal in the Software 
 | ||||
| // without restriction, including without limitation the rights to use, copy, modify, merge, 
 | ||||
| // publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons 
 | ||||
| // to whom the Software is furnished to do so, subject to the following conditions:
 | ||||
| //
 | ||||
| //   The above copyright notice and this permission notice shall be included in all copies or 
 | ||||
| //   substantial portions of the Software.
 | ||||
| //
 | ||||
| //   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 
 | ||||
| //   INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR 
 | ||||
| //   PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 
 | ||||
| //   BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 
 | ||||
| //   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE 
 | ||||
| //   OR OTHER DEALINGS IN THE SOFTWARE.
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| 
 | ||||
| `include "wally-config.vh" | ||||
| 
 | ||||
| module vm64check ( | ||||
|    input  logic [`SVMODE_BITS-1:0] SATP_MODE, | ||||
|    input  logic [`XLEN-1:0]        VAdr, | ||||
|    output logic                    SV39Mode, UpperBitsUnequalPageFault | ||||
| ); | ||||
| 
 | ||||
|   if (`XLEN==64) begin:rv64 | ||||
|       assign SV39Mode = (SATP_MODE == `SV39); | ||||
|       // page fault if upper bits aren't all the same
 | ||||
|       logic UpperEqual39, UpperEqual48; | ||||
|       assign UpperEqual39 = &(VAdr[63:38]) | ~|(VAdr[63:38]); | ||||
|       assign UpperEqual48 = &(VAdr[63:47]) | ~|(VAdr[63:47]);  | ||||
|       assign UpperBitsUnequalPageFault = SV39Mode ? ~UpperEqual39 : ~UpperEqual48; | ||||
|   end else begin | ||||
|       assign SV39Mode = 0; | ||||
|       assign UpperBitsUnequalPageFault = 0; | ||||
|   end            | ||||
| endmodule | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user