mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	More branch predictor improvements.
This commit is contained in:
		
							parent
							
								
									3d285312f0
								
							
						
					
					
						commit
						56aa798d5c
					
				@ -64,7 +64,7 @@ module bpred (
 | 
				
			|||||||
  logic [1:0]               DirPredictionF;
 | 
					  logic [1:0]               DirPredictionF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [3:0]               PredInstrClassF, PredInstrClassD, PredInstrClassE;
 | 
					  logic [3:0]               PredInstrClassF, PredInstrClassD, PredInstrClassE;
 | 
				
			||||||
  logic [`XLEN-1:0]         BTBPredPCF, RASPCF;
 | 
					  logic [`XLEN-1:0]         PredPCF, RASPCF;
 | 
				
			||||||
  logic                     TargetWrongE;
 | 
					  logic                     TargetWrongE;
 | 
				
			||||||
  logic                     FallThroughWrongE;
 | 
					  logic                     FallThroughWrongE;
 | 
				
			||||||
  logic                     PredictionPCWrongE;
 | 
					  logic                     PredictionPCWrongE;
 | 
				
			||||||
@ -95,8 +95,8 @@ module bpred (
 | 
				
			|||||||
    speculativeglobalhistory #(10) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
 | 
					    speculativeglobalhistory #(10) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
 | 
				
			||||||
      .PCNextF, .PCF, .PCD, .PCE, .PCM, .DirPredictionF, .DirPredictionWrongE,
 | 
					      .PCNextF, .PCF, .PCD, .PCE, .PCM, .DirPredictionF, .DirPredictionWrongE,
 | 
				
			||||||
      .BranchInstrF(PredInstrClassF[0]), .BranchInstrD(InstrClassD[0]), .BranchInstrE(InstrClassE[0]), .BranchInstrM(InstrClassM[0]),
 | 
					      .BranchInstrF(PredInstrClassF[0]), .BranchInstrD(InstrClassD[0]), .BranchInstrE(InstrClassE[0]), .BranchInstrM(InstrClassM[0]),
 | 
				
			||||||
      .BranchInstrW(InstrClassW[0]), .PCSrcE);
 | 
					      .BranchInstrW(InstrClassW[0]), .WrongPredInstrClassD, .PCSrcE);
 | 
				
			||||||
    
 | 
						    
 | 
				
			||||||
  end else if (`BPTYPE == "BPGSHARE") begin:Predictor
 | 
					  end else if (`BPTYPE == "BPGSHARE") begin:Predictor
 | 
				
			||||||
    gshare DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .FlushD, .FlushE, .FlushM,
 | 
					    gshare DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .FlushD, .FlushE, .FlushM,
 | 
				
			||||||
      .PCNextF, .PCM, .DirPredictionF, .DirPredictionWrongE,
 | 
					      .PCNextF, .PCM, .DirPredictionF, .DirPredictionWrongE,
 | 
				
			||||||
@ -135,15 +135,12 @@ module bpred (
 | 
				
			|||||||
  // Part 2 Branch target address prediction
 | 
					  // Part 2 Branch target address prediction
 | 
				
			||||||
  // *** For now the BTB will house the direct and indirect targets
 | 
					  // *** For now the BTB will house the direct and indirect targets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  btb TargetPredictor(.clk(clk),
 | 
					  btb TargetPredictor(.clk, .reset, .StallF, .StallD, .StallM, .FlushD, .FlushM,
 | 
				
			||||||
          .reset(reset),
 | 
					          .PCNextF, .PCF, .PCD, .PCE,
 | 
				
			||||||
          .*, // Stalls and flushes
 | 
					          .PredPCF,
 | 
				
			||||||
          .PCNextF,
 | 
					 | 
				
			||||||
          .BTBPredPCF,
 | 
					 | 
				
			||||||
          .PredInstrClassF,
 | 
					          .PredInstrClassF,
 | 
				
			||||||
          .PredValidF,
 | 
					          .PredValidF,
 | 
				
			||||||
          .PredictionInstrClassWrongE,
 | 
					          .PredictionInstrClassWrongE,
 | 
				
			||||||
          .PCE,
 | 
					 | 
				
			||||||
          .IEUAdrE,
 | 
					          .IEUAdrE,
 | 
				
			||||||
          .InstrClassE);
 | 
					          .InstrClassE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -160,7 +157,7 @@ module bpred (
 | 
				
			|||||||
       .incr(1'b0),
 | 
					       .incr(1'b0),
 | 
				
			||||||
       .PCLinkE);
 | 
					       .PCLinkE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assign BPPredPCF = PredInstrClassF[2] ? RASPCF : BTBPredPCF;
 | 
					  assign BPPredPCF = PredInstrClassF[2] ? RASPCF : PredPCF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // the branch predictor needs a compact decoding of the instruction class.
 | 
					  // the branch predictor needs a compact decoding of the instruction class.
 | 
				
			||||||
  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[3] = (InstrD[6:0] & 7'h77) == 7'h67 & (InstrD[11:07] & 5'h1B) == 5'h01; // jal(r) must link to ra or x5
 | 
				
			||||||
 | 
				
			|||||||
@ -35,16 +35,15 @@ module btb
 | 
				
			|||||||
    )
 | 
					    )
 | 
				
			||||||
  (input  logic             clk,
 | 
					  (input  logic             clk,
 | 
				
			||||||
   input  logic             reset,
 | 
					   input  logic             reset,
 | 
				
			||||||
   input  logic             StallF, StallD, StallE, StallM, FlushD, FlushM,
 | 
					   input  logic             StallF, StallD, StallM, FlushD, FlushM,
 | 
				
			||||||
   input  logic [`XLEN-1:0] PCNextF, PCF, PCD,
 | 
					   input  logic [`XLEN-1:0] PCNextF, PCF, PCD, PCE,                 // PC at various stages
 | 
				
			||||||
   output logic [`XLEN-1:0] BTBPredPCF,
 | 
					   output logic [`XLEN-1:0] PredPCF,                                // BTB's guess at PC
 | 
				
			||||||
   output logic [3:0]       PredInstrClassF,
 | 
					   output logic [3:0]       PredInstrClassF,                        // BTB's guess at instruction class
 | 
				
			||||||
   output logic             PredValidF,
 | 
					   output logic             PredValidF,                             // BTB's guess is valid
 | 
				
			||||||
   // update
 | 
					   // update
 | 
				
			||||||
   input  logic             PredictionInstrClassWrongE,
 | 
					   input  logic             PredictionInstrClassWrongE,             // BTB's instruction class guess was wrong
 | 
				
			||||||
   input  logic [`XLEN-1:0] PCE,
 | 
					   input  logic [`XLEN-1:0] IEUAdrE,                                // Branch/jump target address to insert into btb
 | 
				
			||||||
   input  logic [`XLEN-1:0] IEUAdrE,
 | 
					   input  logic [3:0]       InstrClassE                             // Instruction class to insert into btb
 | 
				
			||||||
   input  logic [3:0]       InstrClassE
 | 
					 | 
				
			||||||
   );
 | 
					   );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  localparam TotalDepth = 2 ** Depth;
 | 
					  localparam TotalDepth = 2 ** Depth;
 | 
				
			||||||
@ -54,10 +53,10 @@ module btb
 | 
				
			|||||||
  logic 					MatchF, MatchD, MatchE, MatchNextX, MatchXF;
 | 
					  logic 					MatchF, MatchD, MatchE, MatchNextX, MatchXF;
 | 
				
			||||||
  logic [`XLEN+3:0] 		ForwardBTBPrediction, ForwardBTBPredictionF;
 | 
					  logic [`XLEN+3:0] 		ForwardBTBPrediction, ForwardBTBPredictionF;
 | 
				
			||||||
  logic [`XLEN+3:0] 		TableBTBPredictionF;
 | 
					  logic [`XLEN+3:0] 		TableBTBPredictionF;
 | 
				
			||||||
  logic [`XLEN-1:0] 		BTBPredPCD;  
 | 
					  logic [`XLEN-1:0] 		PredPCD;  
 | 
				
			||||||
  logic [3:0] 				PredInstrClassD;  // copy of reg outside module
 | 
					  logic [3:0] 				PredInstrClassD;  // *** copy of reg outside module
 | 
				
			||||||
  
 | 
					  logic 					UpdateEn;
 | 
				
			||||||
  
 | 
					    
 | 
				
			||||||
  // hashing function for indexing the PC
 | 
					  // hashing function for indexing the PC
 | 
				
			||||||
  // We have Depth bits to index, but XLEN bits as the input.
 | 
					  // We have Depth bits to index, but XLEN bits as the input.
 | 
				
			||||||
  // bit 0 is always 0, bit 1 is 0 if using 4 byte instructions, but is not always 0 if
 | 
					  // bit 0 is always 0, bit 1 is 0 if using 4 byte instructions, but is not always 0 if
 | 
				
			||||||
@ -80,28 +79,30 @@ module btb
 | 
				
			|||||||
  
 | 
					  
 | 
				
			||||||
  flopenr #(1) MatchReg(clk, reset, ~StallF, MatchNextX, MatchXF);
 | 
					  flopenr #(1) MatchReg(clk, reset, ~StallF, MatchNextX, MatchXF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assign ForwardBTBPrediction = MatchF ? {PredInstrClassF, BTBPredPCF} :
 | 
					  assign ForwardBTBPrediction = MatchF ? {PredInstrClassF, PredPCF} :
 | 
				
			||||||
                                MatchD ? {PredInstrClassD, BTBPredPCD} :
 | 
					                                MatchD ? {PredInstrClassD, PredPCD} :
 | 
				
			||||||
                                {InstrClassE, IEUAdrE} ;
 | 
					                                {InstrClassE, IEUAdrE} ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  flopenr #(`XLEN+4) ForwardBTBPredicitonReg(clk, reset, ~StallF, ForwardBTBPrediction, ForwardBTBPredictionF);
 | 
					  flopenr #(`XLEN+4) ForwardBTBPredicitonReg(clk, reset, ~StallF, ForwardBTBPrediction, ForwardBTBPredictionF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assign {PredInstrClassF, BTBPredPCF} = MatchXF ? ForwardBTBPredictionF : TableBTBPredictionF;
 | 
					  assign {PredInstrClassF, PredPCF} = MatchXF ? ForwardBTBPredictionF : TableBTBPredictionF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  always_ff @ (posedge clk) begin
 | 
					  always_ff @ (posedge clk) begin
 | 
				
			||||||
    if (reset) begin
 | 
					    if (reset) begin
 | 
				
			||||||
      ValidBits <= #1 {TotalDepth{1'b0}};
 | 
					      ValidBits <= #1 {TotalDepth{1'b0}};
 | 
				
			||||||
    end else if ((|InstrClassE | PredictionInstrClassWrongE) & ~StallM & ~FlushM) begin
 | 
					    end else if ((UpdateEn) & ~StallM & ~FlushM) begin
 | 
				
			||||||
      ValidBits[PCEIndex] <= #1 |InstrClassE;
 | 
					      ValidBits[PCEIndex] <= #1 |InstrClassE;
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
	PredValidF = ValidBits[PCNextFIndex];
 | 
						PredValidF = ValidBits[PCNextFIndex];
 | 
				
			||||||
  end
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  assign UpdateEn = |InstrClassE | PredictionInstrClassWrongE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // An optimization may be using a PC relative address.
 | 
					  // An optimization may be using a PC relative address.
 | 
				
			||||||
  ram2p1r1wbe #(2**Depth, `XLEN+4) memory(
 | 
					  ram2p1r1wbe #(2**Depth, `XLEN+4) memory(
 | 
				
			||||||
    .clk, .ce1(~StallF | reset), .ra1(PCNextFIndex), .rd1(TableBTBPredictionF),
 | 
					    .clk, .ce1(~StallF | reset), .ra1(PCNextFIndex), .rd1(TableBTBPredictionF),
 | 
				
			||||||
     .ce2(~StallM & ~FlushM), .wa2(PCEIndex), .wd2({InstrClassE, IEUAdrE}), .we2(UpdateEN), .bwe2('1));
 | 
					     .ce2(~StallM & ~FlushM), .wa2(PCEIndex), .wd2({InstrClassE, IEUAdrE}), .we2(UpdateEn), .bwe2('1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  flopenrc #(`XLEN+4) BTBD(clk, reset, FlushD, ~StallD, {PredInstrClassF, BTBPredPCF}, {PredInstrClassD, BTBPredPCD});
 | 
					  flopenrc #(`XLEN+4) BTBD(clk, reset, FlushD, ~StallD, {PredInstrClassF, PredPCF}, {PredInstrClassD, PredPCD});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
endmodule
 | 
					endmodule
 | 
				
			||||||
 | 
				
			|||||||
@ -40,52 +40,56 @@ module speculativeglobalhistory
 | 
				
			|||||||
   output logic            DirPredictionWrongE,
 | 
					   output logic            DirPredictionWrongE,
 | 
				
			||||||
   // update
 | 
					   // update
 | 
				
			||||||
   input logic [`XLEN-1:0] PCNextF, PCF, PCD, PCE, PCM,
 | 
					   input logic [`XLEN-1:0] PCNextF, PCF, PCD, PCE, PCM,
 | 
				
			||||||
   input logic             BranchInstrF, BranchInstrD, BranchInstrE, BranchInstrM, BranchInstrW, 
 | 
					   input logic             BranchInstrF, BranchInstrD, BranchInstrE, BranchInstrM, BranchInstrW,
 | 
				
			||||||
 | 
					   input logic [3:0]       WrongPredInstrClassD, 
 | 
				
			||||||
   input logic             PCSrcE
 | 
					   input logic             PCSrcE
 | 
				
			||||||
   );
 | 
					   );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic                    MatchF, MatchD, MatchE, MatchM, MatchW;
 | 
					  logic                    MatchF, MatchD, MatchE;
 | 
				
			||||||
  logic                    MatchNextX, MatchXF;
 | 
					  logic                    MatchNextX, MatchXF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [1:0]              TableDirPredictionF, DirPredictionD, DirPredictionE;
 | 
					  logic [1:0]              TableDirPredictionF, DirPredictionD, DirPredictionE;
 | 
				
			||||||
  logic [1:0]              NewDirPredictionF, NewDirPredictionD, NewDirPredictionE, NewDirPredictionM, NewDirPredictionW;
 | 
					  logic [1:0]              NewDirPredictionF, NewDirPredictionD, NewDirPredictionE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [k-1:0]            GHRF;
 | 
					  logic [k-1:0]            GHRF;
 | 
				
			||||||
  logic [k:0]              GHRD, OldGHRE, GHRE, GHRM, GHRW;
 | 
					  logic [k:0]              GHRD, OldGHRE, GHRE, GHRM, GHRW;
 | 
				
			||||||
  logic [k-1:0]            GHRNextF;
 | 
					  logic [k-1:0]            GHRNextF;
 | 
				
			||||||
  logic [k:0]              GHRNextD, GHRNextE, GHRNextM, GHRNextW;
 | 
					  logic [k:-1] 			   GHRNextD, OldGHRD;
 | 
				
			||||||
  logic                    PCSrcM, PCSrcW;
 | 
					  logic [k:0]              GHRNextE, GHRNextM, GHRNextW;
 | 
				
			||||||
 | 
					  logic [k-1:0]            IndexNextF, IndexF;
 | 
				
			||||||
 | 
					  logic [k-1:0]            IndexD, IndexE;
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  logic [`XLEN-1:0]        PCW;
 | 
					  logic [`XLEN-1:0]        PCW;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [1:0]              ForwardNewDirPrediction, ForwardDirPredictionF;
 | 
					  logic [1:0]              ForwardNewDirPrediction, ForwardDirPredictionF;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
 | 
					  assign IndexNextF = GHRNextF;
 | 
				
			||||||
 | 
					  assign IndexF = GHRF;
 | 
				
			||||||
 | 
					  assign IndexD = GHRD[k-1:0];
 | 
				
			||||||
 | 
					  assign IndexE = GHRE[k-1:0];
 | 
				
			||||||
      
 | 
					      
 | 
				
			||||||
  ram2p1r1wbe #(2**k, 2) PHT(.clk(clk),
 | 
					  ram2p1r1wbe #(2**k, 2) PHT(.clk(clk),
 | 
				
			||||||
    .ce1(~StallF | reset), .ce2(~StallW & ~FlushW),
 | 
					    .ce1(~StallF | reset), .ce2(~StallM & ~FlushM),
 | 
				
			||||||
    .ra1(GHRNextF),
 | 
					    .ra1(IndexNextF),
 | 
				
			||||||
    .rd1(TableDirPredictionF),
 | 
					    .rd1(TableDirPredictionF),
 | 
				
			||||||
    .wa2(GHRW[k-1:0]),
 | 
					    .wa2(IndexE),
 | 
				
			||||||
    .wd2(NewDirPredictionW),
 | 
					    .wd2(NewDirPredictionE),
 | 
				
			||||||
    .we2(BranchInstrW & ~StallW & ~FlushW),
 | 
					    .we2(BranchInstrE & ~StallM & ~FlushM),
 | 
				
			||||||
    .bwe2(1'b1));
 | 
					    .bwe2(1'b1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // if there are non-flushed branches in the pipeline we need to forward the prediction from that stage to the NextF demi stage
 | 
					  // if there are non-flushed branches in the pipeline we need to forward the prediction from that stage to the NextF demi stage
 | 
				
			||||||
  //  and then register for use in the Fetch stage.
 | 
					  // and then register for use in the Fetch stage.
 | 
				
			||||||
  assign MatchF = BranchInstrF & ~FlushD & (GHRNextF == GHRF);
 | 
					  assign MatchF = BranchInstrF & ~FlushD & (IndexNextF == IndexF);
 | 
				
			||||||
  assign MatchD = BranchInstrD & ~FlushE & (GHRNextF == GHRD[k-1:0]);
 | 
					  assign MatchD = BranchInstrD & ~FlushE & (IndexNextF == IndexD);
 | 
				
			||||||
  assign MatchE = BranchInstrE & ~FlushM & (GHRNextF == GHRE[k-1:0]);
 | 
					  assign MatchE = BranchInstrE & ~FlushM & (IndexNextF == IndexE);
 | 
				
			||||||
  assign MatchM = BranchInstrM & ~FlushW & (GHRNextF == GHRM[k-1:0]);
 | 
					  assign MatchNextX = MatchF | MatchD | MatchE;
 | 
				
			||||||
  assign MatchW = BranchInstrW & (GHRNextF == GHRW[k-1:0]);
 | 
					 | 
				
			||||||
  assign MatchNextX = MatchF | MatchD | MatchE | MatchM | MatchW;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  flopenr #(1) MatchReg(clk, reset, ~StallF, MatchNextX, MatchXF);
 | 
					  flopenr #(1) MatchReg(clk, reset, ~StallF, MatchNextX, MatchXF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assign ForwardNewDirPrediction = MatchF ? NewDirPredictionF :
 | 
					  assign ForwardNewDirPrediction = MatchF ? NewDirPredictionF :
 | 
				
			||||||
                                   MatchD ? NewDirPredictionD :
 | 
					                                   MatchD ? NewDirPredictionD :
 | 
				
			||||||
                                   MatchE ? NewDirPredictionE :
 | 
					                                   NewDirPredictionE ;
 | 
				
			||||||
                                   MatchM ? NewDirPredictionM :
 | 
					  
 | 
				
			||||||
                                   NewDirPredictionW;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  flopenr #(2) ForwardDirPredicitonReg(clk, reset, ~StallF, ForwardNewDirPrediction, ForwardDirPredictionF);
 | 
					  flopenr #(2) ForwardDirPredicitonReg(clk, reset, ~StallF, ForwardNewDirPrediction, ForwardDirPredictionF);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assign DirPredictionF = MatchXF ? ForwardDirPredictionF : TableDirPredictionF;
 | 
					  assign DirPredictionF = MatchXF ? ForwardDirPredictionF : TableDirPredictionF;
 | 
				
			||||||
@ -95,16 +99,11 @@ module speculativeglobalhistory
 | 
				
			|||||||
  flopenr #(2) PredictionRegE(clk, reset, ~StallE, DirPredictionD, DirPredictionE);
 | 
					  flopenr #(2) PredictionRegE(clk, reset, ~StallE, DirPredictionD, DirPredictionE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // New prediction pipeline
 | 
					  // New prediction pipeline
 | 
				
			||||||
  satCounter2 BPDirUpdateF(.BrDir(DirPredictionF[1]), .OldState(DirPredictionF), .NewState(NewDirPredictionF));
 | 
					  assign NewDirPredictionF = {DirPredictionF[1], DirPredictionF[1]};
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
  flopenr #(2) NewPredDReg(clk, reset, ~StallD, NewDirPredictionF, NewDirPredictionD);
 | 
					  flopenr #(2) NewPredDReg(clk, reset, ~StallD, NewDirPredictionF, NewDirPredictionD);
 | 
				
			||||||
  satCounter2 BPDirUpdateE(.BrDir(PCSrcE), .OldState(DirPredictionE), .NewState(NewDirPredictionE));
 | 
					  satCounter2 BPDirUpdateE(.BrDir(PCSrcE), .OldState(DirPredictionE), .NewState(NewDirPredictionE));
 | 
				
			||||||
  flopenr #(2) NewPredMReg(clk, reset, ~StallM, NewDirPredictionE, NewDirPredictionM);
 | 
					 | 
				
			||||||
  flopenr #(2) NewPredWReg(clk, reset, ~StallW, NewDirPredictionM, NewDirPredictionW);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // PCSrc pipeline
 | 
					 | 
				
			||||||
  flopenrc #(1) PCSrcMReg(clk, reset, FlushM, ~StallM, PCSrcE, PCSrcM);
 | 
					 | 
				
			||||||
  flopenrc #(1) PCSrcWReg(clk, reset, FlushW, ~StallW, PCSrcM, PCSrcW);
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  // GHR pipeline
 | 
					  // GHR pipeline
 | 
				
			||||||
  assign GHRNextF = FlushD ?  GHRNextD[k:1] :
 | 
					  assign GHRNextF = FlushD ?  GHRNextD[k:1] :
 | 
				
			||||||
                    BranchInstrF ? {DirPredictionF[1], GHRF[k-1:1]} :
 | 
					                    BranchInstrF ? {DirPredictionF[1], GHRF[k-1:1]} :
 | 
				
			||||||
@ -112,8 +111,11 @@ module speculativeglobalhistory
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  flopenr  #(k) GHRFReg(clk, reset, (~StallF) | FlushD, GHRNextF, GHRF);
 | 
					  flopenr  #(k) GHRFReg(clk, reset, (~StallF) | FlushD, GHRNextF, GHRF);
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  assign GHRNextD = FlushD ? GHRNextE : {DirPredictionF[1], GHRF};
 | 
					  assign GHRNextD = FlushD ? {GHRNextE, GHRNextE[0]} : {DirPredictionF[1], GHRF, GHRF[0]};
 | 
				
			||||||
  flopenr  #(k+1) GHRDReg(clk, reset, (~StallD) | FlushD, GHRNextD, GHRD);
 | 
					  flopenr  #(k+2) GHRDReg(clk, reset, (~StallD) | FlushD, GHRNextD, OldGHRD);
 | 
				
			||||||
 | 
					  assign GHRD = WrongPredInstrClassD[0] & BranchInstrD  ? {DirPredictionD[1], OldGHRD[k:1]} : // shift right
 | 
				
			||||||
 | 
									WrongPredInstrClassD[0] & ~BranchInstrD ? OldGHRD[k-1:-1] : // shift left
 | 
				
			||||||
 | 
									OldGHRD[k:0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  assign GHRNextE = FlushE ? GHRNextM : GHRD;
 | 
					  assign GHRNextE = FlushE ? GHRNextM : GHRD;
 | 
				
			||||||
  flopenr  #(k+1) GHREReg(clk, reset, (~StallE) | FlushE, GHRNextE, OldGHRE);
 | 
					  flopenr  #(k+1) GHREReg(clk, reset, (~StallE) | FlushE, GHRNextE, OldGHRE);
 | 
				
			||||||
 | 
				
			|||||||
@ -49,7 +49,7 @@ module speculativegshare
 | 
				
			|||||||
  logic                    MatchNextX, MatchXF;
 | 
					  logic                    MatchNextX, MatchXF;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [1:0]              TableDirPredictionF, DirPredictionD, DirPredictionE;
 | 
					  logic [1:0]              TableDirPredictionF, DirPredictionD, DirPredictionE;
 | 
				
			||||||
  logic [1:0]              NewDirPredictionF, NewDirPredictionD, NewDirPredictionE, NewDirPredictionM;
 | 
					  logic [1:0]              NewDirPredictionF, NewDirPredictionD, NewDirPredictionE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [k-1:0]            GHRF;
 | 
					  logic [k-1:0]            GHRF;
 | 
				
			||||||
  logic [k:0]              GHRD, OldGHRE, GHRE, GHRM, GHRW;
 | 
					  logic [k:0]              GHRD, OldGHRE, GHRE, GHRM, GHRW;
 | 
				
			||||||
@ -59,7 +59,6 @@ module speculativegshare
 | 
				
			|||||||
  logic [k-1:0]            IndexNextF, IndexF;
 | 
					  logic [k-1:0]            IndexNextF, IndexF;
 | 
				
			||||||
  logic [k-1:0]            IndexD, IndexE;
 | 
					  logic [k-1:0]            IndexD, IndexE;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  logic                    PCSrcM, PCSrcW;
 | 
					 | 
				
			||||||
  logic [`XLEN-1:0]        PCW;
 | 
					  logic [`XLEN-1:0]        PCW;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  logic [1:0]              ForwardNewDirPrediction, ForwardDirPredictionF;
 | 
					  logic [1:0]              ForwardNewDirPrediction, ForwardDirPredictionF;
 | 
				
			||||||
@ -104,12 +103,7 @@ module speculativegshare
 | 
				
			|||||||
  
 | 
					  
 | 
				
			||||||
  flopenr #(2) NewPredDReg(clk, reset, ~StallD, NewDirPredictionF, NewDirPredictionD);
 | 
					  flopenr #(2) NewPredDReg(clk, reset, ~StallD, NewDirPredictionF, NewDirPredictionD);
 | 
				
			||||||
  satCounter2 BPDirUpdateE(.BrDir(PCSrcE), .OldState(DirPredictionE), .NewState(NewDirPredictionE));
 | 
					  satCounter2 BPDirUpdateE(.BrDir(PCSrcE), .OldState(DirPredictionE), .NewState(NewDirPredictionE));
 | 
				
			||||||
  flopenr #(2) NewPredMReg(clk, reset, ~StallM, NewDirPredictionE, NewDirPredictionM);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // PCSrc pipeline
 | 
					 | 
				
			||||||
  flopenrc #(1) PCSrcMReg(clk, reset, FlushM, ~StallM, PCSrcE, PCSrcM);
 | 
					 | 
				
			||||||
  flopenrc #(1) PCSrcWReg(clk, reset, FlushW, ~StallW, PCSrcM, PCSrcW);
 | 
					 | 
				
			||||||
  
 | 
					 | 
				
			||||||
  // GHR pipeline
 | 
					  // GHR pipeline
 | 
				
			||||||
  assign GHRNextF = FlushD ?  GHRNextD[k:1] :
 | 
					  assign GHRNextF = FlushD ?  GHRNextD[k:1] :
 | 
				
			||||||
                    BranchInstrF ? {DirPredictionF[1], GHRF[k-1:1]} :
 | 
					                    BranchInstrF ? {DirPredictionF[1], GHRF[k-1:1]} :
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user