mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	More cache simplifications.
This commit is contained in:
		
							parent
							
								
									08549446ef
								
							
						
					
					
						commit
						337903d8dd
					
				
							
								
								
									
										13
									
								
								src/cache/cache.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								src/cache/cache.sv
									
									
									
									
										vendored
									
									
								
							@ -98,8 +98,6 @@ module cache import cvw::*; #(parameter cvw_t P,
 | 
				
			|||||||
  logic                          SelWay;
 | 
					  logic                          SelWay;
 | 
				
			||||||
  logic [LINELEN/8-1:0]          LineByteMask;
 | 
					  logic [LINELEN/8-1:0]          LineByteMask;
 | 
				
			||||||
  logic [$clog2(LINELEN/8) - $clog2(MUXINTERVAL/8) - 1:0] WordOffsetAddr;
 | 
					  logic [$clog2(LINELEN/8) - $clog2(MUXINTERVAL/8) - 1:0] WordOffsetAddr;
 | 
				
			||||||
  logic                                                   ZeroCacheLine;
 | 
					 | 
				
			||||||
  logic [LINELEN-1:0]                                     PreLineWriteData;
 | 
					 | 
				
			||||||
  genvar                         index;
 | 
					  genvar                         index;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
					  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
@ -161,11 +159,6 @@ module cache import cvw::*; #(parameter cvw_t P,
 | 
				
			|||||||
  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
					  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
  // Write Path
 | 
					  // Write Path
 | 
				
			||||||
  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
					  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
  if(P.ZICBOZ_SUPPORTED) begin : cboz_supported
 | 
					 | 
				
			||||||
    mux2 #(LINELEN) WriteDataMux(FetchBuffer, '0, ZeroCacheLine, PreLineWriteData);
 | 
					 | 
				
			||||||
  end else begin
 | 
					 | 
				
			||||||
    assign PreLineWriteData = FetchBuffer;
 | 
					 | 
				
			||||||
  end
 | 
					 | 
				
			||||||
  if(!READ_ONLY_CACHE) begin:WriteSelLogic
 | 
					  if(!READ_ONLY_CACHE) begin:WriteSelLogic
 | 
				
			||||||
    logic [LINELEN/8-1:0]          DemuxedByteMask, FetchBufferByteSel;
 | 
					    logic [LINELEN/8-1:0]          DemuxedByteMask, FetchBufferByteSel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -185,14 +178,14 @@ module cache import cvw::*; #(parameter cvw_t P,
 | 
				
			|||||||
    // Merge write data into fetched cache line for store miss
 | 
					    // Merge write data into fetched cache line for store miss
 | 
				
			||||||
    for(index = 0; index < LINELEN/8; index++) begin
 | 
					    for(index = 0; index < LINELEN/8; index++) begin
 | 
				
			||||||
      mux2 #(8) WriteDataMux(.d0(CacheWriteData[(8*index)%WORDLEN+7:(8*index)%WORDLEN]),
 | 
					      mux2 #(8) WriteDataMux(.d0(CacheWriteData[(8*index)%WORDLEN+7:(8*index)%WORDLEN]),
 | 
				
			||||||
        .d1(PreLineWriteData[8*index+7:8*index]), .s(FetchBufferByteSel[index] | ZeroCacheLine), .y(LineWriteData[8*index+7:8*index]));
 | 
					        .d1(FetchBuffer[8*index+7:8*index]), .s(FetchBufferByteSel[index] & ~CMOp[3]), .y(LineWriteData[8*index+7:8*index]));
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
    assign LineByteMask = SetValid ? '1 : SetDirty ? DemuxedByteMask : '0;
 | 
					    assign LineByteMask = SetValid ? '1 : SetDirty ? DemuxedByteMask : '0;
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
  else
 | 
					  else
 | 
				
			||||||
    begin:WriteSelLogic
 | 
					    begin:WriteSelLogic
 | 
				
			||||||
      // No need for this mux if the cache does not handle writes.
 | 
					      // No need for this mux if the cache does not handle writes.
 | 
				
			||||||
      assign LineWriteData = PreLineWriteData;
 | 
					      assign LineWriteData = FetchBuffer;
 | 
				
			||||||
      assign LineByteMask = '1;
 | 
					      assign LineByteMask = '1;
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
@ -227,7 +220,7 @@ module cache import cvw::*; #(parameter cvw_t P,
 | 
				
			|||||||
    .FlushStage, .CacheRW, .Stall,
 | 
					    .FlushStage, .CacheRW, .Stall,
 | 
				
			||||||
    .CacheHit, .LineDirty, .CacheStall, .CacheCommitted, 
 | 
					    .CacheHit, .LineDirty, .CacheStall, .CacheCommitted, 
 | 
				
			||||||
    .CacheMiss, .CacheAccess, .SelAdr, .SelWay,
 | 
					    .CacheMiss, .CacheAccess, .SelAdr, .SelWay,
 | 
				
			||||||
    .ClearDirty, .SetDirty, .SetValid, .ClearValid, .ZeroCacheLine, .SelWriteback, .SelFlush,
 | 
					    .ClearDirty, .SetDirty, .SetValid, .ClearValid, .SelWriteback, .SelFlush,
 | 
				
			||||||
    .FlushAdrCntEn, .FlushWayCntEn, .FlushCntRst,
 | 
					    .FlushAdrCntEn, .FlushWayCntEn, .FlushCntRst,
 | 
				
			||||||
    .FlushAdrFlag, .FlushWayFlag, .FlushCache, .SelFetchBuffer,
 | 
					    .FlushAdrFlag, .FlushWayFlag, .FlushCache, .SelFetchBuffer,
 | 
				
			||||||
    .InvalidateCache, .CMOp, .CacheEn, .LRUWriteEn);
 | 
					    .InvalidateCache, .CMOp, .CacheEn, .LRUWriteEn);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								src/cache/cachefsm.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								src/cache/cachefsm.sv
									
									
									
									
										vendored
									
									
								
							@ -58,7 +58,6 @@ module cachefsm import cvw::*; #(parameter cvw_t P,
 | 
				
			|||||||
  output logic       ClearValid,        // Clear the valid bit in the selected way and set
 | 
					  output logic       ClearValid,        // Clear the valid bit in the selected way and set
 | 
				
			||||||
  output logic       SetDirty,          // Set the dirty bit in the selected way and set
 | 
					  output logic       SetDirty,          // Set the dirty bit in the selected way and set
 | 
				
			||||||
  output logic       ClearDirty,        // Clear the dirty bit in the selected way and set
 | 
					  output logic       ClearDirty,        // Clear the dirty bit in the selected way and set
 | 
				
			||||||
  output logic       ZeroCacheLine,     // Write zeros to all bytes of cacheline
 | 
					 | 
				
			||||||
  output logic       SelWriteback,      // Overrides cached tag check to select a specific way and set for writeback
 | 
					  output logic       SelWriteback,      // Overrides cached tag check to select a specific way and set for writeback
 | 
				
			||||||
  output logic       LRUWriteEn,        // Update the LRU state
 | 
					  output logic       LRUWriteEn,        // Update the LRU state
 | 
				
			||||||
  output logic       SelFlush,          // [0] Use SelAdr, [1] SRAM reads/writes from FlushAdr
 | 
					  output logic       SelFlush,          // [0] Use SelAdr, [1] SRAM reads/writes from FlushAdr
 | 
				
			||||||
@ -174,8 +173,6 @@ module cachefsm import cvw::*; #(parameter cvw_t P,
 | 
				
			|||||||
  assign SelWay = (CurrState == STATE_WRITEBACK & ((~CacheBusAck & ~(CMOp[1] | CMOp[2])) | (P.ZICBOZ_SUPPORTED & CacheBusAck & CMOp[3]))) |
 | 
					  assign SelWay = (CurrState == STATE_WRITEBACK & ((~CacheBusAck & ~(CMOp[1] | CMOp[2])) | (P.ZICBOZ_SUPPORTED & CacheBusAck & CMOp[3]))) |
 | 
				
			||||||
                  (CurrState == STATE_READY & ((AnyMiss & LineDirty) | (P.ZICBOZ_SUPPORTED & CMOZeroNoEviction & ~CacheHit))) | 
 | 
					                  (CurrState == STATE_READY & ((AnyMiss & LineDirty) | (P.ZICBOZ_SUPPORTED & CMOZeroNoEviction & ~CacheHit))) | 
 | 
				
			||||||
                  (CurrState == STATE_WRITE_LINE);
 | 
					                  (CurrState == STATE_WRITE_LINE);
 | 
				
			||||||
  assign ZeroCacheLine = P.ZICBOZ_SUPPORTED & ((CurrState == STATE_READY & CMOZeroNoEviction) | 
 | 
					 | 
				
			||||||
                                               (CurrState == STATE_WRITEBACK & (CMOp[3] & CacheBusAck)));  
 | 
					 | 
				
			||||||
  assign SelWriteback = (CurrState == STATE_WRITEBACK & (CMOp[1] | CMOp[2] | ~CacheBusAck)) |
 | 
					  assign SelWriteback = (CurrState == STATE_WRITEBACK & (CMOp[1] | CMOp[2] | ~CacheBusAck)) |
 | 
				
			||||||
                        (CurrState == STATE_READY & AnyMiss & LineDirty);
 | 
					                        (CurrState == STATE_READY & AnyMiss & LineDirty);
 | 
				
			||||||
  assign SelFlush = (CurrState == STATE_READY & FlushCache) |
 | 
					  assign SelFlush = (CurrState == STATE_READY & FlushCache) |
 | 
				
			||||||
 | 
				
			|||||||
@ -148,6 +148,7 @@ module lsu import cvw::*;  #(parameter cvw_t P) (
 | 
				
			|||||||
  logic                  IgnoreRequestTLB;                       // On either ITLB or DTLB miss, ignore miss so HPTW can handle
 | 
					  logic                  IgnoreRequestTLB;                       // On either ITLB or DTLB miss, ignore miss so HPTW can handle
 | 
				
			||||||
  logic                  IgnoreRequest;                          // On FlushM or TLB miss ignore memory operation
 | 
					  logic                  IgnoreRequest;                          // On FlushM or TLB miss ignore memory operation
 | 
				
			||||||
  logic                  SelDTIM;                                // Select DTIM rather than bus or D$
 | 
					  logic                  SelDTIM;                                // Select DTIM rather than bus or D$
 | 
				
			||||||
 | 
					  logic [P.XLEN-1:0]     WriteDataZM;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
					  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
  // Pipeline for IEUAdr E to M
 | 
					  // Pipeline for IEUAdr E to M
 | 
				
			||||||
@ -176,6 +177,12 @@ module lsu import cvw::*;  #(parameter cvw_t P) (
 | 
				
			|||||||
    assign {SpillStallM, SelStoreDelay} = '0;
 | 
					    assign {SpillStallM, SelStoreDelay} = '0;
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if(P.ZICBOZ_SUPPORTED) begin : cboz
 | 
				
			||||||
 | 
					      mux2 #(P.XLEN) writedatacbozmux(WriteDataM, '0, CMOpM[3], WriteDataZM);
 | 
				
			||||||
 | 
					    end else begin : cboz
 | 
				
			||||||
 | 
					      assign WriteDataZM = WriteDataM;
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
					  /////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
  // HPTW (only needed if VM supported)
 | 
					  // HPTW (only needed if VM supported)
 | 
				
			||||||
  // MMU include PMP and is needed if any privileged supported
 | 
					  // MMU include PMP and is needed if any privileged supported
 | 
				
			||||||
@ -187,7 +194,7 @@ module lsu import cvw::*;  #(parameter cvw_t P) (
 | 
				
			|||||||
      .FlushW, .DCacheStallM, .SATP_REGW, .PCSpillF,
 | 
					      .FlushW, .DCacheStallM, .SATP_REGW, .PCSpillF,
 | 
				
			||||||
      .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .ENVCFG_HADE, .PrivilegeModeW,
 | 
					      .STATUS_MXR, .STATUS_SUM, .STATUS_MPRV, .STATUS_MPP, .ENVCFG_HADE, .PrivilegeModeW,
 | 
				
			||||||
      .ReadDataM(ReadDataM[P.XLEN-1:0]), // ReadDataM is LLEN, but HPTW only needs XLEN
 | 
					      .ReadDataM(ReadDataM[P.XLEN-1:0]), // ReadDataM is LLEN, but HPTW only needs XLEN
 | 
				
			||||||
      .WriteDataM, .Funct3M, .LSUFunct3M, .Funct7M, .LSUFunct7M,
 | 
					      .WriteDataM(WriteDataZM), .Funct3M, .LSUFunct3M, .Funct7M, .LSUFunct7M,
 | 
				
			||||||
      .IEUAdrExtM, .PTE, .IHWriteDataM, .PageType, .PreLSURWM, .LSUAtomicM,
 | 
					      .IEUAdrExtM, .PTE, .IHWriteDataM, .PageType, .PreLSURWM, .LSUAtomicM,
 | 
				
			||||||
      .IHAdrM, .HPTWStall, .SelHPTW,
 | 
					      .IHAdrM, .HPTWStall, .SelHPTW,
 | 
				
			||||||
      .IgnoreRequestTLB, .LSULoadAccessFaultM, .LSUStoreAmoAccessFaultM, 
 | 
					      .IgnoreRequestTLB, .LSULoadAccessFaultM, .LSUStoreAmoAccessFaultM, 
 | 
				
			||||||
@ -198,7 +205,7 @@ module lsu import cvw::*;  #(parameter cvw_t P) (
 | 
				
			|||||||
    assign LSUFunct3M = Funct3M;
 | 
					    assign LSUFunct3M = Funct3M;
 | 
				
			||||||
    assign LSUFunct7M = Funct7M; 
 | 
					    assign LSUFunct7M = Funct7M; 
 | 
				
			||||||
    assign LSUAtomicM = AtomicM;
 | 
					    assign LSUAtomicM = AtomicM;
 | 
				
			||||||
    assign IHWriteDataM = WriteDataM;
 | 
					    assign IHWriteDataM = WriteDataZM;
 | 
				
			||||||
    assign LoadAccessFaultM = LSULoadAccessFaultM;
 | 
					    assign LoadAccessFaultM = LSULoadAccessFaultM;
 | 
				
			||||||
    assign StoreAmoAccessFaultM = LSUStoreAmoAccessFaultM;   
 | 
					    assign StoreAmoAccessFaultM = LSUStoreAmoAccessFaultM;   
 | 
				
			||||||
    assign {HPTWStall, SelHPTW, PTE, PageType, DTLBWriteM, ITLBWriteF, IgnoreRequestTLB} = '0;
 | 
					    assign {HPTWStall, SelHPTW, PTE, PageType, DTLBWriteM, ITLBWriteF, IgnoreRequestTLB} = '0;
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user