mirror of
				https://github.com/openhwgroup/cvw
				synced 2025-02-11 06:05:49 +00:00 
			
		
		
		
	Manual attempt to merge with upstream changes
This commit is contained in:
		
							parent
							
								
									21eaa0b989
								
							
						
					
					
						commit
						82611ba889
					
				@ -1,6 +1,5 @@
 | 
			
		||||
--override cpu/show_c_prefix=T
 | 
			
		||||
--override cpu/unaligned=F
 | 
			
		||||
--override cpu/mstatus_FS=1
 | 
			
		||||
--override cpu/ignore_non_leaf_DAU=1
 | 
			
		||||
 | 
			
		||||
# Enable the Imperas instruction coverage
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ vlog +incdir+../config/$1 \
 | 
			
		||||
     $env(IMPERAS_HOME)/ImpProprietary/source/host/rvvi/imperasDV-api-pkg.sv \
 | 
			
		||||
     $env(IMPERAS_HOME)/ImpProprietary/source/host/rvvi/trace2api.sv  \
 | 
			
		||||
     $env(IMPERAS_HOME)/ImpProprietary/source/host/rvvi/trace2log.sv  \
 | 
			
		||||
     $env(IMPERAS_HOME)/ImpProprietary/source/host/rvvi/trace2cov.sv  \
 | 
			
		||||
     ../testbench/testbench_imperas.sv \
 | 
			
		||||
     ../testbench/common/*.sv   \
 | 
			
		||||
     ../src/*/*.sv \
 | 
			
		||||
 | 
			
		||||
@ -33,6 +33,6 @@ module lzc #(parameter WIDTH = 1) (
 | 
			
		||||
  always_comb begin
 | 
			
		||||
    i = 0;
 | 
			
		||||
    while (~num[WIDTH-1-i] & (i < WIDTH)) i = i+1;  // search for leading one
 | 
			
		||||
    ZeroCnt = i[$clog2(WIDTH)-1:0];
 | 
			
		||||
    ZeroCnt = i[$clog2(WIDTH+1)-1:0];
 | 
			
		||||
  end
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
@ -55,7 +55,7 @@ module ram1p1rwbe #(parameter DEPTH=64, WIDTH=44) (
 | 
			
		||||
     logic [WIDTH-1:0] BitWriteMask;
 | 
			
		||||
     for (index=0; index < WIDTH; index++) 
 | 
			
		||||
       assign BitWriteMask[index] = bwe[index/8];
 | 
			
		||||
    TS1N28HPCPSVTB64X128M4SW sram1A (.CLK(clk), .CEB(~ce), .WEB(~we),
 | 
			
		||||
    ram1p1rwbe_64x128 sram1A (.CLK(clk), .CEB(~ce), .WEB(~we),
 | 
			
		||||
			      .A(addr), .D(din), 
 | 
			
		||||
			      .BWEB(~BitWriteMask), .Q(dout));
 | 
			
		||||
    
 | 
			
		||||
@ -75,7 +75,7 @@ module ram1p1rwbe #(parameter DEPTH=64, WIDTH=44) (
 | 
			
		||||
     logic [WIDTH-1:0] BitWriteMask;
 | 
			
		||||
     for (index=0; index < WIDTH; index++) 
 | 
			
		||||
       assign BitWriteMask[index] = bwe[index/8];
 | 
			
		||||
     ram1p1rwbe_64x44 sram1B (.CLK(clk), .CEB(~ce), .WEB(~we),
 | 
			
		||||
     ram1p1rwbe_64x22 sram1B (.CLK(clk), .CEB(~ce), .WEB(~we),
 | 
			
		||||
			      .A(addr), .D(din), 
 | 
			
		||||
			      .BWEB(~BitWriteMask), .Q(dout));     
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
@ -66,6 +66,8 @@ module controller(
 | 
			
		||||
  output logic        RegWriteM,               // Instruction writes a register (needed for Hazard unit)
 | 
			
		||||
  output logic        InvalidateICacheM, FlushDCacheM, // Invalidate I$, flush D$
 | 
			
		||||
  output logic        InstrValidD, InstrValidE, InstrValidM, // Instruction is valid
 | 
			
		||||
  output logic        BranchD, BranchE,
 | 
			
		||||
  output logic        JumpD,
 | 
			
		||||
 | 
			
		||||
  output logic        FWriteIntM,              // FPU controller writes integer register file
 | 
			
		||||
  // Writeback stage control signals
 | 
			
		||||
@ -88,8 +90,6 @@ module controller(
 | 
			
		||||
  logic 	     RegWriteD, RegWriteE;           // RegWrite (register will be written)
 | 
			
		||||
  logic [2:0]  ResultSrcD, ResultSrcE, ResultSrcM; // Select which result to write back to register file
 | 
			
		||||
  logic [1:0]  MemRWD, MemRWE;                 // Store (write to memory)
 | 
			
		||||
  logic		     JumpD;                          // Jump instruction
 | 
			
		||||
  logic		     BranchD, BranchE;               // Branch instruction
 | 
			
		||||
  logic	       ALUOpD;                         // 0 for address generation, 1 for all other operations (must use Funct3)
 | 
			
		||||
  logic [2:0]  ALUControlD;                    // Determines ALU operation
 | 
			
		||||
  logic [2:0]  ALUSelectD;                     // ALU mux select signal
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,32 @@
 | 
			
		||||
///////////////////////////////////////////
 | 
			
		||||
// datapath.sv
 | 
			
		||||
//
 | 
			
		||||
// Written: David_Harris@hmc.edu, Sarah.Harris@unlv.edu
 | 
			
		||||
// Created: 9 January 2021
 | 
			
		||||
// Modified: 
 | 
			
		||||
//
 | 
			
		||||
// Purpose: Wally Integer Datapath
 | 
			
		||||
// 
 | 
			
		||||
// Documentation: RISC-V System on Chip Design Chapter 4 (Figure 4.12)
 | 
			
		||||
//
 | 
			
		||||
// 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 datapath (
 | 
			
		||||
 | 
			
		||||
@ -55,6 +55,8 @@ module ieu (
 | 
			
		||||
  input  logic [`XLEN-1:0]  FIntResM,                        // Integer result from FPU (fmv, fclass, fcmp)
 | 
			
		||||
  output logic              InvalidateICacheM, FlushDCacheM, // Invalidate I$, flush D$
 | 
			
		||||
  output logic              InstrValidD, InstrValidE, InstrValidM,// Instruction is valid
 | 
			
		||||
  output logic              BranchD, BranchE,
 | 
			
		||||
  output logic              JumpD, JumpE,
 | 
			
		||||
  // Writeback stage signals
 | 
			
		||||
  input  logic [`XLEN-1:0]  FIntDivResultW,                  // Integer divide result from FPU fdivsqrt)
 | 
			
		||||
  input  logic [`XLEN-1:0]  CSRReadValW,                     // CSR read value, 
 | 
			
		||||
@ -90,15 +92,14 @@ module ieu (
 | 
			
		||||
  logic [1:0] ForwardAE, ForwardBE;                          // Select signals for forwarding multiplexers
 | 
			
		||||
  logic       RegWriteM, RegWriteW;                          // Register will be written in Memory, Writeback stages
 | 
			
		||||
  logic       MemReadE, CSRReadE;                            // Load, CSRRead instruction
 | 
			
		||||
  logic       JumpE;                                         // Jump instruction
 | 
			
		||||
  logic       BranchSignedE;                                 // Branch does signed comparison on operands
 | 
			
		||||
  logic       MDUE;                                          // Multiply/divide instruction
 | 
			
		||||
           
 | 
			
		||||
  controller c(
 | 
			
		||||
controller c(
 | 
			
		||||
    .clk, .reset, .StallD, .FlushD, .InstrD, .ImmSrcD,
 | 
			
		||||
    .IllegalIEUFPUInstrD, .IllegalBaseInstrD, .StallE, .FlushE, .FlagsE, .FWriteIntE,
 | 
			
		||||
    .PCSrcE, .ALUControlE, .ALUSrcAE, .ALUSrcBE, .ALUResultSrcE, .MemReadE, .CSRReadE, 
 | 
			
		||||
    .Funct3E, .IntDivE, .MDUE, .W64E, .BranchD, .BranchE, .JumpD, .JumpE, .SCE, .BranchSignedE, .StallM, .FlushM, .MemRWM,
 | 
			
		||||
    .PCSrcE, .ALUControlE, .ALUSrcAE, .ALUSrcBE, .ALUResultSrcE, .ALUSelectE, .MemReadE, .CSRReadE, 
 | 
			
		||||
    .Funct3E, .IntDivE, .MDUE, .W64E, .BranchD, .BranchE, .JumpD, .JumpE, .SCE, .BranchSignedE, .BSelectE, .ZBBSelectE, .StallM, .FlushM, .MemRWM,
 | 
			
		||||
    .CSRReadM, .CSRWriteM, .PrivilegedM, .AtomicM, .Funct3M,
 | 
			
		||||
    .RegWriteM, .InvalidateICacheM, .FlushDCacheM, .InstrValidM, .InstrValidE, .InstrValidD, .FWriteIntM,
 | 
			
		||||
    .StallW, .FlushW, .RegWriteW, .IntDivW, .ResultSrcW, .CSRWriteFenceM, .StoreStallD);
 | 
			
		||||
 | 
			
		||||
@ -34,7 +34,9 @@ module RASPredictor #(parameter int StackSize = 16 )(
 | 
			
		||||
  input  logic 			   reset, 
 | 
			
		||||
  input  logic 			   StallF, StallD, StallE, StallM, FlushD, FlushE, FlushM,
 | 
			
		||||
  input  logic [3:0] 	   WrongPredInstrClassD,                      // Prediction class is wrong
 | 
			
		||||
  input  logic [3:0] 	   InstrClassD, InstrClassE, PredInstrClassF, // Instr class
 | 
			
		||||
  input  logic [3:0] 	   InstrClassD,
 | 
			
		||||
  input  logic [3:0]       InstrClassE,                  // Instr class
 | 
			
		||||
  input  logic [3:0]       PredInstrClassF,
 | 
			
		||||
  input  logic [`XLEN-1:0] PCLinkE,                                   // PC of instruction after a jal
 | 
			
		||||
  output logic [`XLEN-1:0] RASPCF                                     // Top of the stack
 | 
			
		||||
   );
 | 
			
		||||
@ -93,6 +95,3 @@ module RASPredictor #(parameter int StackSize = 16 )(
 | 
			
		||||
  
 | 
			
		||||
  
 | 
			
		||||
endmodule
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -52,6 +52,8 @@ module bpred (
 | 
			
		||||
 | 
			
		||||
  // Branch and jump outcome
 | 
			
		||||
  input logic              InstrValidD, InstrValidE,
 | 
			
		||||
  input  logic             BranchD, BranchE,
 | 
			
		||||
  input  logic             JumpD, JumpE,
 | 
			
		||||
  input logic              PCSrcE,                    // Executation stage branch is taken
 | 
			
		||||
  input logic [`XLEN-1:0]  IEUAdrE,                   // The branch/jump target address
 | 
			
		||||
  input logic [`XLEN-1:0]  IEUAdrM,                   // The branch/jump target address
 | 
			
		||||
@ -74,7 +76,8 @@ module bpred (
 | 
			
		||||
  logic [`XLEN-1:0]         PredPCF, RASPCF;
 | 
			
		||||
  logic                     PredictionPCWrongE;
 | 
			
		||||
  logic                     AnyWrongPredInstrClassD, AnyWrongPredInstrClassE;
 | 
			
		||||
  logic [3:0]               InstrClassF, InstrClassD, InstrClassE, InstrClassW;
 | 
			
		||||
  logic [3:0]               InstrClassD;
 | 
			
		||||
  logic [3:0] 				InstrClassE;
 | 
			
		||||
  logic                     DirPredictionWrongE, BTBPredPCWrongE, RASPredPCWrongE;
 | 
			
		||||
  
 | 
			
		||||
  logic                     SelBPPredF;
 | 
			
		||||
@ -83,9 +86,9 @@ module bpred (
 | 
			
		||||
  logic [`XLEN-1:0] 		PCCorrectE;
 | 
			
		||||
  logic [3:0] 				WrongPredInstrClassD;
 | 
			
		||||
 | 
			
		||||
  logic BTBTargetWrongE;
 | 
			
		||||
  logic RASTargetWrongE;
 | 
			
		||||
  logic JumpOrTakenBranchE;
 | 
			
		||||
  logic 					BTBTargetWrongE;
 | 
			
		||||
  logic 					RASTargetWrongE;
 | 
			
		||||
  logic 					JumpOrTakenBranchE;
 | 
			
		||||
 | 
			
		||||
  logic [`XLEN-1:0] PredPCD, PredPCE, RASPCD, RASPCE;
 | 
			
		||||
 | 
			
		||||
@ -113,29 +116,11 @@ module bpred (
 | 
			
		||||
      .PCNextF, .PCM, .DirPredictionF, .DirPredictionWrongE,
 | 
			
		||||
      .BranchInstrE(InstrClassE[0]), .BranchInstrM(InstrClassM[0]), .PCSrcE);
 | 
			
		||||
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
  end else if (`BPRED_TYPE == "BPSPECULATIVEGLOBAL") begin:Predictor
 | 
			
		||||
    speculativeglobalhistory #(`BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
 | 
			
		||||
      .DirPredictionF, .DirPredictionWrongE,
 | 
			
		||||
      .PredInstrClassF, .InstrClassD, .InstrClassE, .WrongPredInstrClassD, .PCSrcE);
 | 
			
		||||
	    
 | 
			
		||||
  end else if (`BPRED_TYPE == "BPGSHARE") begin:Predictor
 | 
			
		||||
    gshare #(`BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .FlushD, .FlushE, .FlushM,
 | 
			
		||||
      .PCNextF, .PCE, .DirPredictionF, .DirPredictionWrongE,
 | 
			
		||||
      .BranchInstrE(InstrClassE[0]), .BranchInstrM(InstrClassM[0]), .PCSrcE);
 | 
			
		||||
 | 
			
		||||
  end else if (`BPRED_TYPE == "BPSPECULATIVEGSHARE") begin:Predictor
 | 
			
		||||
    speculativegshare #(`BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
 | 
			
		||||
      .PCNextF, .PCF, .PCD, .PCE, .DirPredictionF, .DirPredictionWrongE,
 | 
			
		||||
      .PredInstrClassF, .InstrClassD, .InstrClassE, .WrongPredInstrClassD, .PCSrcE);
 | 
			
		||||
 | 
			
		||||
=======
 | 
			
		||||
  end else if (`BPRED_TYPE == "BP_GLOBAL_BASIC") begin:Predictor
 | 
			
		||||
    gsharebasic #(`BPRED_SIZE, 0) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
 | 
			
		||||
      .PCNextF, .PCM, .DirPredictionF, .DirPredictionWrongE,
 | 
			
		||||
      .BranchInstrE(InstrClassE[0]), .BranchInstrM(InstrClassM[0]), .PCSrcE);
 | 
			
		||||
	
 | 
			
		||||
>>>>>>> upstream/main
 | 
			
		||||
  end else if (`BPRED_TYPE == "BPLOCALPAg") begin:Predictor
 | 
			
		||||
    // *** Fix me
 | 
			
		||||
/* -----\/----- EXCLUDED -----\/-----
 | 
			
		||||
@ -167,7 +152,8 @@ module bpred (
 | 
			
		||||
  if (`INSTR_CLASS_PRED == 0) begin : DirectClassDecode
 | 
			
		||||
	logic [4:0] CompressedOpcF;
 | 
			
		||||
	logic [3:0] InstrClassF;
 | 
			
		||||
	logic 		cjal, cj, cjr, cjalr;
 | 
			
		||||
	logic 		cjal, cj, cjr, cjalr, CJumpF, CBranchF;
 | 
			
		||||
	logic 		JumpF, BranchF;
 | 
			
		||||
	
 | 
			
		||||
	assign CompressedOpcF = {PostSpillInstrRawF[1:0], PostSpillInstrRawF[15:13]};
 | 
			
		||||
 | 
			
		||||
@ -175,24 +161,23 @@ module bpred (
 | 
			
		||||
	assign cj = CompressedOpcF == 5'h0d;
 | 
			
		||||
	assign cjr = CompressedOpcF == 5'h14 & ~PostSpillInstrRawF[12] & PostSpillInstrRawF[6:2] == 5'b0 & PostSpillInstrRawF[11:7] != 5'b0;
 | 
			
		||||
	assign cjalr = CompressedOpcF == 5'h14 & PostSpillInstrRawF[12] & PostSpillInstrRawF[6:2] == 5'b0 & PostSpillInstrRawF[11:7] != 5'b0;
 | 
			
		||||
	assign CJumpF = cjal | cj | cjr | cjalr;
 | 
			
		||||
	assign CBranchF = CompressedOpcF[4:1] == 4'h7;
 | 
			
		||||
 | 
			
		||||
	assign JumpF = PostSpillInstrRawF[6:0] == 7'h67 | PostSpillInstrRawF[6:0] == 7'h6F;
 | 
			
		||||
	assign BranchF = PostSpillInstrRawF[6:0] == 7'h63;
 | 
			
		||||
	
 | 
			
		||||
	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[2] = PostSpillInstrRawF[6:0] == 7'h67 & (PostSpillInstrRawF[19:15] & 5'h1B) == 5'h01 | // return must return to ra or r5
 | 
			
		||||
	assign InstrClassF[0] = BranchF | (`C_SUPPORTED & CBranchF);
 | 
			
		||||
	assign InstrClassF[1] = JumpF | (`C_SUPPORTED & (cjal | cj | cj | cjalr));
 | 
			
		||||
	assign InstrClassF[2] = (JumpF & (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));
 | 
			
		||||
	
 | 
			
		||||
	assign InstrClassF[3] = ((PostSpillInstrRawF[6:0] & 7'h77) == 7'h67 & (PostSpillInstrRawF[11:07] & 5'h1B) == 5'h01) | // jal(r) must link to ra or x5
 | 
			
		||||
	assign InstrClassF[3] = (JumpF & (PostSpillInstrRawF[11:07] & 5'h1B) == 5'h01) | // jal(r) must link to ra or x5
 | 
			
		||||
							(`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]) | 
 | 
			
		||||
@ -206,15 +191,13 @@ 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
 | 
			
		||||
  assign InstrClassD[3] = JumpD & (InstrD[11:7] & 5'h1B) == 5'h01; // jal(r) must link to ra or x5
 | 
			
		||||
 | 
			
		||||
  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
 | 
			
		||||
@ -235,13 +218,10 @@ module bpred (
 | 
			
		||||
  assign PredictionPCWrongE = PCCorrectE != PCD;
 | 
			
		||||
 | 
			
		||||
  // branch class prediction wrong.
 | 
			
		||||
  assign WrongPredInstrClassD = PredInstrClassD ^ InstrClassD;
 | 
			
		||||
  assign WrongPredInstrClassD = PredInstrClassD ^ InstrClassD[3:0];
 | 
			
		||||
  assign AnyWrongPredInstrClassD = |WrongPredInstrClassD;
 | 
			
		||||
  
 | 
			
		||||
  // branch is wrong only if the PC does not match and both the Decode and Fetch stages have valid instructions.
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
  assign BPPredWrongE = PredictionPCWrongE & InstrValidE & InstrValidD;
 | 
			
		||||
=======
 | 
			
		||||
  //assign BPPredWrongE = (PredictionPCWrongE & |InstrClassE | (AnyWrongPredInstrClassE & ~|InstrClassE));
 | 
			
		||||
  assign BPPredWrongE = PredictionPCWrongE & InstrValidE & InstrValidD;
 | 
			
		||||
 | 
			
		||||
@ -249,7 +229,6 @@ module bpred (
 | 
			
		||||
  logic NotMatch;
 | 
			
		||||
  assign BPPredWrongEAlt = PredictionPCWrongE & InstrValidE & InstrValidD; // this does not work for cubic benchmark
 | 
			
		||||
  assign NotMatch = BPPredWrongE != BPPredWrongEAlt;
 | 
			
		||||
>>>>>>> upstream/main
 | 
			
		||||
 | 
			
		||||
  // Output the predicted PC or corrected PC on miss-predict.
 | 
			
		||||
  // Selects the BP or PC+2/4.
 | 
			
		||||
@ -274,10 +253,10 @@ module bpred (
 | 
			
		||||
  // could be wrong or the fall through address selected for branch predict not taken.
 | 
			
		||||
  // By pipeline the BTB's PC and RAS address through the pipeline we can measure the accuracy of
 | 
			
		||||
  // both without the above inaccuracies.
 | 
			
		||||
  assign BTBPredPCWrongE = (PredPCE != IEUAdrE) & (InstrClassE[0] | InstrClassE[1] | InstrClassE[3]) & PCSrcE;
 | 
			
		||||
  assign BTBPredPCWrongE = (PredPCE != IEUAdrE) & (InstrClassE[0] | InstrClassE[1] & ~InstrClassE[2]) & PCSrcE;
 | 
			
		||||
  assign RASPredPCWrongE = (RASPCE != IEUAdrE) & InstrClassE[2] & PCSrcE;
 | 
			
		||||
 | 
			
		||||
  assign JumpOrTakenBranchE = (InstrClassE[0] & PCSrcE) | InstrClassE[1] | InstrClassE[3];
 | 
			
		||||
  assign JumpOrTakenBranchE = (InstrClassE[0] & PCSrcE) | InstrClassE[1];
 | 
			
		||||
  
 | 
			
		||||
  flopenrc #(1) JumpOrTakenBranchMReg(clk, reset, FlushM, ~StallM, JumpOrTakenBranchE, JumpOrTakenBranchM);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -52,7 +52,6 @@ module btb #(parameter Depth = 10 ) (
 | 
			
		||||
  logic [`XLEN+3:0] 		ForwardBTBPrediction, ForwardBTBPredictionF;
 | 
			
		||||
  logic [`XLEN+3:0] 		TableBTBPredictionF;
 | 
			
		||||
  logic [`XLEN-1:0] 		PredPCD;  
 | 
			
		||||
  logic [3:0] 				PredInstrClassD;  // *** copy of reg outside module
 | 
			
		||||
  logic 					UpdateEn;
 | 
			
		||||
    
 | 
			
		||||
  // hashing function for indexing the PC
 | 
			
		||||
 | 
			
		||||
@ -33,8 +33,8 @@ module gshare #(parameter k = 10,
 | 
			
		||||
                parameter integer TYPE = 1) (
 | 
			
		||||
  input logic             clk,
 | 
			
		||||
  input logic             reset,
 | 
			
		||||
  input logic             StallF, StallD, StallE, StallM, 
 | 
			
		||||
  input logic             FlushD, FlushE, FlushM,
 | 
			
		||||
  input logic             StallF, StallD, StallE, StallM, StallW,
 | 
			
		||||
  input logic             FlushD, FlushE, FlushM, FlushW,
 | 
			
		||||
  output logic [1:0]      DirPredictionF, 
 | 
			
		||||
  output logic            DirPredictionWrongE,
 | 
			
		||||
  // update
 | 
			
		||||
 | 
			
		||||
@ -36,6 +36,8 @@ module ifu (
 | 
			
		||||
  input  logic              InvalidateICacheM,                        // Clears all instruction cache valid bits
 | 
			
		||||
  input  logic         	    CSRWriteFenceM,                           // CSR write or fence instruction, PCNextF = the next valid PC (typically PCE)
 | 
			
		||||
  input  logic              InstrValidD, InstrValidE, InstrValidM,
 | 
			
		||||
  input  logic              BranchD, BranchE,
 | 
			
		||||
  input  logic              JumpD, JumpE,
 | 
			
		||||
	// Bus interface
 | 
			
		||||
  output logic [`PA_BITS-1:0] IFUHADDR,      // Bus address from IFU to EBU
 | 
			
		||||
  input  logic [`XLEN-1:0] 	HRDATA,           // Bus read data from IFU to EBU
 | 
			
		||||
 | 
			
		||||
@ -161,11 +161,13 @@ module wallypipelinedcore (
 | 
			
		||||
  logic                          FCvtIntE;
 | 
			
		||||
  logic                          CommittedF;
 | 
			
		||||
  logic 						 JumpOrTakenBranchM;
 | 
			
		||||
  logic 						 BranchD, BranchE, JumpD, JumpE;
 | 
			
		||||
  
 | 
			
		||||
  // instruction fetch unit: PC, branch prediction, instruction cache
 | 
			
		||||
  ifu ifu(.clk, .reset,
 | 
			
		||||
    .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW,
 | 
			
		||||
    .InstrValidM, .InstrValidE, .InstrValidD,
 | 
			
		||||
    .BranchD, .BranchE, .JumpD, .JumpE,
 | 
			
		||||
    // Fetch
 | 
			
		||||
    .HRDATA, .PCFSpill, .IFUHADDR, .PCNext2F,
 | 
			
		||||
    .IFUStallF, .IFUHBURST, .IFUHTRANS, .IFUHSIZE, .IFUHREADY, .IFUHWRITE,
 | 
			
		||||
@ -199,6 +201,7 @@ module wallypipelinedcore (
 | 
			
		||||
     .Funct3M, // size and signedness to LSU
 | 
			
		||||
     .SrcAM, // to privilege and fpu
 | 
			
		||||
     .RdE, .RdM, .FIntResM, .InvalidateICacheM, .FlushDCacheM,
 | 
			
		||||
     .BranchD, .BranchE, .JumpD, .JumpE,
 | 
			
		||||
     // Writeback stage
 | 
			
		||||
     .CSRReadValW, .MDUResultW, .FIntDivResultW, .RdW, .ReadDataW(ReadDataW[`XLEN-1:0]),
 | 
			
		||||
     .InstrValidM, .InstrValidE, .InstrValidD, .FCvtIntResW, .FCvtIntW,
 | 
			
		||||
 | 
			
		||||
@ -52,6 +52,10 @@ if {$tech == "sky130"} {
 | 
			
		||||
    lappend target_library $s9lib/scc9gena_tt_1.2v_25C.db
 | 
			
		||||
} elseif {$tech == "tsmc28"} {
 | 
			
		||||
    lappend target_library $s10lib/tcbn28hpcplusbwp30p140tt0p9v25c.db
 | 
			
		||||
} elseif {$tech == "tsmc28psyn"} {
 | 
			
		||||
    set mw_reference_library [list ]    
 | 
			
		||||
    lappend target_library $s10lib/tcbn28hpcplusbwp30p140tt0p9v25c.db
 | 
			
		||||
    lappend mw_reference_library $MW_REFERENCE_LIBRARY/tcbn28hpcplusbwp30p140    
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Set up DesignWare cache read and write directories to speed up compile.
 | 
			
		||||
 | 
			
		||||
@ -30,8 +30,6 @@ export SAIFPOWER ?= 0
 | 
			
		||||
OLDCONFIGDIR ?= ${WALLY}/config
 | 
			
		||||
export CONFIGDIR ?= $(OUTPUTDIR)/config
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
default:
 | 
			
		||||
	@echo "  Basic synthesis procedure for Wally:"
 | 
			
		||||
	@echo "        Invoke with make synth"
 | 
			
		||||
@ -130,7 +128,6 @@ mkdirecs:
 | 
			
		||||
	@mkdir -p $(OUTPUTDIR)/mapped
 | 
			
		||||
	@mkdir -p $(OUTPUTDIR)/unmapped
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
synth: mkdirecs configs rundc clean
 | 
			
		||||
 | 
			
		||||
rundc:
 | 
			
		||||
@ -150,4 +147,4 @@ clean:
 | 
			
		||||
	rm -f filenames*.log
 | 
			
		||||
	rm -f power.saif
 | 
			
		||||
	rm -f Synopsys_stack_trace_*.txt
 | 
			
		||||
	rm -f crte_*.txt
 | 
			
		||||
	rm -f crte_*.txt
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@ def mask(command):
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    
 | 
			
		||||
    techs = ['sky90', 'tsmc28']
 | 
			
		||||
    techs = ['sky90', 'tsmc28', 'tsmc28psyn']
 | 
			
		||||
    allConfigs = ['rv32gc', 'rv32imc', 'rv64gc', 'rv64imc', 'rv32e', 'rv32i', 'rv64i']
 | 
			
		||||
    freqVaryPct = [-20, -12, -8, -6, -4, -2, 0, 2, 4, 6, 8, 12, 20]
 | 
			
		||||
#    freqVaryPct = [-20, -10, 0, 10, 20]
 | 
			
		||||
 | 
			
		||||
@ -126,6 +126,7 @@ module testbench;
 | 
			
		||||
 | 
			
		||||
`ifdef USE_IMPERAS_DV
 | 
			
		||||
    trace2log idv_trace2log(rvvi);
 | 
			
		||||
    trace2cov idv_trace2cov(rvvi);
 | 
			
		||||
 | 
			
		||||
    // enabling of comparison types
 | 
			
		||||
    trace2api #(.CMP_PC      (1),
 | 
			
		||||
 | 
			
		||||
@ -54,7 +54,6 @@ string tvpaths[] = '{
 | 
			
		||||
    "bd_speedopt_speed/src/cubic/cubic", // cubic is likely going to removed when embench 2.0 launches
 | 
			
		||||
    "bd_speedopt_speed/src/aha-mont64/aha-mont64",
 | 
			
		||||
    "bd_speedopt_speed/src/crc32/crc32",
 | 
			
		||||
    "bd_speedopt_speed/src/cubic/cubic", // cubic is likely going to removed when embench 2.0 launches
 | 
			
		||||
    "bd_speedopt_speed/src/edn/edn",
 | 
			
		||||
    "bd_speedopt_speed/src/huffbench/huffbench",
 | 
			
		||||
    "bd_speedopt_speed/src/matmult-int/matmult-int",
 | 
			
		||||
 | 
			
		||||
@ -1,34 +0,0 @@
 | 
			
		||||
#Kip Macsai-Goren and Kevin Kim
 | 
			
		||||
#Purpose is to manually make the B extension tests
 | 
			
		||||
import os
 | 
			
		||||
 | 
			
		||||
f = open("genBScript.sh", "w")
 | 
			
		||||
WALLY = os.getenv("WALLY")
 | 
			
		||||
os.chdir(f"{WALLY}/tests/riscof/riscof_work/rv64i_m/B/src")
 | 
			
		||||
 | 
			
		||||
lines = ""
 | 
			
		||||
 | 
			
		||||
#BUILDS B TESTS
 | 
			
		||||
for testname in os.listdir():
 | 
			
		||||
    lines = lines + f"""cd {WALLY}/tests/riscof/riscof_work/rv64i_m/B/src/{testname}/ref;riscv64-unknown-elf-gcc -march=rv64izba_zbb_zbc_zbs          -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles         -T {WALLY}/tests/riscof/sail_cSim/env/link.ld         -I {WALLY}/tests/riscof/sail_cSim/env/         -I {WALLY}/addins/riscv-arch-test/riscv-test-suite/env -mabi=lp64  {WALLY}/addins/riscv-arch-test/riscv-test-suite/rv64i_m/B/src/{testname} -o ref.elf -DTEST_CASE_1=True -DXLEN=64;riscv64-unknown-elf-objdump -D ref.elf > ref.elf.objdump;riscv_sim_RV64 -z268435455 -i --test-signature={WALLY}/tests/riscof/riscof_work/rv64i_m/B/src/{testname}/ref/Reference-sail_c_simulator.signature ref.elf > add.uw-01.log 2>&1;
 | 
			
		||||
rsync -a {WALLY}/tests/riscof/riscof_work/rv64i_m/ {WALLY}/tests/riscof/work/riscv-arch-test/rv64i_m/ || echo "error suppressed";
 | 
			
		||||
riscv64-unknown-elf-elf2hex --bit-width 64 --input {WALLY}/tests/riscof/riscof_work/rv64i_m/B/src/{testname}/ref/ref.elf --output {WALLY}/tests/riscof/work/riscv-arch-test/rv64i_m/B/src/{testname}/ref/ref.elf.memfile;
 | 
			
		||||
extractFunctionRadix.sh {WALLY}/tests/riscof/work/riscv-arch-test/rv64i_m/B/src/{testname}/ref/ref.elf.objdump;
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
os.chdir(f"{WALLY}/tests/riscof/riscof_work/rv64i_m/I/src")
 | 
			
		||||
 | 
			
		||||
#BUILDS I TESTS
 | 
			
		||||
for testname in os.listdir():
 | 
			
		||||
    lines = lines + f"""cd {WALLY}/tests/riscof/riscof_work/rv64i_m/I/src/{testname}/ref;riscv64-unknown-elf-gcc -march=rv64izba_zbb_zbc_zbs          -static -mcmodel=medany -fvisibility=hidden -nostdlib -nostartfiles         -T {WALLY}/tests/riscof/sail_cSim/env/link.ld         -I {WALLY}/tests/riscof/sail_cSim/env/         -I {WALLY}/addins/riscv-arch-test/riscv-test-suite/env -mabi=lp64  {WALLY}/addins/riscv-arch-test/riscv-test-suite/rv64i_m/I/src/{testname} -o ref.elf -DTEST_CASE_1=True -DXLEN=64;riscv64-unknown-elf-objdump -D ref.elf > ref.elf.objdump;riscv_sim_RV64 -z268435455 -i --test-signature={WALLY}/tests/riscof/riscof_work/rv64i_m/I/src/{testname}/ref/Reference-sail_c_simulator.signature ref.elf > add.uw-01.log 2>&1;
 | 
			
		||||
rsync -a {WALLY}/tests/riscof/riscof_work/rv64i_m/ {WALLY}/tests/riscof/work/riscv-arch-test/rv64i_m/ || echo "error suppressed";
 | 
			
		||||
riscv64-unknown-elf-elf2hex --bit-width 64 --input {WALLY}/tests/riscof/riscof_work/rv64i_m/I/src/{testname}/ref/ref.elf --output {WALLY}/tests/riscof/work/riscv-arch-test/rv64i_m/I/src/{testname}/ref/ref.elf.memfile;
 | 
			
		||||
extractFunctionRadix.sh {WALLY}/tests/riscof/work/riscv-arch-test/rv64i_m/I/src/{testname}/ref/ref.elf.objdump;
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
f.write(lines)
 | 
			
		||||
f.close()
 | 
			
		||||
 | 
			
		||||
@ -1,12 +1,12 @@
 | 
			
		||||
hart_ids: [0]
 | 
			
		||||
hart0:
 | 
			
		||||
  #ISA: RV32IMAFDCZicsr_Zifencei
 | 
			
		||||
  ISA: RV32IMACZicsr_Zifencei_Zba_Zbb_Zbc_Zbs
 | 
			
		||||
  ISA: RV32IMAFDCZicsr_Zifencei_Zba_Zbb_Zbc_Zbs
 | 
			
		||||
  physical_addr_sz: 32
 | 
			
		||||
  User_Spec_Version: '2.3'
 | 
			
		||||
  supported_xlen: [32]
 | 
			
		||||
  misa:
 | 
			
		||||
   reset-val: 0x40001105
 | 
			
		||||
   reset-val: 0x4000112D
 | 
			
		||||
   rv32:
 | 
			
		||||
     accessible: true
 | 
			
		||||
     mxl:
 | 
			
		||||
 | 
			
		||||
@ -1,12 +1,12 @@
 | 
			
		||||
hart_ids: [0]
 | 
			
		||||
hart0:
 | 
			
		||||
#  ISA: RV64IMAFDCSUZicsr_Zifencei
 | 
			
		||||
  ISA: RV64IMACSUZicsr_Zifencei_Zba_Zbb_Zbc_Zbs
 | 
			
		||||
  ISA: RV64IMAFDCSUZicsr_Zifencei_Zba_Zbb_Zbc_Zbs
 | 
			
		||||
  physical_addr_sz: 56
 | 
			
		||||
  User_Spec_Version: '2.3'
 | 
			
		||||
  supported_xlen: [64]
 | 
			
		||||
  misa:
 | 
			
		||||
   reset-val: 0x8000000000141105
 | 
			
		||||
   reset-val: 0x800000000014112D
 | 
			
		||||
   rv32:
 | 
			
		||||
      accessible: false
 | 
			
		||||
   rv64:
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user