| # Kelvin UVM Testbench | 
 |  | 
 | This document describes the structure and usage of the UVM testbench for verifying the `RvvCoreMiniVerificationAxi` DUT. | 
 |  | 
 | ## Overview | 
 |  | 
 | This testbench provides a basic UVM environment to: | 
 | * Instantiate the `RvvCoreMiniVerificationAxi` DUT. | 
 | * Connect AXI Master, AXI Slave, and IRQ interfaces to the DUT. | 
 | * Provide basic stimulus generation via UVM sequences. | 
 | * Include a simple reactive AXI Slave model. | 
 | * Load a binary file into the DUT's memory using backdoor access. | 
 | * Kick off the DUT execution using initial AXI writes. | 
 | * Check for basic test completion via DUT status signals (`halted`, `fault`) or a timeout. | 
 |  | 
 | ## Prerequisites | 
 |  | 
 | * **Synopsys VCS:** This testbench is configured to run with Synopsys VCS. | 
 | * **UVM:** VCS needs to be configured with UVM 1.2 support enabled. | 
 | * **Kelvin Hardware Repository:** Access to the repository containing the `RvvCoreMiniVerificationAxi` source code is required to generate the DUT Verilog and the test binary. | 
 | * **Bazel:** The build system used to generate the Verilog from the Chisel source in the Kelvin HW repository. | 
 | * **RISC-V Toolchain:** A RISC-V toolchain (specifically `llvm-objcopy-17` or similar) compatible with the Kelvin project is needed to generate the `.bin` file. | 
 |  | 
 | ## Generating the DUT (RvvCoreMiniVerificationAxi.sv) | 
 |  | 
 | The Verilog file for the DUT needs to be generated from the Chisel source code located in the Kelvin hardware repository. | 
 |  | 
 | 1.  Navigate to the root directory of your Kelvin HW repository clone: | 
 |     ```bash | 
 |     cd /path/to/your/kelvin/hw/repo | 
 |     ``` | 
 | 2.  Run the Bazel build command to emit the Verilog: | 
 |     ```bash | 
 |     bazel build //hdl/chisel/src/kelvin:rvv_core_mini_verification_axi_cc_library_emit_verilog | 
 |     ``` | 
 | 3.  The Verilog file will be generated at: | 
 |     `bazel-bin/hdl/chisel/src/kelvin/RvvCoreMiniVerificationAxi.sv` | 
 | 4.  Copy this generated `RvvCoreMiniVerificationAxi.sv` file to the `rtl/` directory within this testbench structure. | 
 |  | 
 | ## Generating the Test Binary (program.bin) | 
 |  | 
 | The test program run by the DUT needs to be compiled and converted to a flat binary format. | 
 |  | 
 | 1.  Navigate to the Kelvin HW repository root: | 
 |     ```bash | 
 |     cd /path/to/your/kelvin/hw/repo | 
 |     ``` | 
 | 2.  Navigate to the example test directory: | 
 |     ```bash | 
 |     cd tests/cocotb/tutorial | 
 |     ``` | 
 |     *(Note: Adapt this path if using a different test program)* | 
 | 3.  Compile the test program (this typically generates `program.elf`): | 
 |     ```bash | 
 |     make | 
 |     ``` | 
 | 4.  Convert the ELF file to a binary file using `llvm-objcopy-17`, extracting only the `.text` section. **Note:** Ensure the path to `llvm-objcopy-17` is correct for your environment. | 
 |     ```bash | 
 |     llvm-objcopy-17 -O binary --only-section=.text -S program.elf program.bin | 
 |     ``` | 
 | 5.  The `program.bin` file is generated in the current directory (`tests/cocotb/tutorial`). | 
 | 6.  Copy this `program.bin` file to the `bin/` directory of this UVM testbench structure (or update the `TEST_BINARY` path in the `Makefile` or run command). | 
 |  | 
 | ## Directory Structure | 
 |  | 
 | The testbench follows a standard UVM directory structure: | 
 |  | 
 | ``` | 
 | . | 
 | ├── common/                # Common components | 
 | │   ├── kelvin_axi_master/ # Files related to the TB acting as AXI Master | 
 | │   │   ├── kelvin_axi_master_if.sv | 
 | │   │   └── kelvin_axi_master_agent_pkg.sv | 
 | │   ├── kelvin_axi_slave/  # Files related to the TB acting as AXI Slave | 
 | │   │   ├── kelvin_axi_slave_if.sv | 
 | │   │   └── kelvin_axi_slave_agent_pkg.sv | 
 | │   ├── kelvin_irq/        # Files related to the IRQ/Control interface | 
 | │   │   ├── kelvin_irq_if.sv | 
 | │   │   └── kelvin_irq_agent_pkg.sv | 
 | │   └── transaction_item/  # Transaction item definitions | 
 | │       └── transaction_item_pkg.sv | 
 | ├── env/                   # UVM Environment definition | 
 | │   └── kelvin_env_pkg.sv | 
 | ├── rtl/                   # DUT RTL source file(s) | 
 | │   └── RvvCoreMiniVerificationAxi.sv     # (Needs to be generated and copied here) | 
 | ├── tb/                    # Top-level testbench module | 
 | │   └── kelvin_tb_top.sv | 
 | ├── tests/                 # UVM Tests and Sequences | 
 | │   └── kelvin_test_pkg.sv | 
 | ├── Makefile               # Makefile for compilation and simulation | 
 | ├── kelvin_dv.f            # File list for compilation | 
 | └── bin/                   # Directory for test binaries | 
 |     └── program.bin        # (Needs to be generated and copied here) | 
 | ``` | 
 |  | 
 | ## Running the Testbench using the Makefile | 
 |  | 
 | The provided `Makefile` simplifies the compilation and simulation process. | 
 |  | 
 | **1. Compilation:** | 
 |  | 
 | * **Command:** `make compile` | 
 | * **Action:** Creates necessary directories (`sim_work`, `logs`, `waves`), and compiles the DUT and testbench using VCS based on `kelvin_dv.f`. Creates the `sim_work/simv` executable. | 
 | * **Expected Output:** | 
 |     ``` | 
 |     --- Compiling with VCS --- | 
 |     Chronologic VCS simulator copyright 1991-202X | 
 |     Contains Synopsys proprietary information. | 
 |     Compiler version ... | 
 |     ... (VCS compilation messages) ... | 
 |     Top Level Modules: | 
 |             kelvin_tb_top | 
 |     TimeScale is 1ns / 1ps | 
 |     --- Compilation Finished --- | 
 |     ``` | 
 |     Check `sim_work/logs/compile.log` for detailed messages and errors. | 
 |  | 
 | **2. Running the Simulation:** | 
 |  | 
 | * **Command (Default Test):** `make run` | 
 |     * Runs the default test (`kelvin_base_test`) defined in the Makefile. | 
 |     * Uses the default binary (`bin/program.bin`). | 
 |     * Uses `UVM_MEDIUM` verbosity. | 
 | * **Command (Specific Test & Binary):** | 
 |     ```bash | 
 |     make run UVM_TESTNAME=<your_specific_test> TEST_BINARY=/path/to/another.bin UVM_VERBOSITY=UVM_HIGH | 
 |     ``` | 
 |     * Overrides the default test name, binary path, and verbosity level. | 
 | * **Action:** Executes the compiled `simv` executable with the specified UVM runtime options. | 
 | * **Expected Output:** | 
 |     ``` | 
 |     --- Running Simulation --- | 
 |     Test:      kelvin_base_test | 
 |     Binary:    bin/program.bin | 
 |     Verbosity: UVM_MEDIUM | 
 |     Timeout:   20000 ns | 
 |     Plusargs:  +UVM_TESTNAME=kelvin_base_test +TEST_BINARY=bin/program.bin +UVM_VERBOSITY=UVM_MEDIUM +TEST_TIMEOUT=20000 | 
 |     Log File:  sim_work/logs/kelvin_base_test.log | 
 |     Wave File: sim_work/waves/kelvin_base_test.fsdb | 
 |     Chronologic VCS simulator copyright 1991-202X | 
 |     Contains Synopsys proprietary information. | 
 |     Simulator version ... ; Runtime version ... | 
 |     UVM_INFO @ 0: reporter [RNTST] Running test kelvin_base_test... | 
 |     ... (UVM simulation messages based on verbosity) ... | 
 |     UVM_INFO tests/kelvin_test_pkg.sv(LINE#) @ TIME: uvm_test_top.env.m_master_agent.sequencer@@req_pc [kelvin_kickoff_write_seq] Kickoff Write 1 (PC=0x00000034) sent to addr 0x00030004 | 
 |     ... | 
 |     UVM_INFO tests/kelvin_test_pkg.sv(LINE#) @ TIME: uvm_test_top [kelvin_base_test] DUT halted signal observed | 
 |     UVM_INFO tests/kelvin_test_pkg.sv(LINE#) @ TIME: uvm_test_top [kelvin_base_test] Run phase finishing | 
 |     --- UVM Report Summary --- | 
 |     ... | 
 |     UVM_INFO tests/kelvin_test_pkg.sv(LINE#) @ TIME: uvm_test_top [kelvin_base_test] ** UVM TEST PASSED ** | 
 |     --- Simulation Finished --- | 
 |     ``` | 
 |     * Look for the `** UVM TEST PASSED **` or `** UVM TEST FAILED **` message at the end of the simulation log (`sim_work/logs/<testname>.log`). | 
 |     * If enabled, a waveform file (`sim_work/waves/<testname>.fsdb`) will be generated. | 
 |  | 
 | **3. Cleaning:** | 
 |  | 
 | * **Command:** `make clean` | 
 | * **Action:** Removes the `sim_work` directory and other simulation-generated files (`simv`, `csrc`, logs, waveforms, etc.). `kelvin_dv.f` is *not* removed if it's checked in. | 
 | * **Expected Output:** | 
 |     ``` | 
 |     --- Cleaning Simulation Files --- | 
 |     rm -rf sim_work simv* csrc* *.log* *.key *.vpd *.fsdb ucli.key DVEfiles/ verdiLog/ novas.* | 
 |     ``` | 
 |  | 
 | This README should help you get started with compiling and running the basic test for the `RvvCoreMiniVerificationAxi` DUT. Remember to complete the remaining TODOs in the UVM code itself. | 
 |  |