diff --git a/cva6/tb/uvmt/cva6_tb_wrapper.sv b/cva6/tb/uvmt/cva6_tb_wrapper.sv index 37e2d083a..d62905050 100644 --- a/cva6/tb/uvmt/cva6_tb_wrapper.sv +++ b/cva6/tb/uvmt/cva6_tb_wrapper.sv @@ -34,9 +34,11 @@ import "DPI-C" function read_elf(input string filename); import "DPI-C" function byte get_section(output longint address, output longint len); import "DPI-C" context function void read_section(input longint address, inout byte buffer[]); -module cva6_tb_wrapper - import uvmt_cva6_pkg::*; -#( +module cva6_tb_wrapper import uvmt_cva6_pkg::*; #( + // RVFI + parameter type rvfi_instr_t = logic, + parameter int unsigned NrCommitPorts = 0, + // parameter int unsigned AXI_USER_WIDTH = 1, parameter int unsigned AXI_USER_EN = 0, parameter int unsigned AXI_ADDRESS_WIDTH = 64, @@ -47,7 +49,7 @@ module cva6_tb_wrapper input logic rst_ni, input logic [XLEN-1:0] boot_addr_i, output logic [31:0] tb_exit_o, - output ariane_pkg::rvfi_port_t rvfi_o, + output rvfi_instr_t [NrCommitPorts-1:0] rvfi_o, input cvxif_pkg::cvxif_resp_t cvxif_resp, output cvxif_pkg::cvxif_req_t cvxif_req, uvma_axi_intf axi_slave, @@ -60,10 +62,14 @@ module cva6_tb_wrapper static uvm_cmdline_processor uvcl = uvm_cmdline_processor::get_inst(); string binary = ""; - ariane_pkg::rvfi_port_t rvfi; + rvfi_instr_t [NrCommitPorts-1:0] rvfi; assign rvfi_o = rvfi; cva6 #( + // RVFI + .rvfi_instr_t ( rvfi_instr_t ), + .NrCommitPorts ( NrCommitPorts ), + // .ArianeCfg ( ariane_soc::ArianeSocCfg ) ) i_cva6 ( .clk_i ( clk_i ), @@ -86,10 +92,12 @@ module cva6_tb_wrapper //---------------------------------------------------------------------------- rvfi_tracer #( + .NrCommitPorts(NrCommitPorts), + .rvfi_instr_t(rvfi_instr_t), + // .HART_ID(8'h0), .DEBUG_START(0), - .DEBUG_STOP(0), - .NR_COMMIT_PORTS(ariane_pkg::NR_COMMIT_PORTS) + .DEBUG_STOP(0) ) rvfi_tracer_i ( .clk_i(clk_i), .rst_ni(rst_ni), diff --git a/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv b/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv index 1f026219b..cbbcf1e14 100644 --- a/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv +++ b/cva6/tb/uvmt/uvmt_cva6_dut_wrap.sv @@ -14,7 +14,12 @@ // // SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0 -module uvmt_cva6_dut_wrap # ( parameter int unsigned AXI_USER_WIDTH = 1, +module uvmt_cva6_dut_wrap # ( + // RVFI + parameter type rvfi_instr_t = logic, + parameter int unsigned NrCommitPorts = 0, + // + parameter int unsigned AXI_USER_WIDTH = 1, parameter int unsigned AXI_USER_EN = 0, parameter int unsigned AXI_ADDRESS_WIDTH = 64, parameter int unsigned AXI_DATA_WIDTH = 64, @@ -28,12 +33,16 @@ module uvmt_cva6_dut_wrap # ( parameter int unsigned AXI_USER_WIDTH = 1, uvmt_axi_switch_intf axi_switch_vif, uvme_cva6_core_cntrl_if core_cntrl_if, output logic[31:0] tb_exit_o, - output ariane_pkg::rvfi_port_t rvfi_o + output rvfi_instr_t [NrCommitPorts-1:0] rvfi_o ); cva6_tb_wrapper #( + // RVFI + .rvfi_instr_t ( rvfi_instr_t ), + .NrCommitPorts ( NrCommitPorts ), + // .AXI_USER_WIDTH (AXI_USER_WIDTH), .AXI_USER_EN (AXI_USER_EN), .AXI_ADDRESS_WIDTH (AXI_ADDRESS_WIDTH), diff --git a/cva6/tb/uvmt/uvmt_cva6_tb.sv b/cva6/tb/uvmt/uvmt_cva6_tb.sv index b68c34010..d9b29600c 100644 --- a/cva6/tb/uvmt/uvmt_cva6_tb.sv +++ b/cva6/tb/uvmt/uvmt_cva6_tb.sv @@ -30,6 +30,36 @@ module uvmt_cva6_tb; import uvmt_cva6_pkg::*; import uvme_cva6_pkg::*; + // cva6 Configuration + // RVFI + localparam int unsigned ILEN = 32; + localparam int unsigned NRET = 1; + typedef struct packed { + logic [NRET-1:0] valid; + logic [NRET*64-1:0] order; + logic [NRET*ILEN-1:0] insn; + logic [NRET-1:0] trap; + logic [NRET*riscv::XLEN-1:0] cause; + logic [NRET-1:0] halt; + logic [NRET-1:0] intr; + logic [NRET*2-1:0] mode; + logic [NRET*2-1:0] ixl; + logic [NRET*5-1:0] rs1_addr; + logic [NRET*5-1:0] rs2_addr; + logic [NRET*riscv::XLEN-1:0] rs1_rdata; + logic [NRET*riscv::XLEN-1:0] rs2_rdata; + logic [NRET*5-1:0] rd_addr; + logic [NRET*riscv::XLEN-1:0] rd_wdata; + logic [NRET*riscv::XLEN-1:0] pc_rdata; + logic [NRET*riscv::XLEN-1:0] pc_wdata; + logic [NRET*riscv::VLEN-1:0] mem_addr; + logic [NRET*riscv::PLEN-1:0] mem_paddr; + logic [NRET*(riscv::XLEN/8)-1:0] mem_rmask; + logic [NRET*(riscv::XLEN/8)-1:0] mem_wmask; + logic [NRET*riscv::XLEN-1:0] mem_rdata; + logic [NRET*riscv::XLEN-1:0] mem_wdata; } rvfi_instr_t; + localparam int unsigned NrCommitPorts = cva6_config_pkg::CVA6ConfigNrCommitPorts; + localparam AXI_USER_WIDTH = ariane_pkg::AXI_USER_WIDTH; localparam AXI_USER_EN = ariane_pkg::AXI_USER_EN; localparam AXI_ADDRESS_WIDTH = 64; @@ -53,8 +83,10 @@ module uvmt_cva6_tb; ); uvmt_axi_switch_intf axi_switch_vif(); uvme_cva6_core_cntrl_if core_cntrl_if(); - uvma_rvfi_instr_if#(uvme_cva6_pkg::ILEN,uvme_cva6_pkg::XLEN) - rvfi_instr_if [uvme_cva6_pkg::RVFI_NRET-1:0](); + uvma_rvfi_instr_if #( + uvme_cva6_pkg::ILEN, + uvme_cva6_pkg::XLEN + ) rvfi_instr_if [uvme_cva6_pkg::RVFI_NRET-1:0] (); uvma_rvfi_csr_if#(uvme_cva6_pkg::XLEN) rvfi_csr_if [uvme_cva6_pkg::RVFI_NRET-1:0](); @@ -71,7 +103,11 @@ module uvmt_cva6_tb; .rst_n(clknrst_if.reset_n) ); // DUT Wrapper Interfaces - uvmt_rvfi_if rvfi_if( + uvmt_rvfi_if #( + // RVFI + .rvfi_instr_t ( rvfi_instr_t ), + .NrCommitPorts ( NrCommitPorts ) + ) rvfi_if( .rvfi_o(), .tb_exit_o() ); // Status information generated by the Virtual Peripherals in the DUT WRAPPER memory. @@ -81,6 +117,10 @@ module uvmt_cva6_tb; */ uvmt_cva6_dut_wrap #( + // RVFI + .rvfi_instr_t ( rvfi_instr_t ), + .NrCommitPorts ( NrCommitPorts ), + // .AXI_USER_WIDTH (AXI_USER_WIDTH), .AXI_USER_EN (AXI_USER_EN), .AXI_ADDRESS_WIDTH (AXI_ADDRESS_WIDTH), diff --git a/cva6/tb/uvmt/uvmt_cva6_tb_ifs.sv b/cva6/tb/uvmt/uvmt_cva6_tb_ifs.sv index 879456b36..1c8fa1cb2 100644 --- a/cva6/tb/uvmt/uvmt_cva6_tb_ifs.sv +++ b/cva6/tb/uvmt/uvmt_cva6_tb_ifs.sv @@ -21,8 +21,12 @@ `define __UVMT_CVA6_TB_IFS_SV__ -interface uvmt_rvfi_if ( - output ariane_pkg::rvfi_port_t rvfi_o, +interface uvmt_rvfi_if #( + // RVFI + parameter type rvfi_instr_t = logic, + parameter int unsigned NrCommitPorts = 0 +) ( + output rvfi_instr_t [NrCommitPorts-1:0] rvfi_o, output logic[31:0] tb_exit_o );