|  | --- | 
|  | title: "Fpvgen: Initial FPV testbench generation tool" | 
|  | --- | 
|  |  | 
|  | # Overview | 
|  |  | 
|  | `fpvgen` is a Python tool that can be used to generate the initial boilerplate code for an FPV testbench. | 
|  | It takes as input a SystemVerilog module file representing the top-level of an IP to be tested with FPV, and generates the following folders and files in the output directory (which defaults to `../fpv` with respect to the module file provided): | 
|  | ```console | 
|  | . | 
|  | ├── fpv // default output folder | 
|  | │   ├── <ip-name>_fpv.core | 
|  | │   ├── tb | 
|  | │   │   ├── <ip-name>_bind_fpv.sv | 
|  | │   │   └── <ip-name>_fpv.sv | 
|  | │   └── vip | 
|  | │       └── <ip-name>_assert_fpv.sv | 
|  | └── rtl // folder containing the SV module file | 
|  | ├── <ip-name>.sv | 
|  | ... | 
|  | ``` | 
|  | The `<ip-name>_fpv.sv` is the FPV testbench that can be used to instantiate different parameterizations of the DUT to be tested. | 
|  | `<ip-name>_bind_fpv.sv` contains the bind statement which binds the verification IP `<ip-name>_assert_fpv.sv` to all DUT instances. | 
|  | If the IP is flagged as being comportable using the `-c` switch, the CSR FPV assertions are bound to the module as well. | 
|  |  | 
|  | # Examples | 
|  | Generating a non-comportable IP can be done as follows (using the LFSR as an example): | 
|  | ```console | 
|  | util/fpvgen.py hw/ip/prim/rtl/prim_lfsr.sv | 
|  | ``` | 
|  |  | 
|  | If the IP is comportable, only the `-c` switch has to be added. | 
|  | E.g., using the `pinmux` comportable IP as an example: | 
|  | ```console | 
|  | util/fpvgen.py -c hw/ip/pinmux/rtl/pinmux.sv | 
|  | ``` | 
|  |  | 
|  | If needed, the default output directory can be overridden using the `-o` switch. | 
|  |  | 
|  | # Help Output | 
|  | This is the help output from the tool (switch `-h`). | 
|  | ```console | 
|  | usage: fpvgen [-h] [-o OUTDIR] [-c] file | 
|  |  | 
|  | Boilerplate code generator for FPV testbenches. Can be used for | 
|  | comportable or non-comportable IPs. | 
|  |  | 
|  | The generator creates the FuseSoC core file and two additional | 
|  | subfolders 'tb' and 'vip' in the output directory. It will place stubs | 
|  | for the testbench and bind files into the 'tb' subfolder, and a stub for | 
|  | the FPV assertions into the 'vip' (verification IP) subfolder. | 
|  |  | 
|  | The generator needs the path to the top-level module of the IP to be | 
|  | tested. E.g., suppose we would like to generate an FPV testbench for a | 
|  | FIFO primitive located at 'hw/ip/prim/rtl/prim_fifo_sync.sv' we can | 
|  | invoke the generator as follows: | 
|  |  | 
|  | util/fpvgen.py hw/ip/prim/rtl/prim_fifo_sync.sv | 
|  |  | 
|  | By default, the output directory is assumed to be '../fpv' with respect | 
|  | to the toplevel module, but this can be overriden using the -eo switch. | 
|  |  | 
|  | Further if the IP is comportable, this can be indicated using the -c | 
|  | switch, which causes the generator to add a bind statement for the CSR | 
|  | FPV assertions in the testbench. | 
|  |  | 
|  | positional arguments: | 
|  | file                  Relative path to the SystemVerilog file of the module | 
|  | for which the code shall be generated. This can be a | 
|  | primitive or a comportable IP (for which the -c switch | 
|  | should be set). | 
|  |  | 
|  | optional arguments: | 
|  | -h, --help            show this help message and exit | 
|  | -o OUTDIR, --outdir OUTDIR | 
|  | Path where to place the testbench code. This is | 
|  | defaults to '../fpv' w.r.t. to the module path. For | 
|  | instance, if the module path is | 
|  | 'hw/ip/mymod/rtl/mymod.sv', the FPV testbench would be | 
|  | generated under hw/ip/mymod/fpv. | 
|  | -c, --is_cip          Indicates whether this is a comportable IP. If yes, | 
|  | FPV assertions for the TL-UL interface and CSRs are | 
|  | automatically bound in the testbench. Note however | 
|  | that these CSR assertions need to be generated | 
|  | separately using the regtool automation. | 
|  | ``` |