mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Cache cleanup.
This commit is contained in:
		
							parent
							
								
									faaf43fa10
								
							
						
					
					
						commit
						7a196d3fa7
					
				
							
								
								
									
										1
									
								
								src/cache/cache.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								src/cache/cache.sv
									
									
									
									
										vendored
									
									
								
							@ -33,7 +33,6 @@ module cache import cvw::*; #(parameter cvw_t P,
 | 
			
		||||
  input  logic                   reset,
 | 
			
		||||
  input  logic                   Stall,             // Stall the cache, preventing new accesses. In-flight access finished but does not return to READY
 | 
			
		||||
  input  logic                   FlushStage,        // Pipeline flush of second stage (prevent writes and bus operations)
 | 
			
		||||
  input  logic                   IgnoreRequestTLB,  //
 | 
			
		||||
  // cpu side
 | 
			
		||||
  input  logic [1:0]             CacheRW,           // [1] Read, [0] Write 
 | 
			
		||||
  input  logic [1:0]             CacheAtomic,       // Atomic operation
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										13
									
								
								src/cache/cachefsm.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										13
									
								
								src/cache/cachefsm.sv
									
									
									
									
										vendored
									
									
								
							@ -67,7 +67,6 @@ module cachefsm #(parameter READ_ONLY_CACHE = 0) (
 | 
			
		||||
);
 | 
			
		||||
  
 | 
			
		||||
  logic              resetDelay;
 | 
			
		||||
  logic              StoreAMO;
 | 
			
		||||
  logic              AnyUpdateHit, AnyHit;
 | 
			
		||||
  logic              AnyMiss;
 | 
			
		||||
  logic              FlushFlag;
 | 
			
		||||
@ -84,10 +83,8 @@ module cachefsm #(parameter READ_ONLY_CACHE = 0) (
 | 
			
		||||
 | 
			
		||||
  statetype CurrState, NextState;
 | 
			
		||||
 | 
			
		||||
  assign StoreAMO = CacheRW[0]; // AMO operations assert CacheRW[0]
 | 
			
		||||
 | 
			
		||||
  assign AnyMiss = (StoreAMO | CacheRW[1]) & ~CacheHit & ~InvalidateCache; // exclusion-tag: cache AnyMiss
 | 
			
		||||
  assign AnyUpdateHit = (StoreAMO) & CacheHit;                             // exclusion-tag: icache storeAMO1
 | 
			
		||||
  assign AnyMiss = (CacheRW[0] | CacheRW[1]) & ~CacheHit & ~InvalidateCache; // exclusion-tag: cache AnyMiss
 | 
			
		||||
  assign AnyUpdateHit = (CacheRW[0]) & CacheHit;                             // exclusion-tag: icache storeAMO1
 | 
			
		||||
  assign AnyHit = AnyUpdateHit | (CacheRW[1] & CacheHit);                  // exclusion-tag: icache AnyUpdateHit
 | 
			
		||||
  assign FlushFlag = FlushAdrFlag & FlushWayFlag;
 | 
			
		||||
 | 
			
		||||
@ -148,8 +145,8 @@ module cachefsm #(parameter READ_ONLY_CACHE = 0) (
 | 
			
		||||
                      (CurrState == STATE_WRITE_LINE) & ~FlushStage;
 | 
			
		||||
  // exclusion-tag-start: icache flushdirtycontrols
 | 
			
		||||
  assign SetDirty = (CurrState == STATE_READY & AnyUpdateHit) |         // exclusion-tag: icache SetDirty
 | 
			
		||||
                    (CurrState == STATE_WRITE_LINE & (StoreAMO));
 | 
			
		||||
  assign ClearDirty = (CurrState == STATE_WRITE_LINE & ~(StoreAMO)) |   // exclusion-tag: icache ClearDirty
 | 
			
		||||
                    (CurrState == STATE_WRITE_LINE & (CacheRW[0]));
 | 
			
		||||
  assign ClearDirty = (CurrState == STATE_WRITE_LINE & ~(CacheRW[0])) |   // exclusion-tag: icache ClearDirty
 | 
			
		||||
                      (CurrState == STATE_FLUSH & LineDirty); // This is wrong in a multicore snoop cache protocal.  Dirty must be cleared concurrently and atomically with writeback.  For single core cannot clear after writeback on bus ack and change flushadr.  Clears the wrong set.
 | 
			
		||||
  // Flush and eviction controls
 | 
			
		||||
  assign SelWriteback = (CurrState == STATE_WRITEBACK & ~CacheBusAck) |
 | 
			
		||||
@ -175,7 +172,7 @@ module cachefsm #(parameter READ_ONLY_CACHE = 0) (
 | 
			
		||||
                          (CurrState == STATE_WRITEBACK & ~CacheBusAck) |
 | 
			
		||||
                     (CurrState == STATE_FLUSH_WRITEBACK & ~CacheBusAck);
 | 
			
		||||
 | 
			
		||||
  assign SelAdr = (CurrState == STATE_READY & (StoreAMO | AnyMiss)) | // exclusion-tag: icache SelAdrCauses // changes if store delay hazard removed
 | 
			
		||||
  assign SelAdr = (CurrState == STATE_READY & (CacheRW[0] | AnyMiss)) | // exclusion-tag: icache SelAdrCauses // changes if store delay hazard removed
 | 
			
		||||
                  (CurrState == STATE_FETCH) |
 | 
			
		||||
                  (CurrState == STATE_WRITEBACK) |
 | 
			
		||||
                  (CurrState == STATE_WRITE_LINE) |
 | 
			
		||||
 | 
			
		||||
@ -236,7 +236,7 @@ module ifu import cvw::*;  #(parameter cvw_t P) (
 | 
			
		||||
      cache #(.P(P), .PA_BITS(P.PA_BITS), .XLEN(P.XLEN), .LINELEN(P.ICACHE_LINELENINBITS),
 | 
			
		||||
              .NUMLINES(P.ICACHE_WAYSIZEINBYTES*8/P.ICACHE_LINELENINBITS),
 | 
			
		||||
              .NUMWAYS(P.ICACHE_NUMWAYS), .LOGBWPL(LOGBWPL), .WORDLEN(32), .MUXINTERVAL(16), .READ_ONLY_CACHE(1))
 | 
			
		||||
      icache(.clk, .reset, .FlushStage(FlushD), .IgnoreRequestTLB(1'b0), .Stall(GatedStallD),
 | 
			
		||||
      icache(.clk, .reset, .FlushStage(FlushD), .Stall(GatedStallD),
 | 
			
		||||
             .FetchBuffer, .CacheBusAck(ICacheBusAck),
 | 
			
		||||
             .CacheBusAdr(ICacheBusAdr), .CacheStall(ICacheStallF), 
 | 
			
		||||
             .CacheBusRW,
 | 
			
		||||
 | 
			
		||||
@ -268,7 +268,7 @@ module lsu import cvw::*;  #(parameter cvw_t P) (
 | 
			
		||||
      // *** prefetch can just act as a read operation
 | 
			
		||||
      cache #(.P(P), .PA_BITS(P.PA_BITS), .XLEN(P.XLEN), .LINELEN(P.DCACHE_LINELENINBITS), .NUMLINES(P.DCACHE_WAYSIZEINBYTES*8/LINELEN),
 | 
			
		||||
              .NUMWAYS(P.DCACHE_NUMWAYS), .LOGBWPL(LLENLOGBWPL), .WORDLEN(P.LLEN), .MUXINTERVAL(P.LLEN), .READ_ONLY_CACHE(0)) dcache(
 | 
			
		||||
        .clk, .reset, .Stall(GatedStallW), .SelBusBeat, .FlushStage(FlushW | IgnoreRequestTLB), .IgnoreRequestTLB, .CacheRW(CacheRWM), .CacheAtomic(CacheAtomicM),
 | 
			
		||||
        .clk, .reset, .Stall(GatedStallW), .SelBusBeat, .FlushStage(FlushW | IgnoreRequestTLB), .CacheRW(CacheRWM), .CacheAtomic(CacheAtomicM),
 | 
			
		||||
        .FlushCache(FlushDCache), .NextSet(IEUAdrE[11:0]), .PAdr(PAdrM), 
 | 
			
		||||
        .ByteMask(ByteMaskM), .BeatCount(BeatCount[AHBWLOGBWPL-1:AHBWLOGBWPL-LLENLOGBWPL]),
 | 
			
		||||
        .CacheWriteData(LSUWriteDataM), .SelHPTW,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user