mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	More cachefsm cleanup.
This commit is contained in:
		
							parent
							
								
									708e0cf183
								
							
						
					
					
						commit
						9510a33c15
					
				
							
								
								
									
										262
									
								
								pipelined/src/cache/cachefsm.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										262
									
								
								pipelined/src/cache/cachefsm.sv
									
									
									
									
										vendored
									
									
								
							| @ -136,229 +136,45 @@ module cachefsm | ||||
|     if (reset)    CurrState <= #1 STATE_READY; | ||||
|     else CurrState <= #1 NextState;   | ||||
|    | ||||
|   // next state logic and some state ouputs.
 | ||||
|   // *** Ross simplify: factor out next state and output logic
 | ||||
|   always_comb begin | ||||
|     //PreSelAdr = 2'b00;
 | ||||
|     NextState = STATE_READY; | ||||
|     case (CurrState) | ||||
|       STATE_READY: begin | ||||
| 
 | ||||
| 		//PreSelAdr = 2'b00;
 | ||||
| 
 | ||||
| 		// TLB Miss	
 | ||||
| 		if(IgnoreRequest) begin | ||||
| 		  // the LSU arbiter has not yet selected the PTW.
 | ||||
| 		  // The CPU needs to be stalled until that happens.
 | ||||
| 		  // If we set CacheStall for 1 cycle before going to
 | ||||
| 		  // PTW ready the CPU will stall.
 | ||||
| 		  // The page table walker asserts it's control 1 cycle
 | ||||
| 		  // after the TLBs miss.
 | ||||
| 		  //PreSelAdr = 2'b01;
 | ||||
| 		  NextState = STATE_READY; | ||||
| 		end | ||||
| 
 | ||||
| 		// Flush dcache to next level of memory
 | ||||
| 		else if(FlushCache) begin | ||||
| 		  NextState = STATE_FLUSH; | ||||
| 		end | ||||
| 		 | ||||
| 		// amo hit
 | ||||
| 		else if(Atomic[1] & (&RW) & CacheHit) begin | ||||
| 		  //PreSelAdr = 2'b01;
 | ||||
| 		   | ||||
| 		  if(CPUBusy) begin  | ||||
| 			NextState = STATE_CPU_BUSY_FINISH_AMO; | ||||
| 			//if (`REPLAY) PreSelAdr = 2'b01; 
 | ||||
|             //else save = 1'b1;
 | ||||
| 		  end | ||||
| 		  else begin | ||||
| 			NextState = STATE_READY; | ||||
| 		  end | ||||
| 		end | ||||
| 		// read hit valid cached
 | ||||
| 		else if(RW[1] & CacheHit) begin | ||||
| 		   | ||||
| 		  if(CPUBusy) begin | ||||
| 			NextState = STATE_CPU_BUSY; | ||||
|             //if(`REPLAY) PreSelAdr = 2'b01;
 | ||||
|             //else save = 1'b1;
 | ||||
| 		  end | ||||
| 		  else begin | ||||
| 			NextState = STATE_READY; | ||||
| 	      end | ||||
| 		end | ||||
| 		// write hit valid cached
 | ||||
| 		else if (RW[0] & CacheHit) begin | ||||
| 		  //PreSelAdr = 2'b01;
 | ||||
| 		   | ||||
| 		  if(CPUBusy) begin  | ||||
| 			NextState = STATE_CPU_BUSY; | ||||
| 			//if(`REPLAY) PreSelAdr = 2'b01;
 | ||||
|             //else save = 1'b1;
 | ||||
| 		  end | ||||
| 		  else begin | ||||
| 			NextState = STATE_READY; | ||||
| 		  end | ||||
| 		end | ||||
| 		// read or write miss valid cached
 | ||||
| 		else if((|RW) & ~CacheHit) begin | ||||
| 		  NextState = STATE_MISS_FETCH_WDV; | ||||
| 		end | ||||
| 		else NextState = STATE_READY; | ||||
|       end | ||||
|        | ||||
|       STATE_MISS_FETCH_WDV: begin | ||||
| 		//PreSelAdr = 2'b01;
 | ||||
| 		 | ||||
| 		if (CacheBusAck) begin | ||||
|           NextState = STATE_MISS_FETCH_DONE; | ||||
|         end else begin | ||||
|           NextState = STATE_MISS_FETCH_WDV; | ||||
|         end | ||||
|       end | ||||
| 
 | ||||
|       STATE_MISS_FETCH_DONE: begin | ||||
| 		//PreSelAdr = 2'b01;
 | ||||
| 		if(VictimDirty) begin | ||||
| 		  NextState = STATE_MISS_EVICT_DIRTY; | ||||
| 		end else begin | ||||
| 		  NextState = STATE_MISS_WRITE_CACHE_LINE; | ||||
| 		end | ||||
|       end | ||||
| 
 | ||||
|       STATE_MISS_WRITE_CACHE_LINE: begin | ||||
| 		NextState = STATE_MISS_READ_WORD; | ||||
| 		//PreSelAdr = 2'b01;
 | ||||
| 		//LRUWriteEn = 1'b1;  // DO not update LRU on SRAM fetch update.  Wait for subsequent read/write
 | ||||
|       end | ||||
| 
 | ||||
|       STATE_MISS_READ_WORD: begin | ||||
| 		//PreSelAdr = 2'b01;
 | ||||
| 		if (RW[0] & ~Atomic[1]) begin // handles stores and amo write.
 | ||||
| 		  NextState = STATE_MISS_WRITE_WORD; | ||||
| 		end else begin | ||||
| 		  NextState = STATE_MISS_READ_WORD_DELAY; | ||||
| 		  // delay state is required as the read signal RW[1] is still high when we
 | ||||
| 		  // return to the ready state because the cache is stalling the cpu.
 | ||||
| 		end | ||||
|       end | ||||
| 
 | ||||
|       STATE_MISS_READ_WORD_DELAY: begin | ||||
| 		if(&RW & Atomic[1]) begin // amo write
 | ||||
| 		  //PreSelAdr = 2'b01;
 | ||||
| 		  if(CPUBusy) begin  | ||||
| 			NextState = STATE_CPU_BUSY_FINISH_AMO; | ||||
|             //if(~`REPLAY) save = 1'b1;
 | ||||
| 		  end | ||||
| 		  else begin | ||||
| 			NextState = STATE_READY; | ||||
| 		  end | ||||
| 		end else begin | ||||
| 		  if(CPUBusy) begin  | ||||
| 			NextState = STATE_CPU_BUSY; | ||||
| 			//if(`REPLAY) PreSelAdr = 2'b01;
 | ||||
|             //else save = 1'b1;
 | ||||
| 		  end | ||||
| 		  else begin | ||||
| 			NextState = STATE_READY; | ||||
| 		  end | ||||
| 		end | ||||
|       end | ||||
| 
 | ||||
|       STATE_MISS_WRITE_WORD: begin | ||||
| 		//PreSelAdr = 2'b01;
 | ||||
| 		if(CPUBusy) begin  | ||||
| 		  NextState = STATE_CPU_BUSY; | ||||
| 		  //if(`REPLAY) PreSelAdr = 2'b01;
 | ||||
|           //else save = 1'b1;
 | ||||
| 		end | ||||
| 		else begin | ||||
| 		  NextState = STATE_READY; | ||||
| 		end | ||||
|       end | ||||
| 
 | ||||
|       STATE_MISS_EVICT_DIRTY: begin | ||||
| 		//PreSelAdr = 2'b01;
 | ||||
| 		if(CacheBusAck) begin | ||||
| 		  NextState = STATE_MISS_WRITE_CACHE_LINE; | ||||
| 		end else begin | ||||
| 		  NextState = STATE_MISS_EVICT_DIRTY; | ||||
| 		end	   | ||||
|       end | ||||
| 
 | ||||
| 
 | ||||
|       STATE_CPU_BUSY: begin | ||||
| 		//PreSelAdr = 2'b00;
 | ||||
| 		if(CPUBusy) begin | ||||
| 		  NextState = STATE_CPU_BUSY; | ||||
| 		  //if(`REPLAY) PreSelAdr = 2'b01;
 | ||||
| 		end | ||||
| 		else begin | ||||
| 		  NextState = STATE_READY; | ||||
| 		end | ||||
|       end | ||||
| 
 | ||||
|       STATE_CPU_BUSY_FINISH_AMO: begin | ||||
| 		//PreSelAdr = 2'b01;
 | ||||
| 		if(CPUBusy) begin | ||||
| 		  NextState = STATE_CPU_BUSY_FINISH_AMO; | ||||
| 		end | ||||
| 		else begin | ||||
| 		  NextState = STATE_READY; | ||||
| 		end | ||||
|       end | ||||
| 
 | ||||
| 	  STATE_FLUSH: begin | ||||
| 		// intialize flush counters
 | ||||
| 		//PreSelAdr = 2'b10;
 | ||||
| 		NextState = STATE_FLUSH_CHECK; | ||||
| 	  end		 | ||||
| 
 | ||||
|       STATE_FLUSH_CHECK: begin | ||||
| 		//PreSelAdr = 2'b10;
 | ||||
| 		if(VictimDirty) begin | ||||
| 		  NextState = STATE_FLUSH_WRITE_BACK; | ||||
| 		end else if (FlushAdrFlag & FlushWayFlag) begin | ||||
| 		  NextState = STATE_READY; | ||||
| 		  //PreSelAdr = 2'b00;
 | ||||
| 		end else if(FlushWayFlag) begin | ||||
| 		  NextState = STATE_FLUSH_INCR; | ||||
| 		end else begin | ||||
| 		  NextState = STATE_FLUSH_CHECK; | ||||
| 		end | ||||
|       end | ||||
| 	   | ||||
| 	  STATE_FLUSH_INCR: begin | ||||
| 		//PreSelAdr = 2'b10;
 | ||||
| 		NextState = STATE_FLUSH_CHECK; | ||||
| 	  end | ||||
| 
 | ||||
|       STATE_FLUSH_WRITE_BACK: begin | ||||
| 		//PreSelAdr = 2'b10;
 | ||||
| 		if(CacheBusAck) begin | ||||
| 		  NextState = STATE_FLUSH_CLEAR_DIRTY; | ||||
| 		end else begin | ||||
| 		  NextState = STATE_FLUSH_WRITE_BACK; | ||||
| 		end	   | ||||
|       end | ||||
| 
 | ||||
|       STATE_FLUSH_CLEAR_DIRTY: begin | ||||
| 		//PreSelAdr = 2'b10;
 | ||||
| 		if(FlushAdrFlag & FlushWayFlag) begin | ||||
| 		  NextState = STATE_READY; | ||||
| 		  //PreSelAdr = 2'b00;
 | ||||
| 		end else if (FlushWayFlag) begin | ||||
| 		  NextState = STATE_FLUSH_INCR; | ||||
| 		   | ||||
| 		end else begin | ||||
| 		  NextState = STATE_FLUSH_CHECK; | ||||
| 		end | ||||
|       end | ||||
| 
 | ||||
|       default: begin | ||||
| 		NextState = STATE_READY; | ||||
|       end | ||||
|       STATE_READY: if(DoFlush)                                      NextState = STATE_FLUSH; | ||||
|                    else if(DoAMOHit & CPUBusy)                      NextState = STATE_CPU_BUSY_FINISH_AMO; | ||||
|                    else if(DoReadHit & CPUBusy)                     NextState = STATE_CPU_BUSY; | ||||
|                    else if (DoWriteHit & CPUBusy)                   NextState = STATE_CPU_BUSY; | ||||
|                    else if(DoReadMiss | DoWriteMiss | DoAMOMiss)    NextState = STATE_MISS_FETCH_WDV; | ||||
|                    else                                             NextState = STATE_READY; | ||||
|       STATE_MISS_FETCH_WDV: if (CacheBusAck)                        NextState = STATE_MISS_FETCH_DONE; | ||||
|                             else                                    NextState = STATE_MISS_FETCH_WDV; | ||||
|       STATE_MISS_FETCH_DONE: if(VictimDirty)                        NextState = STATE_MISS_EVICT_DIRTY; | ||||
|                              else                                   NextState = STATE_MISS_WRITE_CACHE_LINE; | ||||
|       STATE_MISS_WRITE_CACHE_LINE:                                  NextState = STATE_MISS_READ_WORD; | ||||
|       STATE_MISS_READ_WORD: if (DoWrite & ~DoAMO)                   NextState = STATE_MISS_WRITE_WORD; | ||||
|                             else                                    NextState = STATE_MISS_READ_WORD_DELAY; | ||||
|       STATE_MISS_READ_WORD_DELAY: if(DoAMO & CPUBusy)               NextState = STATE_CPU_BUSY_FINISH_AMO; | ||||
|                                   else if(CPUBusy)                  NextState = STATE_CPU_BUSY; | ||||
|                                   else                              NextState = STATE_READY; | ||||
|       STATE_MISS_WRITE_WORD: if(CPUBusy)                            NextState = STATE_CPU_BUSY; | ||||
|                              else                                   NextState = STATE_READY; | ||||
|       STATE_MISS_EVICT_DIRTY: if(CacheBusAck)                       NextState = STATE_MISS_WRITE_CACHE_LINE; | ||||
|                               else                                  NextState = STATE_MISS_EVICT_DIRTY; | ||||
|       STATE_CPU_BUSY: if(CPUBusy)                                   NextState = STATE_CPU_BUSY; | ||||
|                       else                                          NextState = STATE_READY; | ||||
|       STATE_CPU_BUSY_FINISH_AMO: if(CPUBusy)                        NextState = STATE_CPU_BUSY_FINISH_AMO; | ||||
|                                  else                               NextState = STATE_READY; | ||||
| 	  STATE_FLUSH:                                                  NextState = STATE_FLUSH_CHECK; | ||||
|       STATE_FLUSH_CHECK: if(VictimDirty)                            NextState = STATE_FLUSH_WRITE_BACK; | ||||
|                          else if (FlushAdrFlag & FlushWayFlag)      NextState = STATE_READY; | ||||
|                          else if(FlushWayFlag)                      NextState = STATE_FLUSH_INCR; | ||||
|                          else                                       NextState = STATE_FLUSH_CHECK; | ||||
| 	  STATE_FLUSH_INCR:                                             NextState = STATE_FLUSH_CHECK; | ||||
|       STATE_FLUSH_WRITE_BACK: if(CacheBusAck)                       NextState = STATE_FLUSH_CLEAR_DIRTY; | ||||
|                               else                                  NextState = STATE_FLUSH_WRITE_BACK; | ||||
|       STATE_FLUSH_CLEAR_DIRTY: if(FlushAdrFlag & FlushWayFlag)      NextState = STATE_READY; | ||||
|                                else if (FlushWayFlag)               NextState = STATE_FLUSH_INCR; | ||||
|                                else                                 NextState = STATE_FLUSH_CHECK; | ||||
|       default:                                                      NextState = STATE_READY; | ||||
|     endcase | ||||
|   end | ||||
| 
 | ||||
| @ -377,7 +193,6 @@ module cachefsm | ||||
|                       (CurrState == STATE_FLUSH_CLEAR_DIRTY & ~(FlushAdrFlag & FlushWayFlag)); | ||||
|   assign SetValid = CurrState == STATE_MISS_WRITE_CACHE_LINE; | ||||
|   assign ClearValid = '0; | ||||
|   // *** setdirty can probably be simplified by not caring about cpubusy
 | ||||
|   assign SetDirty = (CurrState == STATE_READY & DoAMO) | | ||||
|                     (CurrState == STATE_READY & DoWrite) | | ||||
|                     (CurrState == STATE_MISS_READ_WORD_DELAY & DoAMO) | | ||||
| @ -388,6 +203,7 @@ module cachefsm | ||||
|                                (CurrState == STATE_MISS_READ_WORD_DELAY & DoAMO) | | ||||
|                                (CurrState == STATE_MISS_WRITE_WORD); | ||||
|   assign SRAMLineWriteEnable = (CurrState == STATE_MISS_WRITE_CACHE_LINE); | ||||
|   assign VDWriteEnable = (CurrState == STATE_FLUSH_CLEAR_DIRTY); | ||||
|   assign SelEvict = (CurrState == STATE_MISS_EVICT_DIRTY); | ||||
|   assign LRUWriteEn = (CurrState == STATE_READY & (DoAMOHit | DoReadHit | DoWriteHit)) | | ||||
|                       (CurrState == STATE_MISS_READ_WORD_DELAY) | | ||||
| @ -401,7 +217,6 @@ module cachefsm | ||||
|                          (CurrState == STATE_FLUSH_CLEAR_DIRTY & ~(FlushAdrFlag & FlushWayFlag)); | ||||
|   assign FlushAdrCntRst = (CurrState == STATE_READY & DoFlush); | ||||
|   assign FlushWayCntRst = (CurrState == STATE_READY & DoFlush) | (CurrState == STATE_FLUSH_INCR); | ||||
|   assign VDWriteEnable = (CurrState == STATE_FLUSH_CLEAR_DIRTY); | ||||
|   assign CacheFetchLine = (CurrState == STATE_READY & (DoAMOMiss | DoWriteMiss | DoReadMiss)); | ||||
|   assign CacheWriteLine = (CurrState == STATE_MISS_FETCH_DONE & VictimDirty) | | ||||
|                           (CurrState == STATE_FLUSH_CHECK & VictimDirty); | ||||
| @ -409,7 +224,8 @@ module cachefsm | ||||
|   assign save = ((CurrState == STATE_READY & (DoAMOHit | DoReadHit | DoWriteHit) & CPUBusy) | | ||||
|                  (CurrState == STATE_MISS_READ_WORD_DELAY & (DoAMO | DoRead) & CPUBusy) | | ||||
|                  (CurrState == STATE_MISS_WRITE_WORD & DoWrite & CPUBusy)) & ~`REPLAY; | ||||
|    | ||||
| 
 | ||||
|   // **** can this be simplified?
 | ||||
|   assign PreSelAdr = ((CurrState == STATE_READY & IgnoreRequest) |  | ||||
|                       (CurrState == STATE_READY & DoAMOHit) | | ||||
|                       (CurrState == STATE_READY & DoReadHit & (CPUBusy & `REPLAY)) | | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user