diff --git a/config/buildroot/config.vh b/config/buildroot/config.vh index 371c825e2..ab4cf1469 100644 --- a/config/buildroot/config.vh +++ b/config/buildroot/config.vh @@ -138,7 +138,7 @@ localparam PLIC_UART_ID = 32'd10; localparam PLIC_GPIO_ID = 32'd3; localparam BPRED_SUPPORTED = 1; -localparam BranchPredictorType BPRED_TYPE = BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT +localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; diff --git a/config/fpga/config.vh b/config/fpga/config.vh index dbd7d9687..b30b2a9e1 100644 --- a/config/fpga/config.vh +++ b/config/fpga/config.vh @@ -151,7 +151,7 @@ localparam PLIC_GPIO_ID = 32'd3; localparam PLIC_UART_ID = 32'd10; localparam BPRED_SUPPORTED = 1; -localparam BranchPredictorType BPRED_TYPE = BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT +localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT localparam BPRED_NUM_LHR = 32'd6; localparam BPRED_SIZE = 32'd12; localparam BTB_SIZE = 32'd10; diff --git a/config/rv32e/config.vh b/config/rv32e/config.vh index 30b7c3050..89d3ccb65 100644 --- a/config/rv32e/config.vh +++ b/config/rv32e/config.vh @@ -139,7 +139,7 @@ localparam PLIC_GPIO_ID = 32'd3; localparam PLIC_UART_ID = 32'd10; localparam BPRED_SUPPORTED = 0; -localparam BranchPredictorType BPRED_TYPE = BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT +localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; diff --git a/config/rv32gc/config.vh b/config/rv32gc/config.vh index a966b0401..038f22488 100644 --- a/config/rv32gc/config.vh +++ b/config/rv32gc/config.vh @@ -140,7 +140,7 @@ localparam PLIC_GPIO_ID = 32'd3; localparam PLIC_UART_ID = 32'd10; localparam BPRED_SUPPORTED = 1; -localparam BranchPredictorType BPRED_TYPE = BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT +localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT localparam BPRED_SIZE = 32'd16; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; diff --git a/config/rv32i/config.vh b/config/rv32i/config.vh index eda81e298..2ef3762fd 100644 --- a/config/rv32i/config.vh +++ b/config/rv32i/config.vh @@ -139,7 +139,7 @@ localparam PLIC_GPIO_ID = 32'd3; localparam PLIC_UART_ID = 32'd10; localparam BPRED_SUPPORTED = 0; -localparam BranchPredictorType BPRED_TYPE = BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT +localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; diff --git a/config/rv32imc/config.vh b/config/rv32imc/config.vh index 0b2aee01e..24c0730ed 100644 --- a/config/rv32imc/config.vh +++ b/config/rv32imc/config.vh @@ -138,7 +138,7 @@ localparam PLIC_GPIO_ID = 32'd3; localparam PLIC_UART_ID = 32'd10; localparam BPRED_SUPPORTED = 0; -localparam BranchPredictorType BPRED_TYPE = BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT +localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; diff --git a/config/rv64fpquad/config.vh b/config/rv64fpquad/config.vh index a784d369f..c2ffa2cba 100644 --- a/config/rv64fpquad/config.vh +++ b/config/rv64fpquad/config.vh @@ -141,7 +141,7 @@ localparam PLIC_GPIO_ID = 32'd3; localparam PLIC_UART_ID = 32'd10; localparam BPRED_SUPPORTED = 1; -localparam BranchPredictorType BPRED_TYPE = BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT +localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; diff --git a/config/rv64gc/config.vh b/config/rv64gc/config.vh index 8d266ab3e..fae4b79e0 100644 --- a/config/rv64gc/config.vh +++ b/config/rv64gc/config.vh @@ -144,7 +144,7 @@ localparam PLIC_GPIO_ID = 32'd3; localparam PLIC_UART_ID = 32'd10; localparam BPRED_SUPPORTED = 1; -localparam BranchPredictorType BPRED_TYPE = BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT +localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT localparam BPRED_NUM_LHR = 32'd6; localparam BPRED_SIZE = 32'd10; localparam BTB_SIZE = 32'd10; diff --git a/config/rv64i/config.vh b/config/rv64i/config.vh index ff6a1c61e..bf0f49e2e 100644 --- a/config/rv64i/config.vh +++ b/config/rv64i/config.vh @@ -141,7 +141,7 @@ localparam PLIC_GPIO_ID = 32'd3; localparam PLIC_UART_ID = 32'd10; localparam BPRED_SUPPORTED = 0; -localparam BranchPredictorType BPRED_TYPE = BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT +localparam BPRED_TYPE = `BP_GSHARE; // BP_GSHARE_BASIC, BP_GLOBAL, BP_GLOBAL_BASIC, BP_TWOBIT localparam BPRED_SIZE = 32'd10; localparam BPRED_NUM_LHR = 32'd6; localparam BTB_SIZE = 32'd10; diff --git a/config/shared/BranchPredictorType.vh b/config/shared/BranchPredictorType.vh index e252de249..4b88574a8 100644 --- a/config/shared/BranchPredictorType.vh +++ b/config/shared/BranchPredictorType.vh @@ -1,3 +1,8 @@ -typedef enum logic[3:0] {BP_TWOBIT, BP_GSHARE, BP_GLOBAL, BP_GSHARE_BASIC, - BP_GLOBAL_BASIC, BP_LOCAL_BASIC, BP_LOCAL_AHEAD, BP_LOCAL_REPAIR} BranchPredictorType; - +`define BP_TWOBIT (32'd0) +`define BP_GSHARE (32'd1) +`define BP_GLOBAL (32'd2) +`define BP_GSHARE_BASIC (32'd3) +`define BP_GLOBAL_BASIC (32'd4) +`define BP_LOCAL_BASIC (32'd5) +`define BP_LOCAL_AHEAD (32'd6) +`define BP_LOCAL_REPAIR (32'd7) diff --git a/config/shared/parameter-defs.vh b/config/shared/parameter-defs.vh index f1000d6d9..755c6876f 100644 --- a/config/shared/parameter-defs.vh +++ b/config/shared/parameter-defs.vh @@ -1,6 +1,8 @@ // Populate parameter structure with values specific to the current configuration +`include "BranchPredictorType.vh" + parameter cvw_t P = '{ FPGA : FPGA, QEMU : QEMU, diff --git a/fpga/generator/Makefile b/fpga/generator/Makefile index 1d6f5bcce..ff34c0327 100644 --- a/fpga/generator/Makefile +++ b/fpga/generator/Makefile @@ -3,9 +3,9 @@ sdc_src := ~/repos/sdc.tar.gz # Select the desired board and the all build rules # vcu118 -export XILINX_PART := xcvu9p-flga2104-2L-e -export XILINX_BOARD := xilinx.com:vcu118:part0:2.4 -export board := vcu118 +#export XILINX_PART := xcvu9p-flga2104-2L-e +#export XILINX_BOARD := xilinx.com:vcu118:part0:2.4 +#export board := vcu118 # vcu108 #export XILINX_PART := xcvu095-ffva2104-2-e @@ -13,15 +13,15 @@ export board := vcu118 #export board := vcu108 # Arty A7 -#export XILINX_PART := xc7a100tcsg324-1 -#export XILINX_BOARD := digilentinc.com:arty-a7-100:part0:1.1 -#export board := ArtyA7 +export XILINX_PART := xc7a100tcsg324-1 +export XILINX_BOARD := digilentinc.com:arty-a7-100:part0:1.1 +export board := ArtyA7 # for Arty A7 and S7 boards -#all: FPGA_Arty +all: FPGA_Arty # VCU 108 and VCU 118 boards -all: FPGA_VCU +#all: FPGA_VCU FPGA_Arty: PreProcessFiles IP_Arty SDC vivado -mode tcl -source wally.tcl 2>&1 | tee wally.log diff --git a/fpga/src/wallypipelinedsocwrapper.sv b/fpga/src/wallypipelinedsocwrapper.sv index bdde7f4fc..f62a9bdbd 100644 --- a/fpga/src/wallypipelinedsocwrapper.sv +++ b/fpga/src/wallypipelinedsocwrapper.sv @@ -25,6 +25,7 @@ // and limitations under the License. //////////////////////////////////////////////////////////////////////////////////////////////// +//`include "BranchPredictorType.vh" `include "config.vh" import cvw::*; diff --git a/linux/testvector-generation/genInitMem.sh b/linux/testvector-generation/genInitMem.sh index 8c16ee330..b48a64896 100755 --- a/linux/testvector-generation/genInitMem.sh +++ b/linux/testvector-generation/genInitMem.sh @@ -1,7 +1,7 @@ #!/bin/bash tcpPort=1235 -imageDir=$RISCV/buildroot/output/images -tvDir=$RISCV/linux-testvectors +imageDir=/home/ross/repos/buildroot/output/images +tvDir=linux-testvectors rawRamFile="$tvDir/ramGDB.bin" ramFile="$tvDir/ram.bin" rawBootmemFile="$tvDir/bootmemGDB.bin" @@ -36,7 +36,7 @@ then echo "Launching QEMU in replay mode!" (qemu-system-riscv64 \ - -M virt -dtb $RISCV/buildroot/output/images/wally-virt.dtb \ + -M virt -dtb /home/ross/repos/buildroot/output/images/wally-artya7.dtb \ -nographic \ -bios $imageDir/fw_jump.elf -kernel $imageDir/Image -append "root=/dev/vda ro" -initrd $imageDir/rootfs.cpio \ -gdb tcp::$tcpPort -S) \ diff --git a/src/cvw.sv b/src/cvw.sv index e2c81b4e2..4544164e1 100644 --- a/src/cvw.sv +++ b/src/cvw.sv @@ -144,7 +144,7 @@ typedef struct packed { int PLIC_UART_ID; logic BPRED_SUPPORTED; - BranchPredictorType BPRED_TYPE; + logic [31:0] BPRED_TYPE; int BPRED_NUM_LHR; int BPRED_SIZE; int BTB_SIZE; diff --git a/src/ifu/bpred/bpred.sv b/src/ifu/bpred/bpred.sv index 13439cd43..64297c44a 100644 --- a/src/ifu/bpred/bpred.sv +++ b/src/ifu/bpred/bpred.sv @@ -27,6 +27,8 @@ //////////////////////////////////////////////////////////////////////////////////////////////// `define INSTR_CLASS_PRED 1 +`include "BranchPredictorType.vh" + module bpred import cvw::*; #(parameter cvw_t P) ( input logic clk, reset, @@ -96,45 +98,45 @@ module bpred import cvw::*; #(parameter cvw_t P) ( logic [P.XLEN-1:0] BPBTAE; // Part 1 branch direction prediction - if (P.BPRED_TYPE == BP_TWOBIT) begin:Predictor + if (P.BPRED_TYPE == `BP_TWOBIT) begin:Predictor twoBitPredictor #(P, P.XLEN, P.BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW, .PCNextF, .PCM, .BPDirPredF, .BPDirPredWrongE, .BranchE, .BranchM, .PCSrcE); - end else if (P.BPRED_TYPE == BP_GSHARE) begin:Predictor + end else if (P.BPRED_TYPE == `BP_GSHARE) begin:Predictor gshare #(P, P.XLEN, P.BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW, .PCNextF, .PCF, .PCD, .PCE, .PCM, .BPDirPredF, .BPDirPredWrongE, .BPBranchF, .BranchD, .BranchE, .BranchM, .BranchW, .PCSrcE); - end else if (P.BPRED_TYPE == BP_GLOBAL) begin:Predictor + end else if (P.BPRED_TYPE == `BP_GLOBAL) begin:Predictor gshare #(P, P.XLEN, P.BPRED_SIZE, 0) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW, .PCNextF, .PCF, .PCD, .PCE, .PCM, .BPDirPredF, .BPDirPredWrongE, .BPBranchF, .BranchD, .BranchE, .BranchM, .BranchW, .PCSrcE); - end else if (P.BPRED_TYPE == BP_GSHARE_BASIC) begin:Predictor + end else if (P.BPRED_TYPE == `BP_GSHARE_BASIC) begin:Predictor gsharebasic #(P, P.XLEN, P.BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW, .PCNextF, .PCM, .BPDirPredF, .BPDirPredWrongE, .BranchE, .BranchM, .PCSrcE); - end else if (P.BPRED_TYPE == BP_GLOBAL_BASIC) begin:Predictor + end else if (P.BPRED_TYPE == `BP_GLOBAL_BASIC) begin:Predictor gsharebasic #(P, P.XLEN, P.BPRED_SIZE, 0) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW, .PCNextF, .PCM, .BPDirPredF, .BPDirPredWrongE, .BranchE, .BranchM, .PCSrcE); - end else if (P.BPRED_TYPE == BP_LOCAL_BASIC) begin:Predictor + end else if (P.BPRED_TYPE == `BP_LOCAL_BASIC) begin:Predictor localbpbasic #(P, P.XLEN, P.BPRED_NUM_LHR, P.BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW, .PCNextF, .PCM, .BPDirPredF, .BPDirPredWrongE, .BranchE, .BranchM, .PCSrcE); - end else if (P.BPRED_TYPE == BP_LOCAL_AHEAD) begin:Predictor + end else if (P.BPRED_TYPE == `BP_LOCAL_AHEAD) begin:Predictor localaheadbp #(P, P.XLEN, P.BPRED_NUM_LHR, P.BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW, .PCNextF, .PCM, .BPDirPredD(BPDirPredF), .BPDirPredWrongE, .BranchE, .BranchM, .PCSrcE); - end else if (P.BPRED_TYPE == BP_LOCAL_REPAIR) begin:Predictor + end else if (P.BPRED_TYPE == `BP_LOCAL_REPAIR) begin:Predictor localrepairbp #(P, P.XLEN, P.BPRED_NUM_LHR, P.BPRED_SIZE) DirPredictor(.clk, .reset, .StallF, .StallD, .StallE, .StallM, .StallW, .FlushD, .FlushE, .FlushM, .FlushW, .PCNextF, .PCE, .PCM, .BPDirPredD(BPDirPredF), .BPDirPredWrongE, diff --git a/testbench/testbench-xcelium.sv b/testbench/testbench-xcelium.sv index 368cc3f07..f50259ca8 100644 --- a/testbench/testbench-xcelium.sv +++ b/testbench/testbench-xcelium.sv @@ -328,7 +328,7 @@ module testbench; if (P.UNCORE_RAM_SUPPORTED) `define TB_UNCORE_RAM_SUPPORTED; if (P.BPRED_SUPPORTED) `define TB_BPRED_SUPPORTED; - if (P.BPRED_TYPE == BP_LOCAL_AHEAD | P.BPRED_TYPE == BP_LOCAL_REPAIR) `define TB_BHT; + if (P.BPRED_TYPE == `BP_LOCAL_AHEAD | P.BPRED_TYPE == `BP_LOCAL_REPAIR) `define TB_BHT; always @(posedge clk) begin if (ResetMem) // program memory is sometimes reset @@ -342,7 +342,7 @@ module testbench; if (P.BPRED_SUPPORTED) begin `ifdef TB_BPRED_SUPPORTED // local history only - if (P.BPRED_TYPE == BP_LOCAL_AHEAD | P.BPRED_TYPE == BP_LOCAL_REPAIR) begin + if (P.BPRED_TYPE == `BP_LOCAL_AHEAD | P.BPRED_TYPE == `BP_LOCAL_REPAIR) begin `ifdef TB_BHT for(adrindex = 0; adrindex < 2**P.BPRED_NUM_LHR; adrindex++) dut.core.ifu.bpred.bpred.Predictor.DirPredictor.BHT.mem[adrindex] = 0; diff --git a/testbench/testbench.sv b/testbench/testbench.sv index caa60e23c..8563945ac 100644 --- a/testbench/testbench.sv +++ b/testbench/testbench.sv @@ -27,6 +27,7 @@ `include "config.vh" `include "tests.vh" +`include "BranchPredictorType.vh" import cvw::*; @@ -332,7 +333,7 @@ module testbench; if(reset) begin // branch predictor must always be reset if (P.BPRED_SUPPORTED) begin // local history only - if (P.BPRED_TYPE == BP_LOCAL_AHEAD | P.BPRED_TYPE == BP_LOCAL_REPAIR) + if (P.BPRED_TYPE == `BP_LOCAL_AHEAD | P.BPRED_TYPE == `BP_LOCAL_REPAIR) for(adrindex = 0; adrindex < 2**P.BPRED_NUM_LHR; adrindex++) dut.core.ifu.bpred.bpred.Predictor.DirPredictor.BHT.mem[adrindex] = 0; for(adrindex = 0; adrindex < 2**P.BTB_SIZE; adrindex++)