Verilator, Release 4.202
4.2.3 Overlapping Verilation and Compilation
Verilator needs to run 2 + N times in hierarchical Verilation, where N is the number of hierarchy blocks. One of the
two is for the top module which refers wrappers of all other hierarchy blocks. The second one of the two is the initial
run that searches modules marked with /
*
verilator&32;hier_block
*
/ metacomment and creates a plan and
write in prefix_hier.mk. This initial run internally invokes other N + 1 runs, so you don’t have to care about
these N + 1 times of run. The additional N is the Verilator run for each hierarchical block.
If :-j {jobs} option is specified, Verilation for hierarchy blocks runs in parallel.
If --build option is specified, C++ compilation also runs as soon as a hierarchy block is Verilated. C++ compilation
and Verilation for other hierarchy blocks run simultaneously.
4.3 Cross Compilation
Verilator supports cross-compiling Verilated code. This is generally used to run Verilator on a Linux system and
produce C++ code that is then compiled on Windows.
Cross compilation involves up to three different OSes. The build system is where you configured and compiled
Verilator, the host system where you run Verilator, and the target system where you compile the Verilated code and
run the simulation.
Currently, Verilator requires the build and host system type to be the same, though the target system type may be
different. To support this, ./configure and make Verilator on the build system. Then, run Verilator on the host
system. Finally, the output of Verilator may be compiled on the different target system.
To support this, none of the files that Verilator produces will reference any configure generated build-system specific
files, such as config.h (which is renamed in Verilator to config_build.h to reduce confusion.) The disad-
vantage of this approach is that include/verilatedos.h must self-detect the requirements of the target system,
rather than using configure.
The target system may also require edits to the Makefiles, the simple Makefiles produced by Verilator presume the
target system is the same type as the build system.
4.4 Multithreading
Verilator supports multithreaded simulation models.
With --no-threads, the default, the model is not thread safe, and any use of more than one thread calling into
one or even different Verilated models may result in unpredictable behavior. This gives the highest single thread
performance.
With --threads 1, the generated model is single threaded, however the support libraries are multithread safe. This
allows different instantiations of model(s) to potentially each be run under a different thread. All threading is the
responsibility of the user’s C++ testbench.
With --threads {N}, where N is at least 2, the generated model will be designed to run in parallel on N threads.
The thread calling eval() provides one of those threads, and the generated model will create and manage the other N-1
threads. It’s the client’s responsibility not to oversubscribe the available CPU cores. Under CPU oversubscription, the
Verilated model should not livelock nor deadlock, however, you can expect performance to be far worse than it would
be with proper ratio of threads and CPU cores.
The remainder of this section describe behavior with --threads 1 or --threads {N} (not --no-threads).
VL_THREADED is defined in the C++ code when compiling a threaded Verilated module, causing the Verilated support
classes become threadsafe.
4.3. Cross Compilation 15