mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Minor improvement to icache.
This commit is contained in:
		
							parent
							
								
									a130c03478
								
							
						
					
					
						commit
						36451bbd15
					
				| @ -118,11 +118,13 @@ module ifu ( | ||||
|   logic 					   IgnoreRequest; | ||||
|   logic 					   CPUBusy; | ||||
|    | ||||
|   logic [15:0] 		   SpillDataBlock0; | ||||
|   logic [31:0] 		   PostSpillInstrRawF; | ||||
| 
 | ||||
|   assign PCFp2 = PCF + `XLEN'b10; | ||||
|    | ||||
|   assign PCNextFMux = SelNextSpill ? PCFp2[11:0] : PCNextF[11:0]; | ||||
|   assign PCFMux = SelSpill ? PCFp2 : PCF;   | ||||
|   assign PCFMux = SelSpill ? PCFp2 : PCF; | ||||
|    | ||||
| 
 | ||||
|   assign Spill = &PCF[$clog2(`ICACHE_BLOCKLENINBITS/32)+1:1]; | ||||
| @ -136,36 +138,30 @@ module ifu ( | ||||
|     else CurrState <= #1 NextState; | ||||
| 
 | ||||
|   always_comb begin | ||||
| 	NextState = STATE_SPILL_READY; | ||||
| 	SelSpill = 0; | ||||
| 	SelNextSpill = 0; | ||||
| 	SpillSave = 0; | ||||
| 	case(CurrState) | ||||
| 	  STATE_SPILL_READY: begin | ||||
| 		if (Spill & ~(ICacheStallF | BusStall)) begin | ||||
| 		  NextState = STATE_SPILL_SPILL; | ||||
| 		  SpillSave = 1; | ||||
| 		  SelNextSpill = 1; | ||||
| 		end else begin | ||||
| 		  NextState = STATE_SPILL_READY; | ||||
| 		end | ||||
| 	  end | ||||
| 	  STATE_SPILL_SPILL: begin | ||||
| 		SelSpill = 1; | ||||
| 		if(ICacheStallF | BusStall) begin | ||||
| 		  SelNextSpill = 1; | ||||
| 		end | ||||
| 		if(ICacheStallF | BusStall | StallF) begin | ||||
| 		  NextState = STATE_SPILL_SPILL; | ||||
| 		end else begin | ||||
| 		  NextState = STATE_SPILL_READY; | ||||
| 		end | ||||
| 	  end | ||||
| 	  default: NextState = STATE_SPILL_READY; | ||||
| 	  STATE_SPILL_READY: if (Spill & ~(ICacheStallF | BusStall)) NextState = STATE_SPILL_SPILL; | ||||
|                          else                                    NextState = STATE_SPILL_READY; | ||||
| 	  STATE_SPILL_SPILL: if(ICacheStallF | BusStall | StallF)    NextState = STATE_SPILL_SPILL; | ||||
| 	                     else                                    NextState = STATE_SPILL_READY; | ||||
| 	  default:                                                   NextState = STATE_SPILL_READY; | ||||
| 	endcase | ||||
|   end | ||||
| 
 | ||||
|   assign SelSpill = CurrState == STATE_SPILL_SPILL; | ||||
|   assign SelNextSpill = (CurrState == STATE_SPILL_READY & (Spill & ~(ICacheStallF | BusStall))) | | ||||
| 						 (CurrState == STATE_SPILL_SPILL & (ICacheStallF | BusStall)); | ||||
|   assign SpillSave = CurrState == STATE_SPILL_READY & (Spill & ~(ICacheStallF | BusStall)); | ||||
|    | ||||
| 
 | ||||
|   flopenr #(16) SpillInstrReg(.clk(clk), | ||||
| 							  .en(SpillSave), | ||||
| 							  .reset(reset), | ||||
| 							  .d(InstrRawF[15:0]), | ||||
| 							  .q(SpillDataBlock0)); | ||||
| 
 | ||||
|   assign PostSpillInstrRawF = Spill ? {InstrRawF[15:0], SpillDataBlock0} : InstrRawF; | ||||
|   assign CompressedF = PostSpillInstrRawF[1:0] != 2'b11; | ||||
| 
 | ||||
|    | ||||
| 
 | ||||
|   assign PCFExt = {2'b00, PCFMux}; | ||||
| @ -233,21 +229,14 @@ module ifu ( | ||||
|   logic [`PA_BITS-1:0] LocalIfuBusAdr; | ||||
|   logic [`PA_BITS-1:0] ICacheBusAdr; | ||||
|   logic 			   SelUncachedAdr; | ||||
|   logic [15:0] 		   SpillDataBlock0; | ||||
|   logic [31:0] 		   PostSpillInstrRawF; | ||||
|    | ||||
|    | ||||
|   assign CompressedF = PostSpillInstrRawF[1:0] != 2'b11; | ||||
|    | ||||
| 
 | ||||
|   // *** bug: on spill the second memory request does not go through the mmu(skips tlb, pmp, and pma checkers)
 | ||||
|   // also it is possible to have any above fault on the spilled accesses.
 | ||||
|   // I think the solution is to move the spill logic into the ifu using the busfsm and ensuring
 | ||||
|   // the mmu sees the spilled address.
 | ||||
|   generate | ||||
| 	if(`MEM_ICACHE) begin : icache | ||||
| 	  icache icache(.clk, .reset, .CPUBusy, .IgnoreRequest, .ICacheMemWriteData , .ICacheBusAck, | ||||
| 					.ICacheBusAdr, .ICacheStallF, .FinalInstrRawF,  | ||||
| 					.ICacheBusAdr, .ICacheStallF, .FinalInstrRawF, | ||||
| 					.ICacheFetchLine, | ||||
| 					.CacheableF, | ||||
| 					.PCNextF(PCNextFMux), | ||||
| @ -270,13 +259,6 @@ module ifu ( | ||||
| 				.s(SelUncachedAdr), | ||||
| 				.y(InstrRawF)); | ||||
| 
 | ||||
|   flopenr #(16) SpillInstrReg(.clk(clk), | ||||
| 							  .en(SpillSave), | ||||
| 							  .reset(reset), | ||||
| 							  .d(InstrRawF[15:0]), | ||||
| 							  .q(SpillDataBlock0)); | ||||
| 
 | ||||
|   assign PostSpillInstrRawF = Spill ? {InstrRawF[15:0], SpillDataBlock0} : InstrRawF; | ||||
|    | ||||
|    | ||||
| 
 | ||||
| @ -306,6 +288,8 @@ module ifu ( | ||||
|   assign CPUBusy = StallF & ~SelNextSpill; | ||||
| 
 | ||||
|   //assign IgnoreRequest = ITLBMissF | ExceptionM | PendingInterruptM;
 | ||||
|   // this is a difference with the dcache.
 | ||||
|   // uses interlock fsm.
 | ||||
|   assign IgnoreRequest = ITLBMissF; | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user