mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Found a way to remove a bus input into MMU. PAdr can be made into VAdr by selecting the faulting virtual address when writing the DTLB.
This commit is contained in:
		
							parent
							
								
									71aad2d213
								
							
						
					
					
						commit
						fe896bff8e
					
				| @ -142,8 +142,7 @@ module ifu ( | ||||
|     mmu #(.TLB_ENTRIES(`ITLB_ENTRIES), .IMMU(1)) | ||||
|     immu(.clk, .reset, .SATP_REGW, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, | ||||
|          .PrivilegeModeW, .DisableTranslation(1'b0), | ||||
|          .PAdr(PCFExt[`PA_BITS-1:0]), | ||||
|          .VAdr(PCFSpill), | ||||
|          .VAdr(PCFExt), | ||||
|          .Size(2'b10), | ||||
|          .PTE(PTE), | ||||
|          .PageTypeWriteVal(PageType), | ||||
|  | ||||
| @ -91,7 +91,7 @@ module lsu ( | ||||
|   logic [2:0]               LSUFunct3M; | ||||
|   logic [6:0]               LSUFunct7M; | ||||
|   logic [1:0]               LSUAtomicM; | ||||
|   (* mark_debug = "true" *)  logic [`PA_BITS-1:0] 		   PreLSUPAdrM; | ||||
|   (* mark_debug = "true" *)  logic [`XLEN+1:0] 		   PreLSUPAdrM; | ||||
|   logic [11:0]              PreLSUAdrE, LSUAdrE;   | ||||
|   logic                     CPUBusy; | ||||
|   logic                     DCacheStallM; | ||||
| @ -132,7 +132,7 @@ module lsu ( | ||||
|     assign {InterlockStall, SelHPTW, PTE, PageType, DTLBWriteM, ITLBWriteF, IgnoreRequestTLB} = '0; | ||||
|     assign IgnoreRequestTrapM = TrapM; assign CPUBusy = StallW; assign PreLSURWM = MemRWM;  | ||||
|     assign LSUAdrE = PreLSUAdrE; assign PreLSUAdrE = IEUAdrE[11:0];  | ||||
|     assign PreLSUPAdrM = IEUAdrExtM[`PA_BITS-1:0]; | ||||
|     assign PreLSUPAdrM = IEUAdrExtM; | ||||
|     assign LSUFunct3M = Funct3M;  assign LSUFunct7M = Funct7M; assign LSUAtomicM = AtomicM; | ||||
|     assign LSUWriteDataM = WriteDataM; | ||||
|    end | ||||
| @ -151,8 +151,7 @@ module lsu ( | ||||
|     mmu #(.TLB_ENTRIES(`DTLB_ENTRIES), .IMMU(0)) | ||||
|     dmmu(.clk, .reset, .SATP_REGW, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, | ||||
|       .PrivilegeModeW, .DisableTranslation, | ||||
|       .PAdr(PreLSUPAdrM), | ||||
|       .VAdr(IEUAdrM), | ||||
|       .VAdr(PreLSUPAdrM), | ||||
|       .Size(LSUFunct3M[1:0]), | ||||
|       .PTE, | ||||
|       .PageTypeWriteVal(PageType), | ||||
|  | ||||
| @ -59,7 +59,7 @@ module lsuvirtmem( | ||||
|   output logic [1:0]          PreLSURWM, | ||||
|   output logic [1:0]          LSUAtomicM, | ||||
|   output logic [11:0]         LSUAdrE, | ||||
|   output logic [`PA_BITS-1:0] PreLSUPAdrM, | ||||
|   output logic [`XLEN+1:0] PreLSUPAdrM, | ||||
|   input logic [`XLEN+1:0]     IEUAdrExtM, // *** can move internally.
 | ||||
|                    | ||||
|   output logic                InterlockStall, | ||||
| @ -71,13 +71,15 @@ module lsuvirtmem( | ||||
| 
 | ||||
|   logic                       AnyCPUReqM; | ||||
|   logic [`PA_BITS-1:0]        HPTWAdr; | ||||
|   logic [`XLEN+1:0]           HPTWAdrExt; | ||||
|   logic [1:0]                 HPTWRW; | ||||
|   logic [2:0]                 HPTWSize; | ||||
|   logic                       SelReplayMemE; | ||||
|   logic [11:0]                PreLSUAdrE;   | ||||
|   logic                       ITLBMissOrDAFaultF, ITLBMissOrDAFaultNoTrapF; | ||||
|   logic                       DTLBMissOrDAFaultM, DTLBMissOrDAFaultNoTrapM;   | ||||
| 
 | ||||
|   logic                       DTLBMissOrDAFaultM, DTLBMissOrDAFaultNoTrapM; | ||||
|   logic                       SelHPTWAdr; | ||||
|    | ||||
|   assign ITLBMissOrDAFaultF = ITLBMissF | (`HPTW_WRITES_SUPPORTED & InstrDAPageFaultF); | ||||
|   assign DTLBMissOrDAFaultM = DTLBMissM | (`HPTW_WRITES_SUPPORTED & DataDAPageFaultM);   | ||||
|   assign ITLBMissOrDAFaultNoTrapF = ITLBMissOrDAFaultF & ~TrapM; | ||||
| @ -94,13 +96,22 @@ module lsuvirtmem( | ||||
|     .DCacheStallM, .HPTWAdr, .HPTWRW, .HPTWSize); | ||||
|   // *** possible future optimization of simplifying page table entry with precomputed misalignment (Ross) low priority
 | ||||
| 
 | ||||
|   // Once the walk is done and it is time to update the DTLB we need to switch back 
 | ||||
|   // to the orignal data virtual address.
 | ||||
|   assign SelHPTWAdr = SelHPTW & ~DTLBWriteM; | ||||
|    | ||||
|   // multiplex the outputs to LSU
 | ||||
|   if(`XLEN+2-`PA_BITS > 0) begin | ||||
|     logic [(`XLEN+2-`PA_BITS)-1:0] zeros; | ||||
|     assign zeros = '0; | ||||
|     assign HPTWAdrExt = {zeros, HPTWAdr}; | ||||
|   end else assign HPTWAdrExt = HPTWAdr; | ||||
|   mux2 #(2) rwmux(MemRWM, HPTWRW, SelHPTW, PreLSURWM); | ||||
|   mux2 #(3) sizemux(Funct3M, HPTWSize, SelHPTW, LSUFunct3M); | ||||
|   mux2 #(7) funct7mux(Funct7M, 7'b0, SelHPTW, LSUFunct7M);     | ||||
|   mux2 #(2) atomicmux(AtomicM, 2'b00, SelHPTW, LSUAtomicM); | ||||
|   mux2 #(12) adremux(IEUAdrE[11:0], HPTWAdr[11:0], SelHPTW, PreLSUAdrE); | ||||
|   mux2 #(`PA_BITS) lsupadrmux(IEUAdrExtM[`PA_BITS-1:0], HPTWAdr, SelHPTW, PreLSUPAdrM); | ||||
|   mux2 #(`XLEN+2) lsupadrmux(IEUAdrExtM, HPTWAdrExt, SelHPTWAdr, PreLSUPAdrM); | ||||
|   if(`HPTW_WRITES_SUPPORTED) | ||||
|     mux2 #(`XLEN) lsuwritedatamux(WriteDataM, PTE, SelHPTW, LSUWriteDataM); | ||||
|   else assign LSUWriteDataM = WriteDataM; | ||||
|  | ||||
| @ -49,16 +49,10 @@ module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries | ||||
|   // 11 - TLB is accessed for both read and write
 | ||||
|   input logic                 DisableTranslation, | ||||
| 
 | ||||
|   // VAdr goes to the TLB only. Virtual if the TLB is active.
 | ||||
|   // PAdr goes to address mux bypassing the TLB.  PAdr used when there is no translation.
 | ||||
|   // Comes from either the program address (instruction address or load/store address)
 | ||||
|   // or from the hardware pagetable walker.
 | ||||
|   // PAdr is intended to used as a phsycial address.  Discarded by the address mux when translation is
 | ||||
|   // performed.  
 | ||||
|   // VAdr is the virtual/physical address from IEU or physical address from HPTW.
 | ||||
|   // PhysicalAddress is selected to be PAdr when no translation or the translated VAdr (TLBPAdr)
 | ||||
|   // when there is translation.
 | ||||
|   input logic [`PA_BITS-1:0]  PAdr, // *** consider renaming this.
 | ||||
|   input logic [`XLEN-1:0]     VAdr, | ||||
|   input logic [`XLEN+1:0]     VAdr, | ||||
|   input logic [1:0]           Size, // 00 = 8 bits, 01 = 16 bits, 10 = 32 bits , 11 = 64 bits
 | ||||
| 
 | ||||
|   // Controls for writing a new entry to the TLB
 | ||||
| @ -106,7 +100,7 @@ module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries | ||||
|       tlb(.clk, .reset, | ||||
|           .SATP_MODE(SATP_REGW[`XLEN-1:`XLEN-`SVMODE_BITS]), | ||||
|           .SATP_ASID(SATP_REGW[`ASID_BASE+`ASID_BITS-1:`ASID_BASE]), | ||||
|           .VAdr, .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, | ||||
|           .VAdr(VAdr[`XLEN-1:0]), .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, | ||||
|           .PrivilegeModeW, .ReadAccess, .WriteAccess, | ||||
|           .DisableTranslation, .PTE, .PageTypeWriteVal, | ||||
|           .TLBWrite, .TLBFlush, .TLBPAdr, .TLBMiss, .TLBHit,  | ||||
| @ -122,8 +116,8 @@ module mmu #(parameter TLB_ENTRIES = 8, // number of TLB Entries | ||||
|   // the lower 12 bits are the page offset. These are never changed from the orginal
 | ||||
|   // non translated address.
 | ||||
|   //mux2 #(`PA_BITS) addressmux(PAdr, TLBPAdr, Translate, PhysicalAddress);
 | ||||
|   mux2 #(`PA_BITS-12) addressmux(PAdr[`PA_BITS-1:12], TLBPAdr[`PA_BITS-1:12], Translate, PhysicalAddress[`PA_BITS-1:12]); | ||||
|   assign PhysicalAddress[11:0] = PAdr[11:0]; | ||||
|   mux2 #(`PA_BITS-12) addressmux(VAdr[`PA_BITS-1:12], TLBPAdr[`PA_BITS-1:12], Translate, PhysicalAddress[`PA_BITS-1:12]); | ||||
|   assign PhysicalAddress[11:0] = VAdr[11:0]; | ||||
|    | ||||
|    | ||||
|   ///////////////////////////////////////////
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user