forked from Github_Repos/cvw
		
	Moved and ranamed btb to btb.sv
Fixed btb to use the fixed port 2 sram.
This commit is contained in:
		
							parent
							
								
									7d1109fc24
								
							
						
					
					
						commit
						1170dc7250
					
				@ -74,12 +74,14 @@ module ram2p1r1wb #(parameter DEPTH = 10, WIDTH = 2) (
 | 
				
			|||||||
  flopenr #(WIDTH) wd2Reg(clk, reset, ren1, wd2, wd2q);
 | 
					  flopenr #(WIDTH) wd2Reg(clk, reset, ren1, wd2, wd2q);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // read port
 | 
					  // read port
 | 
				
			||||||
  assign rd1 = mem[ra1q];
 | 
					  //assign rd1 = mem[ra1q];
 | 
				
			||||||
 | 
					  always_ff @(posedge clk)
 | 
				
			||||||
 | 
						if(ren1) rd1 <= mem[ra1];
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  // write port
 | 
					  // write port
 | 
				
			||||||
  assign bwe = {WIDTH{wen2q}} & bwe2;
 | 
					  assign bwe = {WIDTH{wen2}} & bwe2;
 | 
				
			||||||
  always_ff @(posedge clk)
 | 
					  always_ff @(posedge clk)
 | 
				
			||||||
    mem[wa2q] <= wd2q & bwe | mem[wa2q] & ~bwe;
 | 
					    mem[wa2] <= wd2 & bwe | mem[wa2] & ~bwe;
 | 
				
			||||||
 
 | 
					 
 | 
				
			||||||
endmodule  
 | 
					endmodule  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -59,13 +59,13 @@ module ram2p1r1wbefix #(parameter DEPTH=128, WIDTH=256) (
 | 
				
			|||||||
  
 | 
					  
 | 
				
			||||||
  // Write divided into part for bytes and part for extra msbs
 | 
					  // Write divided into part for bytes and part for extra msbs
 | 
				
			||||||
  if(WIDTH >= 8) 
 | 
					  if(WIDTH >= 8) 
 | 
				
			||||||
    always_ff @(posedge clk) 
 | 
					    always @(posedge clk) 
 | 
				
			||||||
      if (ce2 & we2) 
 | 
					      if (ce2 & we2) 
 | 
				
			||||||
        for(i = 0; i < WIDTH/8; i++) 
 | 
					        for(i = 0; i < WIDTH/8; i++) 
 | 
				
			||||||
          if(bwe2[i]) mem[wa2][i*8 +: 8] <= #1 wd2[i*8 +: 8];
 | 
					          if(bwe2[i]) mem[wa2][i*8 +: 8] <= #1 wd2[i*8 +: 8];
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  if (WIDTH%8 != 0) // handle msbs if width not a multiple of 8
 | 
					  if (WIDTH%8 != 0) // handle msbs if width not a multiple of 8
 | 
				
			||||||
    always_ff @(posedge clk) 
 | 
					    always @(posedge clk) 
 | 
				
			||||||
      if (ce2 & we2 & bwe2[WIDTH/8])
 | 
					      if (ce2 & we2 & bwe2[WIDTH/8])
 | 
				
			||||||
        mem[wa2][WIDTH-1:WIDTH-WIDTH%8] <= #1 wd2[WIDTH-1:WIDTH-WIDTH%8];
 | 
					        mem[wa2][WIDTH-1:WIDTH-WIDTH%8] <= #1 wd2[WIDTH-1:WIDTH-WIDTH%8];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										110
									
								
								pipelined/src/ifu/brpred/btb.sv
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								pipelined/src/ifu/brpred/btb.sv
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,110 @@
 | 
				
			|||||||
 | 
					///////////////////////////////////////////
 | 
				
			||||||
 | 
					// btb.sv
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Written: Ross Thomposn ross1728@gmail.com
 | 
				
			||||||
 | 
					// Created: February 15, 2021
 | 
				
			||||||
 | 
					// Modified: 24 January 2023 
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Purpose: Branch Target Buffer (BTB). The BTB predicts the target address of all control flow instructions.
 | 
				
			||||||
 | 
					//          It also guesses the type of instrution; jalr(r), return, jump (jr), or branch.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Documentation: RISC-V System on Chip Design Chapter 10 (Figure ***)
 | 
				
			||||||
 | 
					// 
 | 
				
			||||||
 | 
					// A component of the CORE-V-WALLY configurable RISC-V project.
 | 
				
			||||||
 | 
					// 
 | 
				
			||||||
 | 
					// Copyright (C) 2021-23 Harvey Mudd College & Oklahoma State University
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: Apache-2.0 WITH SHL-2.1
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Licensed under the Solderpad Hardware License v 2.1 (the “License”); you may not use this file 
 | 
				
			||||||
 | 
					// except in compliance with the License, or, at your option, the Apache License version 2.0. You 
 | 
				
			||||||
 | 
					// may obtain a copy of the License at
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// https://solderpad.org/licenses/SHL-2.1/
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Unless required by applicable law or agreed to in writing, any work distributed under the 
 | 
				
			||||||
 | 
					// License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
 | 
				
			||||||
 | 
					// either express or implied. See the License for the specific language governing permissions 
 | 
				
			||||||
 | 
					// and limitations under the License.
 | 
				
			||||||
 | 
					////////////////////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					`include "wally-config.vh"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module btb
 | 
				
			||||||
 | 
					  #(parameter int Depth = 10
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					  (input  logic             clk,
 | 
				
			||||||
 | 
					   input  logic             reset,
 | 
				
			||||||
 | 
					   input  logic             StallF, StallE,
 | 
				
			||||||
 | 
					   input  logic [`XLEN-1:0] PCNextF,
 | 
				
			||||||
 | 
					   output logic [`XLEN-1:0] BTBPredPCF,
 | 
				
			||||||
 | 
					   output logic [3:0]       InstrClass,
 | 
				
			||||||
 | 
					   output logic             Valid,
 | 
				
			||||||
 | 
					   // update
 | 
				
			||||||
 | 
					   input  logic             UpdateEN,
 | 
				
			||||||
 | 
					   input  logic [`XLEN-1:0] PCE,
 | 
				
			||||||
 | 
					   input  logic [`XLEN-1:0] IEUAdrE,
 | 
				
			||||||
 | 
					   input  logic [3:0]       InstrClassE,
 | 
				
			||||||
 | 
					   input  logic             UpdateInvalid
 | 
				
			||||||
 | 
					   );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  localparam TotalDepth = 2 ** Depth;
 | 
				
			||||||
 | 
					  logic [TotalDepth-1:0]    ValidBits;
 | 
				
			||||||
 | 
					  logic [Depth-1:0]         PCNextFIndex, PCEIndex, PCNextFIndexQ, PCEIndexQ;
 | 
				
			||||||
 | 
					  logic                     UpdateENQ;
 | 
				
			||||||
 | 
					  logic [`XLEN-1:0] 		ResetPC;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // hashing function for indexing the PC
 | 
				
			||||||
 | 
					  // 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
 | 
				
			||||||
 | 
					  // using compressed instructions.  XOR bit 1 with the MSB of index.
 | 
				
			||||||
 | 
					  assign PCEIndex = {PCE[Depth+1] ^ PCE[1], PCE[Depth:2]};
 | 
				
			||||||
 | 
					  assign ResetPC = `RESET_VECTOR;
 | 
				
			||||||
 | 
					  assign PCNextFIndex = reset ? ResetPC[Depth+1:2] : {PCNextF[Depth+1] ^ PCNextF[1], PCNextF[Depth:2]};  
 | 
				
			||||||
 | 
					  //assign PCNextFIndex = {PCNextF[Depth+1] ^ PCNextF[1], PCNextF[Depth:2]};  
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  flopenr #(Depth) PCEIndexReg(.clk(clk),
 | 
				
			||||||
 | 
					        .reset(reset),
 | 
				
			||||||
 | 
					        .en(~StallE),
 | 
				
			||||||
 | 
					        .d(PCEIndex),
 | 
				
			||||||
 | 
					        .q(PCEIndexQ));
 | 
				
			||||||
 | 
					  
 | 
				
			||||||
 | 
					  // The valid bit must be resetable.
 | 
				
			||||||
 | 
					  always_ff @ (posedge clk) begin
 | 
				
			||||||
 | 
					    if (reset) begin
 | 
				
			||||||
 | 
					      ValidBits <= #1 {TotalDepth{1'b0}};
 | 
				
			||||||
 | 
					    end else 
 | 
				
			||||||
 | 
					    if (UpdateENQ) begin
 | 
				
			||||||
 | 
					      ValidBits[PCEIndexQ] <= #1 ~ UpdateInvalid;
 | 
				
			||||||
 | 
					    end
 | 
				
			||||||
 | 
					  end
 | 
				
			||||||
 | 
					  assign Valid = ValidBits[PCNextFIndexQ];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  flopenr #(1) UpdateENReg(.clk(clk),
 | 
				
			||||||
 | 
					     .reset(reset),
 | 
				
			||||||
 | 
					     .en(~StallF),
 | 
				
			||||||
 | 
					     .d(UpdateEN),
 | 
				
			||||||
 | 
					     .q(UpdateENQ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  flopenr #(Depth) LookupPCIndexReg(.clk(clk),
 | 
				
			||||||
 | 
					        .reset(reset),
 | 
				
			||||||
 | 
					        .en(~StallF),
 | 
				
			||||||
 | 
					        .d(PCNextFIndex),
 | 
				
			||||||
 | 
					        .q(PCNextFIndexQ));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // the BTB contains the target address.
 | 
				
			||||||
 | 
					  // Another optimization may be using a PC relative address.
 | 
				
			||||||
 | 
					  // *** need to add forwarding.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // *** optimize for byte write enables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ram2p1r1wbefix #(2**Depth, `XLEN+4) memory(
 | 
				
			||||||
 | 
					    .clk, .ce1(~StallF | reset), .ra1(PCNextFIndex), .rd1({InstrClass, BTBPredPCF}),
 | 
				
			||||||
 | 
					     .ce2(~StallE), .wa2(PCEIndex), .wd2({InstrClassE, IEUAdrE}), .we2(UpdateEN), .bwe2('1));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					endmodule
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user