forked from github/verilator
95 lines
2.5 KiB
ReStructuredText
95 lines
2.5 KiB
ReStructuredText
.. Copyright 2003-2023 by Wilson Snyder.
|
|
.. SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
|
|
|
.. _Example C++ Execution:
|
|
|
|
Example C++ Execution
|
|
=====================
|
|
|
|
We'll compile this example into C++. For an extended and commented version
|
|
of what this C++ code is doing, see
|
|
:file:`examples/make_tracing_c/sim_main.cpp` in the distribution.
|
|
|
|
.. include:: example_common_install.rst
|
|
|
|
Now, let's create an example Verilog and C++ wrapper file:
|
|
|
|
.. code-block:: bash
|
|
|
|
mkdir test_our
|
|
cd test_our
|
|
|
|
cat >our.v <<'EOF'
|
|
module our;
|
|
initial begin $display("Hello World"); $finish; end
|
|
endmodule
|
|
EOF
|
|
|
|
cat >sim_main.cpp <<'EOF'
|
|
#include "Vour.h"
|
|
#include "verilated.h"
|
|
int main(int argc, char** argv) {
|
|
VerilatedContext* contextp = new VerilatedContext;
|
|
contextp->commandArgs(argc, argv);
|
|
Vour* top = new Vour{contextp};
|
|
while (!contextp->gotFinish()) { top->eval(); }
|
|
delete top;
|
|
delete contextp;
|
|
return 0;
|
|
}
|
|
EOF
|
|
|
|
Now we run Verilator on our little example;
|
|
|
|
.. code-block:: bash
|
|
|
|
verilator --cc --exe --build -j 0 -Wall sim_main.cpp our.v
|
|
|
|
Breaking this command down:
|
|
|
|
#. :vlopt:`--cc` to get C++ output (versus e.g., SystemC, or only linting).
|
|
|
|
#. :vlopt:`--exe`, along with our :command:`sim_main.cpp` wrapper file, so
|
|
the build will create an executable instead of only a library.
|
|
|
|
#. :vlopt:`--build` so Verilator will call make itself. This is we don't
|
|
need to manually call make as a separate step. You can also write your
|
|
own compile rules, and run make yourself as we show in :ref:`Example
|
|
SystemC Execution`.)
|
|
|
|
#. :vlopt:`-j 0 <-j>` to Verilate using use as many CPU threads as the
|
|
machine has.
|
|
|
|
#. :vlopt:`-Wall` so Verilator has stronger lint warnings
|
|
enabled.
|
|
|
|
#. And finally, :command:`our.v` which is our SystemVerilog design file.
|
|
|
|
Once Verilator completes we can see the generated C++ code under the
|
|
:file:`obj_dir` directory.
|
|
|
|
.. code-block:: bash
|
|
|
|
ls -l obj_dir
|
|
|
|
(See :ref:`Files Read/Written` for descriptions of some of the files that
|
|
were created.)
|
|
|
|
And now we run it:
|
|
|
|
.. code-block:: bash
|
|
|
|
obj_dir/Vour
|
|
|
|
And we get as output:
|
|
|
|
.. code-block:: bash
|
|
|
|
Hello World
|
|
- our.v:2: Verilog $finish
|
|
|
|
You're better off using a Makefile to run the steps for you, so when your
|
|
source changes, it will automatically run all of the appropriate steps. To
|
|
aid this, Verilator can create a makefile dependency file. For examples
|
|
that do this, see the :file:`examples` directory in the distribution.
|