blob: 77e1d6cf8bba0f9088f9612393cfcb483e47a31f [file] [log] [blame] [view]
# DV build and run flow
The Makefile system implemented here is a standardized solution for building and
running DV sims for all ip/block/top level testbenches. This is only a stop
gap solution until a proper build and run tool is developed and implemented. The
way the Makefiles are structured will hopefully make the eventual transition
easier.
## Makefile Organization
```
- hw/ip/<ip>/dv/Makefile OR
hw/top_earlgrey/dv/Makefile
- hw/dv/tools/Makefile
- ral_gen.mk
- fusesoc.mk
- modes.mk
- rules.mk
- $VCS_PRIV_DIR/vcs.mk
```
### Test Makefile
The test Makefile that serves as the entry point into the DV build and run
flow is placed in individual 'dv' directories of each testbench. For example:
```hw/ip/uart/dv/Makefile```
This includes the top level Makefile, some mandatory variables that are to be
set and exported and the actual tests.
### Top level Makefile
This includes the top level Makefile which contains generic set of variable
names (most of which can be overridden) to indicate where, what and how to build
and run tests, some option groups and generic set of rules. This is located at
hw/dv/tools/Makefile
### Generic Tool-independent Make variables
The following is a list of Make variables that are used for specifying options
to run simulations in a tool-independent way. Some variables are overridable in
the Test Makefile (or command line) and some are appended to group / add options
together. Please see following table for more details:
Make variable | Description | Overridable (O) or Appendable (A) |
--------------|-------------|-----------------------------------|
DV_DIR | This is the top level DV directory for the IP containing the Test Makefile. | |
DUT_TOP | This is the top level dut module under test. This is used in common `vcs.tcl` file placed in the $VCS_PRIV_DIR directory. | |
TB_TOP | This is the top level tb module under test. This is used in common `vcs.tcl` file placed in the $VCS_PRIV_DIR directory. | |
FUSESOC_CORE | This is the testbench fusesoc .core name that contains the simulation target. This .core file is typically placed in the same directory as the test Makefile. | |
COMPILE_KEY | Users need to define COMPILE_KEY sets for building Test Makefile, CL with a unique sets of compile time options. This is to be done in the Test Makefile in this way: <br>ifeq (${COMPILE_KEY},foo) <br> BUILD_OPTS += +define+FOO <br>endif<br> There is a 'default' compile key already added which implies no additional compile time options are required. Within each test specification, the COMPILE_KEY can be overridden to use the specific compile key. <br>ifeq (${TEST_NAME},foo_test)<br> COMPILE_KEY = foo )<br> # other test opts <br>endif | O (Within tests, & command line) |
UVM_TEST | SV UVM test class to create in the test. This is set to the 'base_test' by default and is overridden in the test specifications if needed. | O (Test Makefile) |
UVM_TEST_SEQ | SV UVM test sequence to create in the test. This is set to the 'base_test' by default and is overridden in the test specifications if needed. | O (Test Makefile) |
TEST_NAME | Name of the test to run. These are specified in the test Makefile. By default, it is set to run the sanity test (simply calling 'make' will run this test). | O (command line only) |
SIMULATOR | What simulator to use. Currently only 'vcs' is supported and is set by default. | O |
BUILD_OPTS | Options to pass for build. | A (Test Makefile :: COMPILE_KEY specifications only) |
CL_BUILD_OPTS | Pass additional build options on the command line. | A (command line only) |
RUN_OPTS | Options to pass for run. | A (Test Makefile :: test specifications only) |
CL_RUN_OPTS | Pass additional run options on the command line. | A (command line only |)
WAVES | Enable wave dumps (fsdb). Set to 0 by default; override with WAVES=1. | O |
SIMPROFILE | Turn on sim profiling (time option by default). Set to 0 by default; override with SIMPROFILE=1. | O |
COV | Turn on coverage collection. Set to 0 by default; override with COV=1. | O |
UVM_VERBOSITY | Verbosity level for UVM. Set to UVM_LOW by default; override with UVM_VERBOSITY=UVM_NONE / UVM_LOW / UVM_HIGH / UVM_DEBUG. | O |
BUILD_LOC | Build directory name in the scratch area. This defaults to the COMPILE_KEY used by the corresponding test. You can override it to use a different directory name. This is helpful when there is a test / regression already running and you made some fixes and want to rerun some failing test from another terminal without affecting the existing running sims. | O |
RUN_LOC | Run directory name in the scratch area. This defaults to a 'timestamp' value. You can override this to a specific name. Everytime a test is run, it creates a new directory with the current timestamp for the name. By overriding this with a specific name and rerunning the same test with the same directory name, you won't have to reopen waves - you can just reload. This is useful during test debug. | O |
SCRATCH_ROOT | This is the path to the root scratch area for bulding and running tests. If SCRATCH_ROOT is not already set, it will create a `scratch` directory in `pwd` which typically is the same as `DV_DIR`. | O (command line only) |
RUN_DIR_LIMIT | When you run tests, The flow creates a new `RUN_LOC` directory with the current timestamp (unless it is overridden). In course of debug, you may run the same test multiple times, which will eventually result in a large number of old timestamp directories in the scratch space. Without periodic cleanup, you may run out of scratch space. By default, this variable is set to 5, which means before running the test, it will prune the test area to contain no more than RUN_DIR_LIMIT number of most recent directories (including the newly created one). On the flipside, if you want to run the same test with a large number of iterations, you will need to override this variable to be set to that many iterations to prevent the flow from deleting actively running simulations. | O (command line only) |
SEED | This is a run time parameter passed to the sim executable. It uses `od` command to generate a 32-bit random number to run the sim with a unique seed. You can override this variable on the command line to run the test with a specific seed for debug. | O (command line only) |
This is not an exhaustive list of Make variables. Please see `./Makefile` and
`./*.mk` for more such variables in use.
### ral_gen.mk
#### RAL generation tool specific mk file
This lists tools and options to generate the ral model by simply running the
command `make ral` from the same directory as the Test Makefile. For generating
the UVM REG based RAL model, we use the same [in-house tool](../../../doc/rm/register_tool.md) for autogenerating
RTL with mako template.
### fusesoc.mk
#### RTL/TB filelist generation tool specific mk file
This lists tools and options to generate the flattened filelist to supply to the
simulator during the build step.
### modes.mk
#### Modes or option groups that can be turned on easily
This lists common modes (which are groups of compile time and / or run time options)
passed to the simulator for turning on a specific function. Modes listed in this
file are meant to be common across all environments and simulator tools. Modes added
in this file are `WAVES`, `COV`, `SIMPROFILE` and `UVM_TRACE`. These are truly
global and can be turned on easily on the command line by setting them to 1: `COV=1`
switch on the command line will turn on coverage. These modes may require options
that are specific to the simulator tool, so the make variable `SIMULATOR` can be used
to set tool specific options.
### rules.mk
#### List of Make targets and recipes
This is the only file in the make flow that contains targets and recipes that
are completely agnostic to the tools used. It sequences the build and run set
of targets.
### vcs.mk
#### VCS tool specific options
The top level Makefile uses `SIMULATOR` variable (which is set to vcs by
default) to enable tool specific options. If support for new tools need to be
added, then those tool specific mk files need to be supplied. It sets the
following mandatory variables - `SIMCC` & `SIMX`. It also exports additional
tool specific variables to the sub shell when the recipes are executed. This
file has been placed in the $VCS_PRIV_DIR directory, which is outside of this
OpenTitan repo. The reason for that is it contains sensitive tool specific
options that cannot be exposed. The private repo specific to VCS tools (TBD)
needs to be cloned and the path to the directory containing this file needs
to be set with `VCS_PRIV_DIR` environment variable prior to invoking the
simulation.
### Simulation targets
### Building and running tests
All of the below command examples are to be run from the 'dv' directory
containing the Test Makefile.
##### Run the following command to build and run tests:
```make TEST_NAME=[test-name] [overrides]```
##### To only buld the simv:
```make build TEST_NAME=[test-name] [overrides]```
##### To run the sim after build is complete:
```make run TEST_NAME=[test-name] [overrides]```
##### To build and run the sanity test:
```make```
This will work provided user has specified a set a 'default' value to the
`TEST_NAME` Make variable.
##### Below are some examples
###### Build and run a test:
This builds the 'default' compile key and runs the 'uart_sanity' test
```make TEST_NAME=uart_sanity```
###### Run with specific seed:
```make TEST_NAME=<test-name> SEED=123423334```
###### Dump waves:
```make TEST_NAME=<test-name> SEED=123423334 WAVES=1```
###### Run with coverage option enabled:
```make TEST_NAME=<test-name> COV=1```
The options.mk file lists several tool options passed to the build and run steps
for enabling coverage collection. One of the options is adding a hier file (with
a `-cm_hier` switch). By default, it looks for a file called `cover.cfg` in the
'dv' directory set using the `CM_HIER` Make variable - if it exists, it adds the
switch automatically when coverage is enabled. If another hier file is desired
(or with another name), it can be placed anywhere as the user desires and user can
add the following line to the Test Makefile:
```CM_HIER := <path-to-hier-file```
###### Enable sim profiling:
```make TEST_NAME=<test-name> SIMPROFILE=1```
###### Override UVM verbosity:
```make TEST_NAME=<test-name> WAVES=1 UVM_VERBOSITY=UVM_DEBUG```
###### Build only:
This will build the 'default' compile key
```make build```
###### Build 'foo' compile key instead:
```make build COMPILE_KEY=foo```
###### Build with 'FOO' preprocessor flag:
```make build CL_BUILD_OPTS+=+define+FOO```
###### Run with 'FOO' runtime plusarg:
```make TEST_NAME=<test-name> CL_RUN_OPTS+=+FOO```
###### Run only:
This assumes the simv executable for the specified compile key is available in
the default directory and will use it to run the test
```make run TEST_NAME=<test-name> SEED=123423334 WAVES=1```