mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Cache cleanup.
This commit is contained in:
		
							parent
							
								
									141e90d425
								
							
						
					
					
						commit
						3e66653f37
					
				
							
								
								
									
										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                   reset, | ||||||
|   input  logic                   Stall,             // Stall the cache, preventing new accesses. In-flight access finished but does not return to READY
 |   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                   FlushStage,        // Pipeline flush of second stage (prevent writes and bus operations)
 | ||||||
|   input  logic                   IgnoreRequestTLB,  //
 |  | ||||||
|   // cpu side
 |   // cpu side
 | ||||||
|   input  logic [1:0]             CacheRW,           // [1] Read, [0] Write 
 |   input  logic [1:0]             CacheRW,           // [1] Read, [0] Write 
 | ||||||
|   input  logic [1:0]             CacheAtomic,       // Atomic operation
 |   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              resetDelay; | ||||||
|   logic              StoreAMO; |  | ||||||
|   logic              AnyUpdateHit, AnyHit; |   logic              AnyUpdateHit, AnyHit; | ||||||
|   logic              AnyMiss; |   logic              AnyMiss; | ||||||
|   logic              FlushFlag; |   logic              FlushFlag; | ||||||
| @ -84,10 +83,8 @@ module cachefsm #(parameter READ_ONLY_CACHE = 0) ( | |||||||
| 
 | 
 | ||||||
|   statetype CurrState, NextState; |   statetype CurrState, NextState; | ||||||
| 
 | 
 | ||||||
|   assign StoreAMO = CacheRW[0]; // AMO operations assert CacheRW[0]
 |   assign AnyMiss = (CacheRW[0] | CacheRW[1]) & ~CacheHit & ~InvalidateCache; // exclusion-tag: cache AnyMiss
 | ||||||
| 
 |   assign AnyUpdateHit = (CacheRW[0]) & CacheHit;                             // exclusion-tag: icache storeAMO1
 | ||||||
|   assign AnyMiss = (StoreAMO | CacheRW[1]) & ~CacheHit & ~InvalidateCache; // exclusion-tag: cache AnyMiss
 |  | ||||||
|   assign AnyUpdateHit = (StoreAMO) & CacheHit;                             // exclusion-tag: icache storeAMO1
 |  | ||||||
|   assign AnyHit = AnyUpdateHit | (CacheRW[1] & CacheHit);                  // exclusion-tag: icache AnyUpdateHit
 |   assign AnyHit = AnyUpdateHit | (CacheRW[1] & CacheHit);                  // exclusion-tag: icache AnyUpdateHit
 | ||||||
|   assign FlushFlag = FlushAdrFlag & FlushWayFlag; |   assign FlushFlag = FlushAdrFlag & FlushWayFlag; | ||||||
| 
 | 
 | ||||||
| @ -148,8 +145,8 @@ module cachefsm #(parameter READ_ONLY_CACHE = 0) ( | |||||||
|                       (CurrState == STATE_WRITE_LINE) & ~FlushStage; |                       (CurrState == STATE_WRITE_LINE) & ~FlushStage; | ||||||
|   // exclusion-tag-start: icache flushdirtycontrols
 |   // exclusion-tag-start: icache flushdirtycontrols
 | ||||||
|   assign SetDirty = (CurrState == STATE_READY & AnyUpdateHit) |         // exclusion-tag: icache SetDirty
 |   assign SetDirty = (CurrState == STATE_READY & AnyUpdateHit) |         // exclusion-tag: icache SetDirty
 | ||||||
|                     (CurrState == STATE_WRITE_LINE & (StoreAMO)); |                     (CurrState == STATE_WRITE_LINE & (CacheRW[0])); | ||||||
|   assign ClearDirty = (CurrState == STATE_WRITE_LINE & ~(StoreAMO)) |   // exclusion-tag: icache ClearDirty
 |   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.
 |                       (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
 |   // Flush and eviction controls
 | ||||||
|   assign SelWriteback = (CurrState == STATE_WRITEBACK & ~CacheBusAck) | |   assign SelWriteback = (CurrState == STATE_WRITEBACK & ~CacheBusAck) | | ||||||
| @ -175,7 +172,7 @@ module cachefsm #(parameter READ_ONLY_CACHE = 0) ( | |||||||
|                           (CurrState == STATE_WRITEBACK & ~CacheBusAck) | |                           (CurrState == STATE_WRITEBACK & ~CacheBusAck) | | ||||||
|                      (CurrState == STATE_FLUSH_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_FETCH) | | ||||||
|                   (CurrState == STATE_WRITEBACK) | |                   (CurrState == STATE_WRITEBACK) | | ||||||
|                   (CurrState == STATE_WRITE_LINE) | |                   (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), |       cache #(.P(P), .PA_BITS(P.PA_BITS), .XLEN(P.XLEN), .LINELEN(P.ICACHE_LINELENINBITS), | ||||||
|               .NUMLINES(P.ICACHE_WAYSIZEINBYTES*8/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)) |               .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), |              .FetchBuffer, .CacheBusAck(ICacheBusAck), | ||||||
|              .CacheBusAdr(ICacheBusAdr), .CacheStall(ICacheStallF),  |              .CacheBusAdr(ICacheBusAdr), .CacheStall(ICacheStallF),  | ||||||
|              .CacheBusRW, |              .CacheBusRW, | ||||||
|  | |||||||
| @ -268,7 +268,7 @@ module lsu import cvw::*;  #(parameter cvw_t P) ( | |||||||
|       // *** prefetch can just act as a read operation
 |       // *** 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), |       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( |               .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),  |         .FlushCache(FlushDCache), .NextSet(IEUAdrE[11:0]), .PAdr(PAdrM),  | ||||||
|         .ByteMask(ByteMaskM), .BeatCount(BeatCount[AHBWLOGBWPL-1:AHBWLOGBWPL-LLENLOGBWPL]), |         .ByteMask(ByteMaskM), .BeatCount(BeatCount[AHBWLOGBWPL-1:AHBWLOGBWPL-LLENLOGBWPL]), | ||||||
|         .CacheWriteData(LSUWriteDataM), .SelHPTW, |         .CacheWriteData(LSUWriteDataM), .SelHPTW, | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user