Copyright (c) 2023-2025 Antmicro
Example integration between Renode and a Verilog model using DPI (SystemVerilog Direct Programming Interface) calls.
All samples are intended to work in both Verilator and Questa simulators. This repository contains a CI configured to build and run samples in Verilator. Looking at the CI configuration is a good way to reproduce an example, but you can follow the instructions below, especially if you use Questa.
Renode communicates with the simulator over TCP using a dedicated protocol. The library which implements this protocol can be found in Renode sources. It's mainly written in C++, but there is an additional wrapper written in SystemVerilog, which uses DPI calls to interact with the API written in C++.
The HDL top simulation file contains Renode related snippets:
- code initializing a connection (with ports and IP address passed from parameters of a module)
- code creating modules and interfaces of busses
- code resetting a bus
- code used to receive and handle messages
Note
The code intentionally blocks the elapse of the simulation time while waiting for a message.
The rest of this instruction assumes you have Renode in the renode directory inside this repository.
You just need to download and extract it, and install dependencies for the Robot test framework.
Follow the steps below.
Run the following commands:
wget --progress=dot:giga https://builds.renode.io/renode-latest.linux-portable.tar.gz
mkdir renode
tar -xf renode-latest.linux-portable.tar.gz --strip-components 1 -C renode
python3 -m pip install -r renode/tests/requirements.txt- Download the Renode nightly package
- Extract it to the
renodedirectory - Run
python -m pip install -r renode/tests/requirements.txt
Run one of the commands below. It will start Renode and show two windows:
- Monitor which can be used to manage a simulation
- UART analyzer with terminal for interaction with Linux on Zynq-7000
This sample uses a prebuilt executable of a verilated FastVDMA controller. You can build the executable by yourself from the sample directory.
renode/renode -e start samples/axi_fastvdma_prebuilt/platform.rescrenode\bin\Renode.exe -e start samples\axi_fastvdma_prebuilt\platform.rescFor simplicity, build Verilator in the verilator directory inside this repository to use unmodified commands from this README.
Instead of building Verilator from source you can download the artifacts with Verilator, which is built on the CI.
You can find it in a specific run listed on the Actions page.
Use the following command to build Verilator:
sudo apt-get update && sudo apt-get install git help2man perl python3 make autoconf g++ flex bison ccache libgoogle-perftools-dev numactl perl-doc libfl2 libfl-dev zlib1g zlib1g-dev
git clone https://github.com/verilator/verilator.git
cd verilator
git checkout v5.018
autoconf
./configure
make -j `nproc`You can find instructions on preparing Renode in the previous section.
Run in samples/axi_ram
mkdir build
cd build
cmake .. -DUSER_RENODE_DIR=../../../renode -DUSER_VERILATOR_DIR=../../../verilator
makeNote
Instead of using-Darguments you can setRENODE_ROOTorVERILATOR_ROOTenvironmental variables.
You may use a path to installed packages in both approaches i.e.export RENODE_ROOT=/opt/renodeor-DUSER_RENODE_DIR=/opt/renode
To build a sample on Windows you need the dependencies listed below:
mingw32-make.exe- CMake
A lot of MinGW toolchains contain required tools. The one of approaches is to download the WinLibs archive, extract it and add to the PATH enviromental variable.
Run in CMD in samples/axi_ram:
mkdir build
cd build
cmake.exe .. -G "MinGW Makefiles" -DUSER_RENODE_DIR="..\..\..\renode" -DUSER_VERILATOR_DIR="..\..\..\verilator"
mingw32-make.exeThere are tests for Verilator, Questa and VCS. If the cosimulation block executable is not found for some of them, the corresponding tests will be skipped.
To run tests, do the following from the repository root:
renode/renode-test samples/axi_ram/tests.robotrenode\bin\renode-test.bat samples\axi_ram\tests.robot --variable=VERILATOR_SIMULATION:samples\axi_ram\build\verilated.exeInstead of running an automatic test using the Robot Framework, you can manually run Renode and an external simulator.
To run Renode with the RESC script, which creates a platform, just execute one of the following commands in the repository root:
renode/renode samples/axi_ram/platform.rescon Linuxrenode\bin\Renode.exe samples\axi_ram\platform.rescon Windows
Renode communicates with other simulators over sockets and you will need to provide communication parameters.
Run the mem ConnectionParameters command in the Monitor.
The output of the command consists of:
- the receiver port (later referenced to as
<ReceiverPort>), - the sender port (later referenced to as
<SenderPort>), - the IP address (later referenced to as
<Address>).
You will need to substitute placeholders in the following commands which use these parameters.
You can use one of the following command to start the simulator and pass connection parameters:
samples/axi_ram/build/verilated +RENODE_RECEIVER_PORT=<ReceiverPort> +RENODE_SENDER_PORT=<SenderPort> +RENODE_ADDRESS=<Address>for Verilator on Linuxsamples\axi_ram\build\verilated.exe +RENODE_RECEIVER_PORT=<ReceiverPort> +RENODE_SENDER_PORT=<SenderPort> +RENODE_ADDRESS=<Address>for Verilator on Windowsvsim design_optimized -work samples/axi_ram/build/work_questa -do "run -all" +RENODE_RECEIVER_PORT=<ReceiverPort> +RENODE_SENDER_PORT=<SenderPort> +RENODE_ADDRESS=\"<Address>\"for Questa on Linuxvsim design_optimized -work samples\axi_ram\build\work_questa -do "run -all" +RENODE_RECEIVER_PORT=<ReceiverPort> +RENODE_SENDER_PORT=<SenderPort> +RENODE_ADDRESS=\`"<Address>\`" -ldflags -lws2_32in Powershell for Questa on Windows
After starting the simulator, establish a connection by executing the mem Connect command in the Renode Monitor.
No output indicates that Renode and the simulator are successfully connected.
Note
Questa may not be responsive during simulation.
Instead of passing the-do "run -all"argument to Questa you may execute therun -allcommand in the transcript window.
You can simply try the prepared setup by running the following commands in the Renode Monitor:
mem WriteDoubleWord 0x10 0x12345678
mem ReadDoubleWord 0x10
You can close the simulation by calling the quit command in the Renode Monitor.
This will also stop the HDL simulation.
| Sample name | Function Description |
|---|---|
| AXI RAM | AXI4 Subordinate |
| DMATop (the FastVDMA controller) | AXI4-Lite Subordinate, AXI4 Manager, GPIO |
| AHB Memory | AHB Subordinate |
| Simple AHB DMA | AHB Subordinate, AHB Manager, GPIO |
| Simple AHB Manager | AHB Manager |
| APB3 Completer Memory | APB3 Completer |
| APB3 Requester Synthesizable | APB3 Requester |
| APB3 Standalone Simulation | APB3 Requester, APB3 Completer, without DPI usage |
| AXI interconnect | Two AXI memories connected to Renode through an AXI interconnect |
| No interconnect | Two AXI managers and two AHB subordinates connected directly to Renode |