mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Removed mux in PCNextF logic. Minor IFU improvements.
This commit is contained in:
		
							parent
							
								
									42ef1e22e5
								
							
						
					
					
						commit
						cc5a9a015b
					
				| @ -96,7 +96,6 @@ module ifu ( | ||||
|   logic [`XLEN-1:0]            PCD; | ||||
| 
 | ||||
|   localparam [31:0]            nop = 32'h00000013; // instruction for NOP
 | ||||
|   logic                        reset_q; // see comment below about PCNextF and icache.
 | ||||
| 
 | ||||
|   logic [`XLEN-1:0] 		   PCBPWrongInvalidate; | ||||
|   logic 					   BPPredWrongM; | ||||
| @ -106,8 +105,8 @@ module ifu ( | ||||
|   logic [`XLEN+1:0]            PCFExt; | ||||
| 
 | ||||
|   logic 					   CacheableF; | ||||
|   logic [`XLEN-1:0]			   PCNextFMux; | ||||
|   logic [`XLEN-1:0] 		   PCFMux; | ||||
|   logic [`XLEN-1:0]			   PCNextFSpill; | ||||
|   logic [`XLEN-1:0] 		   PCFSpill; | ||||
|   logic 					   SelNextSpill; | ||||
|   logic 					   ICacheFetchLine; | ||||
|   logic 					   BusStall; | ||||
| @ -127,8 +126,8 @@ module ifu ( | ||||
| 	// this exists only if there are compressed instructions.
 | ||||
| 	assign PCFp2 = PCF + `XLEN'b10; | ||||
|      | ||||
| 	assign PCNextFMux = SelNextSpill ? PCFp2 : PCNextF; | ||||
| 	assign PCFMux = SelSpill ? PCFp2 : PCF; | ||||
| 	assign PCNextFSpill = SelNextSpill ? PCFp2 : PCNextF; | ||||
| 	assign PCFSpill = SelSpill ? PCFp2 : PCF; | ||||
|      | ||||
| 	assign Spill = &PCF[$clog2(SPILLTHRESHOLD)+1:1]; | ||||
| 
 | ||||
| @ -167,18 +166,18 @@ module ifu ( | ||||
| 
 | ||||
| 	// end of spill support
 | ||||
|   end else begin : NoSpillSupport // line: SpillSupport
 | ||||
| 	assign PCNextFMux = PCNextF; | ||||
| 	assign PCFMux = PCF; | ||||
| 	assign PCNextFSpill = PCNextF; | ||||
| 	assign PCFSpill = PCF; | ||||
| 	assign SelNextSpill = 0; | ||||
| 	assign PostSpillInstrRawF = InstrRawF; | ||||
|   end | ||||
|    | ||||
| 
 | ||||
|   assign PCFExt = {2'b00, PCFMux}; | ||||
|   assign PCFExt = {2'b00, PCFSpill}; | ||||
| 
 | ||||
|   mmu #(.TLB_ENTRIES(`ITLB_ENTRIES), .IMMU(1)) | ||||
|   immu(.PAdr(PCFExt[`PA_BITS-1:0]), | ||||
|        .VAdr(PCFMux), | ||||
|        .VAdr(PCFSpill), | ||||
|        .Size(2'b10), | ||||
|        .PTE(PTE), | ||||
|        .PageTypeWriteVal(PageType), | ||||
| @ -235,7 +234,7 @@ module ifu ( | ||||
|     simpleram #( | ||||
|         .BASE(`RAM_BASE), .RANGE(`RAM_RANGE)) ram ( | ||||
|         .clk,  | ||||
|         .a(CPUBusy | reset ? PCPF[31:0] : PCNextFMux[31:0]), // mux is also inside $, have to replay address if CPU is stalled.
 | ||||
|         .a(CPUBusy | reset ? PCPF[31:0] : PCNextFSpill[31:0]), // mux is also inside $, have to replay address if CPU is stalled.
 | ||||
|         .we(1'b0), | ||||
|         .wd(0), .rd(FinalInstrRawF_FIXME)); | ||||
| 	  assign FinalInstrRawF = FinalInstrRawF_FIXME[31:0]; | ||||
| @ -286,7 +285,7 @@ module ifu ( | ||||
| 		   .RW(IFURWF),  | ||||
| 		   .Atomic(2'b00), | ||||
| 		   .FlushCache(1'b0), | ||||
| 		   .NextAdr(PCNextFMux[11:0]), | ||||
| 		   .NextAdr(PCNextFSpill[11:0]), | ||||
| 		   .PAdr(PCPF), | ||||
| 		   .CacheCommitted(), | ||||
| 		   .InvalidateCacheM(InvalidateICacheM)); | ||||
| @ -303,7 +302,7 @@ module ifu ( | ||||
|    | ||||
|   // branch predictor signal
 | ||||
|   logic                        SelBPPredF; | ||||
|   logic [`XLEN-1:0]            BPPredPCF, PCNext0F, PCNext1F, PCNext2F, PCNext3F; | ||||
|   logic [`XLEN-1:0]            BPPredPCF, PCNext0F, PCNext1F, PCNext2F; | ||||
|   logic [4:0]                  InstrClassD, InstrClassE; | ||||
| 
 | ||||
| 
 | ||||
| @ -333,13 +332,7 @@ module ifu ( | ||||
|   mux2 #(`XLEN) pcmux2(.d0(PCNext1F), .d1(PCBPWrongInvalidate), .s(InvalidateICacheM), .y(PCNext2F)); | ||||
|   // Mux only required on instruction class miss prediction.
 | ||||
|   mux2 #(`XLEN) pcmuxBPWrongInvalidateFlush(.d0(PCE), .d1(PCF), .s(BPPredWrongM), .y(PCBPWrongInvalidate)); | ||||
|   mux2 #(`XLEN) pcmux3(.d0(PCNext2F), .d1(PrivilegedNextPCM), .s(PrivilegedChangePCM), .y(PCNext3F)); | ||||
|   // This mux is required as PCNextF needs to be the valid reset vector during reset.
 | ||||
|   // Reseting PCF does not accomplish this as PCNextF will be +2/4 more than PCF.
 | ||||
|   //mux2 #(`XLEN) pcmux4(.d0(PCNext3F), .d1(`RESET_VECTOR), .s(`MEM_IROM ? reset : reset_q), .y(UnalignedPCNextF));
 | ||||
|  // mux2 #(`XLEN) pcmux4(.d0(PCNext3F), .d1(`RESET_VECTOR), .s(reset), .y(UnalignedPCNextF));  // ******* probably can get rid of by making reset SelAdr = 01
 | ||||
|   assign UnalignedPCNextF = PCNext3F; | ||||
|    | ||||
|   mux2 #(`XLEN) pcmux3(.d0(PCNext2F), .d1(PrivilegedNextPCM), .s(PrivilegedChangePCM), .y(UnalignedPCNextF)); | ||||
| 
 | ||||
|   flopenrc #(1) BPPredWrongMReg(.clk, .reset, .en(~StallM), .clear(FlushM), .d(BPPredWrongE), .q(BPPredWrongM)); | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user