mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Fixed dcache to prevent latches in FPGA synthesized design.
This commit is contained in:
		
							parent
							
								
									6f4542f063
								
							
						
					
					
						commit
						5744796431
					
				
							
								
								
									
										64
									
								
								wally-pipelined/src/cache/dcachefsm.sv
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										64
									
								
								wally-pipelined/src/cache/dcachefsm.sv
									
									
									
									
										vendored
									
									
								
							@ -136,6 +136,16 @@ module dcachefsm
 | 
				
			|||||||
    if (reset)    CurrState <= #1 STATE_READY;
 | 
					    if (reset)    CurrState <= #1 STATE_READY;
 | 
				
			||||||
    else CurrState <= #1 NextState;
 | 
					    else CurrState <= #1 NextState;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -----\/----- EXCLUDED -----\/-----
 | 
				
			||||||
 | 
					  flopenl #(.TYPE(statetype))
 | 
				
			||||||
 | 
					  StateReg(.clk,
 | 
				
			||||||
 | 
						   .load(reset),
 | 
				
			||||||
 | 
						   .en(1'b1),
 | 
				
			||||||
 | 
						   .d(NextState),
 | 
				
			||||||
 | 
						   .q(CurrState),
 | 
				
			||||||
 | 
						   .val(STATE_READY));
 | 
				
			||||||
 | 
					 -----/\----- EXCLUDED -----/\----- */
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  // next state logic and some state ouputs.
 | 
					  // next state logic and some state ouputs.
 | 
				
			||||||
  always_comb begin
 | 
					  always_comb begin
 | 
				
			||||||
@ -158,9 +168,23 @@ module dcachefsm
 | 
				
			|||||||
    DCacheMiss = 1'b0;
 | 
					    DCacheMiss = 1'b0;
 | 
				
			||||||
    LRUWriteEn = 1'b0;
 | 
					    LRUWriteEn = 1'b0;
 | 
				
			||||||
    MemAfterIWalkDone = 1'b0;
 | 
					    MemAfterIWalkDone = 1'b0;
 | 
				
			||||||
 | 
					    NextState = STATE_READY;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case (CurrState)
 | 
					    case (CurrState)
 | 
				
			||||||
      STATE_READY: begin
 | 
					      STATE_READY: begin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						CntReset = 1'b0;
 | 
				
			||||||
 | 
						DCacheStall = 1'b0;
 | 
				
			||||||
 | 
						AHBRead = 1'b0;	  
 | 
				
			||||||
 | 
						AHBWrite = 1'b0;
 | 
				
			||||||
 | 
						DCacheAccess = 1'b0;
 | 
				
			||||||
 | 
						DCacheMiss = 1'b0;
 | 
				
			||||||
 | 
						SelAdrM = 2'b00;
 | 
				
			||||||
 | 
						SRAMWordWriteEnableM = 1'b0;
 | 
				
			||||||
 | 
						SetDirty = 1'b0;
 | 
				
			||||||
 | 
						LRUWriteEn = 1'b0;
 | 
				
			||||||
 | 
						CommittedM = 1'b0;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	// TLB Miss	
 | 
						// TLB Miss	
 | 
				
			||||||
	if((AnyCPUReqM & DTLBMissM) | ITLBMissF) begin
 | 
						if((AnyCPUReqM & DTLBMissM) | ITLBMissF) begin
 | 
				
			||||||
	  // the LSU arbiter has not yet selected the PTW.
 | 
						  // the LSU arbiter has not yet selected the PTW.
 | 
				
			||||||
@ -301,6 +325,9 @@ module dcachefsm
 | 
				
			|||||||
      STATE_MISS_READ_WORD_DELAY: begin
 | 
					      STATE_MISS_READ_WORD_DELAY: begin
 | 
				
			||||||
	//SelAdrM = 2'b10;
 | 
						//SelAdrM = 2'b10;
 | 
				
			||||||
	CommittedM = 1'b1;
 | 
						CommittedM = 1'b1;
 | 
				
			||||||
 | 
						SRAMWordWriteEnableM = 1'b0;
 | 
				
			||||||
 | 
						SetDirty = 1'b0;
 | 
				
			||||||
 | 
						LRUWriteEn = 1'b0;
 | 
				
			||||||
	if(&MemRWM & AtomicM[1]) begin // amo write
 | 
						if(&MemRWM & AtomicM[1]) begin // amo write
 | 
				
			||||||
	  SelAdrM = 2'b10;
 | 
						  SelAdrM = 2'b10;
 | 
				
			||||||
	  if(StallWtoDCache) begin 
 | 
						  if(StallWtoDCache) begin 
 | 
				
			||||||
@ -356,6 +383,10 @@ module dcachefsm
 | 
				
			|||||||
      STATE_PTW_READY: begin
 | 
					      STATE_PTW_READY: begin
 | 
				
			||||||
	// now all output connect to PTW instead of CPU.
 | 
						// now all output connect to PTW instead of CPU.
 | 
				
			||||||
	CommittedM = 1'b1;
 | 
						CommittedM = 1'b1;
 | 
				
			||||||
 | 
						SelAdrM = 2'b00;
 | 
				
			||||||
 | 
						DCacheStall = 1'b0;
 | 
				
			||||||
 | 
						LRUWriteEn = 1'b0;
 | 
				
			||||||
 | 
						CntReset = 1'b0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// In this branch we remove stall and go back to ready.  There is no request for memory from the
 | 
						// In this branch we remove stall and go back to ready.  There is no request for memory from the
 | 
				
			||||||
	// datapath or the walker had a fault.
 | 
						// datapath or the walker had a fault.
 | 
				
			||||||
@ -489,6 +520,7 @@ module dcachefsm
 | 
				
			|||||||
      
 | 
					      
 | 
				
			||||||
      STATE_CPU_BUSY: begin
 | 
					      STATE_CPU_BUSY: begin
 | 
				
			||||||
	CommittedM = 1'b1;
 | 
						CommittedM = 1'b1;
 | 
				
			||||||
 | 
						SelAdrM = 2'b00;
 | 
				
			||||||
	if(StallWtoDCache) begin
 | 
						if(StallWtoDCache) begin
 | 
				
			||||||
	  NextState = STATE_CPU_BUSY;
 | 
						  NextState = STATE_CPU_BUSY;
 | 
				
			||||||
	  SelAdrM = 2'b10;
 | 
						  SelAdrM = 2'b10;
 | 
				
			||||||
@ -501,6 +533,9 @@ module dcachefsm
 | 
				
			|||||||
      STATE_CPU_BUSY_FINISH_AMO: begin
 | 
					      STATE_CPU_BUSY_FINISH_AMO: begin
 | 
				
			||||||
	CommittedM = 1'b1;
 | 
						CommittedM = 1'b1;
 | 
				
			||||||
	SelAdrM = 2'b10;
 | 
						SelAdrM = 2'b10;
 | 
				
			||||||
 | 
						SRAMWordWriteEnableM = 1'b0;
 | 
				
			||||||
 | 
						SetDirty = 1'b0;
 | 
				
			||||||
 | 
						LRUWriteEn = 1'b0;
 | 
				
			||||||
	if(StallWtoDCache) begin
 | 
						if(StallWtoDCache) begin
 | 
				
			||||||
	  NextState = STATE_CPU_BUSY_FINISH_AMO;
 | 
						  NextState = STATE_CPU_BUSY_FINISH_AMO;
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
@ -523,7 +558,7 @@ module dcachefsm
 | 
				
			|||||||
	end
 | 
						end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      STATE_UNCACHED_READ : begin
 | 
					      STATE_UNCACHED_READ: begin
 | 
				
			||||||
	DCacheStall = 1'b1;	
 | 
						DCacheStall = 1'b1;	
 | 
				
			||||||
	AHBRead = 1'b1;
 | 
						AHBRead = 1'b1;
 | 
				
			||||||
	CommittedM = 1'b1;
 | 
						CommittedM = 1'b1;
 | 
				
			||||||
@ -536,6 +571,7 @@ module dcachefsm
 | 
				
			|||||||
      
 | 
					      
 | 
				
			||||||
      STATE_UNCACHED_WRITE_DONE: begin
 | 
					      STATE_UNCACHED_WRITE_DONE: begin
 | 
				
			||||||
	CommittedM = 1'b1;
 | 
						CommittedM = 1'b1;
 | 
				
			||||||
 | 
						SelAdrM = 2'b00;
 | 
				
			||||||
	if(StallWtoDCache) begin
 | 
						if(StallWtoDCache) begin
 | 
				
			||||||
	  NextState = STATE_CPU_BUSY;
 | 
						  NextState = STATE_CPU_BUSY;
 | 
				
			||||||
	  SelAdrM = 2'b10;
 | 
						  SelAdrM = 2'b10;
 | 
				
			||||||
@ -548,6 +584,7 @@ module dcachefsm
 | 
				
			|||||||
      STATE_UNCACHED_READ_DONE: begin
 | 
					      STATE_UNCACHED_READ_DONE: begin
 | 
				
			||||||
	CommittedM = 1'b1;
 | 
						CommittedM = 1'b1;
 | 
				
			||||||
	SelUncached = 1'b1;
 | 
						SelUncached = 1'b1;
 | 
				
			||||||
 | 
						SelAdrM = 2'b00;
 | 
				
			||||||
	if(StallWtoDCache) begin 
 | 
						if(StallWtoDCache) begin 
 | 
				
			||||||
	  NextState = STATE_CPU_BUSY;
 | 
						  NextState = STATE_CPU_BUSY;
 | 
				
			||||||
	  SelAdrM = 2'b10;
 | 
						  SelAdrM = 2'b10;
 | 
				
			||||||
@ -560,6 +597,21 @@ module dcachefsm
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      // itlb => instruction page fault states with memory request.
 | 
					      // itlb => instruction page fault states with memory request.
 | 
				
			||||||
      STATE_PTW_FAULT_READY: begin
 | 
					      STATE_PTW_FAULT_READY: begin
 | 
				
			||||||
 | 
						DCacheStall = 1'b0;
 | 
				
			||||||
 | 
						DCacheAccess = 1'b0;
 | 
				
			||||||
 | 
						DCacheMiss = 1'b0;
 | 
				
			||||||
 | 
						LRUWriteEn = 1'b0;
 | 
				
			||||||
 | 
						SelAdrM = 2'b00;
 | 
				
			||||||
 | 
						MemAfterIWalkDone = 1'b0;
 | 
				
			||||||
 | 
						SetDirty = 1'b0;
 | 
				
			||||||
 | 
						LRUWriteEn = 1'b0;
 | 
				
			||||||
 | 
						CntReset = 1'b0;
 | 
				
			||||||
 | 
						AHBWrite = 1'b0;
 | 
				
			||||||
 | 
						AHBRead = 1'b0;
 | 
				
			||||||
 | 
						CommittedM = 1'b0;
 | 
				
			||||||
 | 
						NextState = STATE_READY;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	// read hit valid cached
 | 
						// read hit valid cached
 | 
				
			||||||
	if(MemRWM[1] & CacheableM & CacheHit & ~DTLBMissM) begin
 | 
						if(MemRWM[1] & CacheableM & CacheHit & ~DTLBMissM) begin
 | 
				
			||||||
	  DCacheStall = 1'b0;
 | 
						  DCacheStall = 1'b0;
 | 
				
			||||||
@ -614,6 +666,7 @@ module dcachefsm
 | 
				
			|||||||
	  CntReset = 1'b1;
 | 
						  CntReset = 1'b1;
 | 
				
			||||||
	  DCacheStall = 1'b1;
 | 
						  DCacheStall = 1'b1;
 | 
				
			||||||
	  AHBRead = 1'b1;	  
 | 
						  AHBRead = 1'b1;	  
 | 
				
			||||||
 | 
						  MemAfterIWalkDone = 1'b0;
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	// fault
 | 
						// fault
 | 
				
			||||||
	else  begin
 | 
						else  begin
 | 
				
			||||||
@ -626,11 +679,13 @@ module dcachefsm
 | 
				
			|||||||
	CommittedM = 1'b1;
 | 
						CommittedM = 1'b1;
 | 
				
			||||||
	if(StallWtoDCache) begin
 | 
						if(StallWtoDCache) begin
 | 
				
			||||||
	  NextState = STATE_PTW_FAULT_CPU_BUSY;
 | 
						  NextState = STATE_PTW_FAULT_CPU_BUSY;
 | 
				
			||||||
 | 
						  MemAfterIWalkDone = 1'b0;
 | 
				
			||||||
	  SelAdrM = 2'b10;
 | 
						  SelAdrM = 2'b10;
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	else begin
 | 
						else begin
 | 
				
			||||||
	  MemAfterIWalkDone = 1'b1;
 | 
						  MemAfterIWalkDone = 1'b1;
 | 
				
			||||||
	  NextState = STATE_READY;
 | 
						  NextState = STATE_READY;
 | 
				
			||||||
 | 
						  SelAdrM = 2'b00;
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -690,10 +745,12 @@ module dcachefsm
 | 
				
			|||||||
	if(StallWtoDCache) begin 
 | 
						if(StallWtoDCache) begin 
 | 
				
			||||||
	  NextState = STATE_PTW_FAULT_CPU_BUSY;
 | 
						  NextState = STATE_PTW_FAULT_CPU_BUSY;
 | 
				
			||||||
	  SelAdrM = 2'b10;
 | 
						  SelAdrM = 2'b10;
 | 
				
			||||||
 | 
						  MemAfterIWalkDone = 1'b0;
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	else begin
 | 
						else begin
 | 
				
			||||||
	  MemAfterIWalkDone = 1'b1;
 | 
						  MemAfterIWalkDone = 1'b1;
 | 
				
			||||||
	  NextState = STATE_READY;
 | 
						  NextState = STATE_READY;
 | 
				
			||||||
 | 
						  SelAdrM = 2'b00;
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -711,11 +768,13 @@ module dcachefsm
 | 
				
			|||||||
	CommittedM = 1'b1;
 | 
						CommittedM = 1'b1;
 | 
				
			||||||
	if(StallWtoDCache) begin 
 | 
						if(StallWtoDCache) begin 
 | 
				
			||||||
	  NextState = STATE_PTW_FAULT_CPU_BUSY;
 | 
						  NextState = STATE_PTW_FAULT_CPU_BUSY;
 | 
				
			||||||
 | 
						  MemAfterIWalkDone = 1'b0;
 | 
				
			||||||
	  SelAdrM = 2'b10;
 | 
						  SelAdrM = 2'b10;
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	else begin
 | 
						else begin
 | 
				
			||||||
	  MemAfterIWalkDone = 1'b1;
 | 
						  MemAfterIWalkDone = 1'b1;
 | 
				
			||||||
	  NextState = STATE_READY;
 | 
						  NextState = STATE_READY;
 | 
				
			||||||
 | 
						  SelAdrM = 2'b00;
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -760,11 +819,13 @@ module dcachefsm
 | 
				
			|||||||
	CommittedM = 1'b1;
 | 
						CommittedM = 1'b1;
 | 
				
			||||||
	if(StallWtoDCache) begin
 | 
						if(StallWtoDCache) begin
 | 
				
			||||||
	  NextState = STATE_PTW_FAULT_CPU_BUSY;
 | 
						  NextState = STATE_PTW_FAULT_CPU_BUSY;
 | 
				
			||||||
 | 
						  MemAfterIWalkDone = 1'b0;
 | 
				
			||||||
	  SelAdrM = 2'b10;
 | 
						  SelAdrM = 2'b10;
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
	else begin
 | 
						else begin
 | 
				
			||||||
	  MemAfterIWalkDone = 1'b1;
 | 
						  MemAfterIWalkDone = 1'b1;
 | 
				
			||||||
	  NextState = STATE_READY;
 | 
						  NextState = STATE_READY;
 | 
				
			||||||
 | 
						  SelAdrM = 2'b00;
 | 
				
			||||||
	end
 | 
						end
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -782,6 +843,7 @@ module dcachefsm
 | 
				
			|||||||
      end
 | 
					      end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      default: begin
 | 
					      default: begin
 | 
				
			||||||
 | 
						NextState = STATE_READY;
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    endcase
 | 
					    endcase
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user