mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	More simplifications to the BP.
This commit is contained in:
		
							parent
							
								
									9c4da7381f
								
							
						
					
					
						commit
						1e0667db1d
					
				@ -76,7 +76,7 @@ module bpred (
 | 
			
		||||
  logic [`XLEN-1:0]         PredPCF, RASPCF;
 | 
			
		||||
  logic                     PredictionPCWrongE;
 | 
			
		||||
  logic                     AnyWrongPredInstrClassD, AnyWrongPredInstrClassE;
 | 
			
		||||
  logic [3:0]               InstrClassF, InstrClassD, InstrClassE, InstrClassW;
 | 
			
		||||
  logic [3:0]               InstrClassF, InstrClassD, InstrClassE;
 | 
			
		||||
  logic                     DirPredictionWrongE, BTBPredPCWrongE, RASPredPCWrongE;
 | 
			
		||||
  
 | 
			
		||||
  logic                     SelBPPredF;
 | 
			
		||||
@ -154,6 +154,7 @@ module bpred (
 | 
			
		||||
	
 | 
			
		||||
	assign CompressedOpcF = {PostSpillInstrRawF[1:0], PostSpillInstrRawF[15:13]};
 | 
			
		||||
 | 
			
		||||
//	*** still need to update to use inclusive jump
 | 
			
		||||
	assign cjal = CompressedOpcF == 5'h09 & `XLEN == 32;
 | 
			
		||||
	assign cj = CompressedOpcF == 5'h0d;
 | 
			
		||||
	assign cjr = CompressedOpcF == 5'h14 & ~PostSpillInstrRawF[12] & PostSpillInstrRawF[6:2] == 5'b0 & PostSpillInstrRawF[11:7] != 5'b0;
 | 
			
		||||
@ -162,9 +163,10 @@ module bpred (
 | 
			
		||||
	assign InstrClassF[0] = PostSpillInstrRawF[6:0] == 7'h63 | 
 | 
			
		||||
							(`C_SUPPORTED & CompressedOpcF[4:1] == 4'h7);
 | 
			
		||||
	
 | 
			
		||||
	assign InstrClassF[1] = (PostSpillInstrRawF[6:0] == 7'h67 & (PostSpillInstrRawF[19:15] & 5'h1B) != 5'h01 & (PostSpillInstrRawF[11:7] & 5'h1B) != 5'h01) | // jump register, but not return
 | 
			
		||||
							(PostSpillInstrRawF[6:0] == 7'h6F & (PostSpillInstrRawF[11:7] & 5'h1B) != 5'h01) | // jump, RD != x1 or x5
 | 
			
		||||
							(`C_SUPPORTED & (cj | (cjr & ((PostSpillInstrRawF[11:7] & 5'h1B) != 5'h01)) ));
 | 
			
		||||
	//assign InstrClassF[1] = (PostSpillInstrRawF[6:0] == 7'h67 & (PostSpillInstrRawF[19:15] & 5'h1B) != 5'h01 & (PostSpillInstrRawF[11:7] & 5'h1B) != 5'h01) | // jump register, but not return
 | 
			
		||||
	//						(PostSpillInstrRawF[6:0] == 7'h6F & (PostSpillInstrRawF[11:7] & 5'h1B) != 5'h01) | // jump, RD != x1 or x5
 | 
			
		||||
	//						(`C_SUPPORTED & (cj | (cjr & ((PostSpillInstrRawF[11:7] & 5'h1B) != 5'h01)) ));
 | 
			
		||||
	assign InstrClassF[1] = PostSpillInstrRawF[6:0] == 7'h67 | PostSpillInstrRawF[6:0] == 7'h6F | (`C_SUPPORTED & (cjal | cj | cj | cjalr));
 | 
			
		||||
	
 | 
			
		||||
	assign InstrClassF[2] = PostSpillInstrRawF[6:0] == 7'h67 & (PostSpillInstrRawF[19:15] & 5'h1B) == 5'h01 | // return must return to ra or r5
 | 
			
		||||
							(`C_SUPPORTED & (cjalr | cjr) & ((PostSpillInstrRawF[11:7] & 5'h1B) == 5'h01));
 | 
			
		||||
@ -173,15 +175,11 @@ module bpred (
 | 
			
		||||
							(`C_SUPPORTED & (cjal | (cjalr & (PostSpillInstrRawF[11:7] & 5'h1b) == 5'h01)));
 | 
			
		||||
	assign PredInstrClassF = InstrClassF;
 | 
			
		||||
	assign SelBPPredF = (PredInstrClassF[0] & DirPredictionF[1]) | 
 | 
			
		||||
						PredInstrClassF[2] |
 | 
			
		||||
						PredInstrClassF[1] |
 | 
			
		||||
						PredInstrClassF[3];
 | 
			
		||||
						PredInstrClassF[1];
 | 
			
		||||
  end else begin
 | 
			
		||||
	assign PredInstrClassF = BTBPredInstrClassF;
 | 
			
		||||
	assign SelBPPredF = (PredInstrClassF[0] & DirPredictionF[1] & PredValidF) | 
 | 
			
		||||
						PredInstrClassF[2] |
 | 
			
		||||
						(PredInstrClassF[1] & PredValidF) |
 | 
			
		||||
						(PredInstrClassF[3] & PredValidF);
 | 
			
		||||
						PredInstrClassF[1] & PredValidF;
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  // Part 3 RAS
 | 
			
		||||
@ -191,11 +189,6 @@ module bpred (
 | 
			
		||||
 | 
			
		||||
  assign BPPredPCF = PredInstrClassF[2] ? RASPCF : PredPCF;
 | 
			
		||||
 | 
			
		||||
  //assign InstrClassD[3] = (InstrD[6:0] & 7'h77) == 7'h67 & (InstrD[11:07] & 5'h1B) == 5'h01; // jal(r) must link to ra or x5
 | 
			
		||||
  //assign InstrClassD[2] = InstrD[6:0] == 7'h67 & (InstrD[19:15] & 5'h1B) == 5'h01; // return must return to ra or r5
 | 
			
		||||
  //assign InstrClassD[1] = (InstrD[6:0] == 7'h67 & (InstrD[19:15] & 5'h1B) != 5'h01 & (InstrD[11:7] & 5'h1B) != 5'h01) | // jump register, but not return
 | 
			
		||||
  //                        (InstrD[6:0] == 7'h6F & (InstrD[11:7] & 5'h1B) != 5'h01); // jump, RD != x1 or x5
 | 
			
		||||
  //assign InstrClassD[0] = InstrD[6:0] == 7'h63; // branch
 | 
			
		||||
  assign InstrClassD[0] = BranchD;
 | 
			
		||||
  assign InstrClassD[1] = JumpD ;
 | 
			
		||||
  assign InstrClassD[2] = JumpD & (InstrD[19:15] & 5'h1B) == 5'h01; // return must return to ra or x5
 | 
			
		||||
@ -205,7 +198,6 @@ module bpred (
 | 
			
		||||
 | 
			
		||||
  flopenrc #(4) InstrClassRegE(clk, reset,  FlushE, ~StallE, InstrClassD, InstrClassE);
 | 
			
		||||
  flopenrc #(4) InstrClassRegM(clk, reset,  FlushM, ~StallM, InstrClassE, InstrClassM);
 | 
			
		||||
  flopenrc #(4) InstrClassRegW(clk, reset,  FlushW, ~StallW, InstrClassM, InstrClassW);
 | 
			
		||||
  flopenrc #(1) BPPredWrongMReg(clk, reset, FlushM, ~StallM, BPPredWrongE, BPPredWrongM);
 | 
			
		||||
 | 
			
		||||
  // branch predictor
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user