FreeBSD Manual Pages
NVC(1) General Commands Manual NVC(1) NAME nvc -- VHDL Compiler and Simulator SYNOPSIS nvc -a file ... nvc -e unit nvc -r unit DESCRIPTION nvc is an implementation of the VHDL language as defined by IEEE stan- dard 1076-1993 and later revisions. Simulating a design typically involves three steps: analysing one or more source files into the work library; elaborating a top-level design unit; and finally running the elaborated design. nvc accepts three kinds of options: global options; commands; and op- tions specific to the command. Global options must be placed before the command and specific options must be placed after the command. Commands -a file ... Analyse one or more files into the work library. Reads from standard input if file is `-'. -e unit Elaborate a previously analysed top level design unit. -r unit Execute a previously elaborated top level design unit. -i [unit] Start an interactive TCL shell, optionally with unit loaded. --cover-export file ... Export collected coverage information from the internal data- base format to an external format such as Cobertura XML. --cover-merge file ... Merge multiple coverage databases into a single database. --cover-report file ... Generate an HTML report from a coverage database. --do [unit] script Evaluate a batch TCL script, optionally with unit loaded. --init Initialise the working library directory. This is not normally necessary as the library will be automatically created when us- ing other commands such as -a. --install package Execute scripts to compile common verification frameworks and FPGA vendor libraries. --list Print all analysed and elaborated units in the work library. --print-deps unit ... Print dependencies of unit in Makefile format. Commands can be chained together arbitrarily and the top-level unit name need only be specified once. For example to analyse a file `source.vhd' and then elaborate and run a top-level entity `tb': $ nvc -a source.vhd -e tb -r Note how the unit argument for the -r command is taken from the earlier -e command. Global options -h, --help Display usage summary. -H size Set the maximum size in bytes of the simulation heap. This area of memory is used for temporary allocations during process execution and dynamic allocations by the VHDL `new' operator. The size parameter takes an optional k, m, or g suffix to indi- cate kilobytes, megabytes, and gigabytes respectively. The de- fault size is 16 megabytes. --ieee-warnings=[on|off|off-at-0] Enable or disable warning messages from the standard IEEE pack- ages. The off-at-0 option disables warnings in the first time step only. The default is warnings enabled. --ignore-time Do not check the timestamps of source files when the corre- sponding design unit is loaded from a library. --load=plugin Loads a VHPI plugin from the shared library plugin. See sec- tion "VHPI" for details on the VHPI implementation. -L path Add path to the list of directories to search for libraries. See the "LIBRARIES" section below for details. -M size Set the maximum amount of memory in bytes used for the internal representations of design units. The default is 16 megabytes but this may be insufficient when elaborating a large design. The size parameter takes an optional k, m, or g suffix to indi- cate kilobytes, megabytes, and gigabytes respectively. For ex- ample -M64m for 64 megabytes. --map=name:path Specify exactly the location of the logical library name. Li- braries mapped in this way will not use the normal search path. --messages=[full|compact] Select the format used for printing error and informational messages. The default full message format is designed for readability whereas the compact messages can be easily parsed by tools. --seed=N Seed for random number generation. Affects the `get_random' function in the `nvc.random' package, the --shuffle option, and PSL union expressions. --std=rev Select the VHDL standard revision to use. VHDL standard revi- sions are commonly referred to by the year they were published. For example IEEE 1076-1993 is known as VHDL-93. Specify either the full year such as 1993 or just the last two digits such as 93. The accepted revisions are 1993, 2000, 2002, 2008, 2019. Note there is very limited supported VHDL-2019 at present and VHDL-87 is not supported. The default standard revision is VHDL-2008. --stderr=level Print error messages with the given severity or higher to `stderr' instead of `stdout'. The default is to print all mes- sages to `stderr'. Valid levels are note, warning, error, and failure. -v, --version Display version and copyright information. --vhpi-debug Report any VHPI errors as diagnostic messages on the console. Normally these are only returned through the vhpi_check_error() function. --vhpi-trace Trace VHPI calls and events. This can be useful for debugging VHPI plugins. --work=name, --work=name:path Use name as the work library. The second variant explicitly specifies the location of the library. See the "LIBRARIES" section below for details. Analysis options --check-synthesis Issue warnings for common coding mistakes that may cause prob- lems during synthesis such as missing signals from process sen- sitivity lists. -D name[=value], --define=name[=value] Define a conditional analysis identifier (VHDL-2019) or pre- processor macro (Verilog). This option can be used multiple times to define multiple identifiers or macros. When value is ommited, the macro value is the empty string (""). --error-limit=num Stop after reporting num errors. The default is 20. Zero al- lows unlimited errors. -f list, --files=list Read the list of source files to analyse from list which is a text file containing one file name per line. If list is `-' then reads from the standard input instead. Comments starting with `#' are ignored. Alternatively this argument may be passed as @list for compatibility with other tools. --no-save Do not save analysed design units to the working library. This can be used to quickly check for syntax and type errors. --preserve-case Retain the original spelling of VHDL identifiers instead of converting to a canonical upper-case form. This is an experi- mental option and may lead to incorrect behaviour. --psl Enable parsing of PSL directives in comments. --relaxed Disable certain pedantic LRM conformance checks or rules that were relaxed by later standards. See the "RELAXED RULES" sec- tion below for details. --single-unit Treat all Verilog source files given on the command line as a single compilation unit. This means macros declared in one file are visible in all subsequent files. Elaboration options --cover Enable code coverage reporting (see the "CODE COVERAGE" section below). --cover-file=file Specify the file name of the output coverage database. De- faults to the name of the top-level unit with a `.ncdb' exten- sion. --cover-spec=sfile Specify design part where code coverage is collected by sfile coverage specification file (see the "CODE COVERAGE" section below). -g name=value Override generic name with value. Integers, enumeration liter- als, and string literals are supported. Generics in internal instances can be overridden by giving the full dotted path to the generic. For example -g I=5, -g INIT='1', and -g UUT.STR="hello". -j, --jit Normally nvc compiles all code ahead-of-time during elabora- tion. The --jit option defers native code generation until run-time where each function will be compiled separately on a background thread once it has been has been executed often enough in the interpreter to be deemed worthwhile. This dra- matically reduces elaboration time at the cost of increased memory and CPU usage while the simulation is executing. This option is beneficial for short-running simulations where the performance gain from ahead-of-time compilation is not so sig- nificant. --no-collapse Do not collapse ports into a single signal. Normally if a sig- nal at one level in the hierarchy is directly connected to an- other signal in a lower level via a port map, the signals are "collapsed" and only the signal in the upper level is pre- served. The --no-collapse option disables this optimisation and preserves both signals. This improves debuggability at the cost of some performance. --no-save Do not save the elaborated design and other generated files to the working library. This is only really useful in combination with the -r option. For example: $ nvc -e --no-save tb -r -O0, -01, -02, -O3 Set LLVM optimisation level. Default is -O2. -V, --verbose Prints resource usage information after each elaboration step. Runtime options --dump-arrays[=N] Include memories and nested arrays in the waveform data. This is disabled by default as it can have significant performance, memory, and disk space overhead. With optional argument N only arrays with up to this many elements will be dumped. --exit-severity=level Terminate the simulation after an assertion failures of sever- ity greater than or equal to level. Valid levels are note, warning, error, and failure. The default is failure. This option also overrides the minimum severity level which causes the program to return a non-zero status code. The de- fault is error which allows assertion violations to be detected easily. --format=fmt Generate waveform data in format fmt. Currently supported for- mats are: fst and vcd. The FST format is native to gtkwave(1). FST is preferred over VCD due its smaller size and better per- formance. VCD is a very widely used format but has limited ability to represent VHDL types and the performance is poor: select this only if you must use the output with a tool that does not support FST. The default format is FST if this option is not provided. Note that GtkWave 3.3.79 or later is required to view the FST output. -g, --gtkw[=file] Write a gtkwave(1) save file containing every signal in the de- sign hierarchy in declaration order with separators for each scope. This only makes sense in combination with the --wave option. --include=glob, --exclude=glob Signals that match glob are included in or excluded from the waveform dump. See section "SELECTING SIGNALS" for details on how to select particular signals. These options can be given multiple times. --shuffle Run processes in random order. The VHDL standard does not specify the execution order of processes and different simula- tors may exhibit subtly different orderings. The --shuffle op- tion can help to find and debug code that inadvertently depends on a particular process execution order. This option should only be used during debug as it incurs a significant perfor- mance overhead as well as introducing potentially non-determin- istic behaviour. --stats Print a summary of the time taken and memory used at the end of the run. --stop-delta=N Stop after N delta cycles. This can be used to detect zero- time loops in your model. The default is 10000 if not speci- fied. Setting this to zero disables the delta cycle limit. --stop-time=T Stop the simulation after the given time has elapsed. Format of T is an integer followed by a time unit in lower case. For example 5ns or 20ms. --trace Trace simulation events. This is usually only useful for de- bugging the simulator. -w, --wave[=file] Write waveform data to file. The file name is optional and if not specified will default to the name of the top-level unit with the appropriate extension for the waveform format. The waveform format can be specified with the --format option. By default all signals in the design will be dumped: see the "SELECTING SIGNALS" section below for how to control this. Coverage export options --format=format Selects one of the following output file formats: cobertura Cobertura XML format widely supported by CI systems. xml Simple XML dump of the coverage database contents. The schema is liable to change between releases. -o, --output=file Write output to file. If this option is not specified the standard output stream is used. --relative[=path] Strip path or the current working directory from the front of any absolute path names in the output. Coverage merge options -o, --output=file File name of output coverage database. -m, --merge-mode=mode Where mode can be one of: union, intersect Coverage report options -o, --output=dir Name of output directory where HTML files will be generated. --exclude-file=efile Apply commands in efile exclude file when generating code cov- erage report. --dont-print=options When set, NVC does not include code coverage details specified by options in the code coverage report. options is comma sepa- rated list of the following values: covered Does not include covered items. uncovered Does not include uncovered items. excluded Does not include excluded items. --item-limit=limit NVC displays maximum limit items of single type (covered, un- covered, excluded) in a single hierarchy in the code coverage report. Each Bin is counted as one item. The default value of limit is 5000. --per-file Create source file code coverage report instead of hierarchy coverage report. Make options --deps-only Generate rules that only contain dependencies without actions. These can be useful for inclusion in a hand written makefile. --posix The generated makefile will work with any POSIX compliant make. Otherwise the output may use extensions specific to GNU make. Install options --dest=dir Compile libraries into directory dir instead of the default $HOME/.nvc/lib. LIBRARIES A library is a directory containing analysed design units and other files generated by nvc. The default library is called "work" and is placed in a directory also called work. Note that VHDL also has a con- cept of the "work library" where the current library can be referred to by the alias work. This confusing behaviour is an unfortunate hangover from the proprietary tools the author used prior to writing nvc. The name and physical location of the work library is controlled by the --work global option. In the simple case of --work=name the library name is `name' and the physical location is a directory name relative to the current working directory. The physical location can be speci- fied explicitly using --work=name:path where path is the directory name. On Windows the ; character can be used instead of : as a separa- tor. The following examples should make this behaviour clear: $ nvc --work=mylib ... The work library is named `mylib' and is mapped to a directory with the same name in the current working directory. $ nvc --work=mylib:somedir ... The work library is named `mylib' and is mapped to a directory somedir in the current working directory. $ nvc --work=mylib:/foo/bar ... The work library is named `mylib' and is mapped to the absolute path /foo/bar. Concurrent access to a single library by multiple processes is com- pletely safe and protected by a lock in the filesystem using flock(2) that allows multiple concurrent readers but only a single writer. TCL SCRIPTING nvc supports both interactive and batch scripting using TCL. This must be enabled at compile time using `--enable-tcl'. The TCL environment supports standard TCL commands, the `tcllib' extension library, and a number of NVC-specific commands. Use the help command in the interac- tive environment (-i) to list these. CODE COVERAGE nvc can collect code coverage data while the simulation is executing. NVC counts coverage in so called coverage bins. Each coverage bin counts from 0, and increments each time coverage kind specific criteria are met. Coverage bins saturate at 2147483647. The following coverage kinds are supported: • statement - For each statement, NVC creates coverage bin. When a statement is executed, coverage bin is incremented. • branch - For each point where code diverges (if/else, case, when/else, with/select statements), NVC creates coverage bin. If branch can be evaluated to both true and false, NVC creates two coverage bins for such branch (one for each of true/false). When a branch is evaluated, its coverage bin is incremented. • toggle - Each signal of type derived from `std_logic' (including nested arrays) creates two coverage bins (to track 0 -> 1 and 1 -> 0 transitions). When a signal toggles, coverage bin is incremented. • expression - NVC creates multiple coverage bins for combinations of input operands of the following logical operators: `and', `nand', `or', `nor', `xor', `xnor', such that propagation of operand values causes the expression result to change its value. Further, NVC creates two coverage bins for evaluating expression result to `True' and `False' for the following operators: `=', `/=', `>', `<', `<=', `>=', `not'. NVC collects expression coverage also on overloaded logic operators from `ieee.std_logic_1164' library. It tracks combinations of input values to logic operators for `std_logic' operand type. NVC does not collect expression coverage for VHDL 2008 overloaded operands for `std_logic_vector' type. When expression evaluates, coverage bin corresponding to combination of expression operands, or expression result is incremented. • fsm-state - NVC tracks if states of Finite State Machines (FSMs) are visited. NVC creates a coverage bin for each state of an FSM. NVC considers internal signals of all user-defined enum types as FSMs. NVC does not consider port signals or variables as an FSM. When a signal recognized as FSM changes its value, coverage bin for new state value is incremented. • functional - NVC creates a coverage bin for each: • PSL `cover' directive. When a PSL sequence in the cover direc- tive completes, coverage bin is incremented. • Functional coverage bin from third party libraries (e.g. OSVVM) Collection of each coverage kind can be enabled separately at elabora- tion time: $ nvc -e --cover=statement,branch,toggle,expression <top> If no coverage type is specified as an argument of --cover, all cover- age types are collected. After the simulation has finished the cover- age data is written to a coverage database file. By default this is the name of the top-level unit with an `.ncdb' extension in the current working directory, but can be changed with the --cover-file elaboration option. Code coverage merging To merge code coverage data from multiple simulations run: $ nvc --cover-merge -o merged.ncdb first.ncdb second.ncdb third.ncdb ... During code coverage merging, NVC sums together coverage bins with equal hierarchical paths in the elaborated design. NVC supports different modes of merging. The merge mode controls what NVC does if a coverage database that is being merged (new) contains a coverage item that is not present in the coverage database being merged into (old). The merge mode can be selected by a --merge-mode=mode op- tion where mode can be one of: • union - The item is added to the merged (old) database. This is the default mode. • intersect - The item is dropped from the merged (old) database. Generating code coverage report To generate code coverage report in HTML format, run: $ nvc --cover-report -o report_dir merged.ncdb The command above will generate a code coverage report in the report_dir directory. Code coverage report shows whether a coverage bin is covered or uncovered. A bin is covered when its counter is equal to, or higher than threshold given by --threshold-<value> option of --cover elabortion switch. NVC supports two kinds of code coverage reports: • hierarchy report - Code coverage report contains code coverage sum- mary for each design hierarchy in simulated design. Code coverage data of a nested hierarchy are added to data of hierarchy that in- stantiate the nested hierarchy. • source file report - Code coverage report contains code coverage summary for each source file used in simulated design. If a single entity or module was instantiated multiple times, code coverage data from all such instantiations are merged and reported under one source file. If a source file was compiled, but none of its enti- ties, modules or packages were used in the simulated design, such file is not shown in code coverage report. By default NVC generates hierarchy code coverage report. To generate source file code coverage report, add --per-file switch to --cover-report command. Code coverage merging and generating code coverage report can also be done in a single command: $ nvc --cover-report -o html first.ncdb second.ncdb third.ncdb ... Additional code coverage options NVC supports the following additional options to control coverage col- lection: • count-from-undefined - When set, NVC also counts toggles from U / X to 1 as 0 to 1 and toggles from U / X to 0 as 1 / 0 during toggle coverage collection. • count-from-to-z - When set, NVC also counts toggles from/to Z to either of 0/1 as valid 0 -> 1 or 1 -> 0 transitions. • include-mems - When set, NVC collects toggle coverage on multidi- mensional arrays or nested arrays (array of array), disabled by de- fault. • ignore-arrays-from-<size> - When set, NVC does not collect toggle coverage on arrays whose size is equal to or larger than <size> • exclude-unreachable - When set, NVC detects unreachable coverage bins and automatically excludes them during code coverage report generation. NVC detects following unreachable coverage items: • Toggle coverage on instance ports driven by constant value. • Expression coverage bins where right side of the expression is not evaluated due to left side value being sufficient to deter- mine expression result. This applies to following cases: • `or' expression bin with LHS=True, RHS=False • `and' expression bin with LHS=False, RHS=True. • fsm-no-default-enums - When set, NVC by default does not consider signals of usr-define enum types as FSMs. With this option, NVC can be forced to recognize FSMs only via `fsm-type' directive in cover- age specification file. • threshold-<value> - A minimal value of coverage bin counter for coverage bin to be reported as covered. Default is 1. All additional coverage options are passed comma separated to --cover elaboration option, e.g.: $ nvc -e --cover=all,include-mems,count-from-undefined <top> Coverage collection on parts of the code can be ignored via a comment pragma, for example: case (sel) is when "00" => ... when "01" => ... when "10" => ... when "11" => ... -- coverage off when others => report "ERROR" severity failure; -- coverage on end case; In the example above, statement coverage for the `report' statement and branch coverage for `others' choice will not be collected. Toggle coverage collection on specific signals can be also disabled: -- coverage off signal cnt : std_logic_vector(3 downto 0); -- coverage on Coverage specification file NVC can collect code coverage only on part of the simulated design. When coverage specification file is passed during elaboration time, NVC collects code coverage only as specified in this file. If the file is ommited, NVC collects code coverage on whole design. The format of commands in the coverage specification file is as follows: (+|-)block <ENTITY_NAME> (+|-)hierarchy <HIERARCHY> (+|-)fsm-type <TYPE> An example of coverage specification file is following: # Placing '#' is treated as comment till end of line # Example how to enable collecting code coverage on a hierarchy: +hierarchy WORK.TOP.DUT_INST* # Example how to disable collecting code coverage on a hierarchy: -hierarchy WORK.TOP.DUT_INST.THIRD_PARTY_SUB_BLOCK_INST* # Example how to enable collecting code coverage on entity or block: +block async_fifo # Example how to disable collecting code coverage on entity or block: -block clock_gate_model # Example how to force all signals of enum types named 'T_FSM_STATE' # to be recognized as FSM +fsm_type T_FSM_STATE # Example how to force all signals of enum types with name matching # 'T_*_FSM' pattern to be recognized as FSM +fsm_type T_*_FSM # Example how to force all signals of enum type named 'T_TRANSFER_TYPE' # not to be recognized as an FSM -fsm-type T_TRANSFER_TYPE In coverage specification file `block' has priority over `hierarchy', disabled hierarchy / block ( `-' ) has priority over enabled hierarchy / block ( `+' ). Exclude file NVC can exclude any coverage bins when generating code coverage report. When a coverage bin is excluded, it is counted as "Covered" in the cov- erage summary and displayed in a dedicated group in the code coverage report. Format of commands in exclude file is following: exclude <HIERARCHY(.BIN)> Where `<HIERARCHY>' is hierarchical path of the coverage bin in the elaborated design, and `BIN' is one of following bins: • BIN_TRUE - Excludes "Evaluated to: True" bin. Applicable to if/else branch, when/else branch or expression. • BIN_FALSE - Excludes "Evaluated to: False" bin. Applicable to if/else branch, when/else branch or expression. • BIN_CHOICE - Excludes "Choice of:" bin. Applicable to case/with branch choices. • BIN_X_Y - Excludes bins for combination of input operands (LHS, RHS) of an expression. Applicable to an expression for which com- binations of input operand values is tracked. `X', `Y' shall be 0 or 1. Excludes bin where LHS = `X' and RHS = `Y', see an example exclude file below. • BIN_0_TO_1 - Excludes "Toggle from 0 to 1" bin. Applicable to sig- nal / port toggle coverage. • BIN_1_TO_0 - Excludes "Toggle from 1 to 0" bin. Applicable to sig- nal / port toggle coverage. • BIN_STATE.<ENUM_VALUE> - Excludes `ENUM_VALUE' FSM state. An example of exclude file: # Placing '#' is treated as comment till end of line # Example how to exclude statement # For statements BIN shall be ommited exclude WORK.TOP._P1._S0._S3 # Example how to exclude all coverage items which match wildcard: exclude WORK.TOP.SUB_BLOCK_INST.* # Example how to exclude 4 coverage bins for combinations of input # operands value (LHS, RHS) of an expression: exclude WORK.TOP.XOR_GATE._S0._E0.BIN_0_0 exclude WORK.TOP.XOR_GATE._S0._E0.BIN_0_1 exclude WORK.TOP.XOR_GATE._S0._E0.BIN_1_0 exclude WORK.TOP.XOR_GATE._S0._E0.BIN_1_1 # Example which excludes the same items as previous example, # but excludes all bins by a single command: exclude WORK.TOP.XOR_GATE._S0._E0.* # Example how to exclude branch 'Evaluated to: False' bin: exclude WORK.TOP._P0._S0._B0.BIN_FALSE # Example how to exclude toggle bin 'Toggle from 0 to 1' on # a signal, and all toggle bins on a port of sub-instance: exclude WORK.TOP.SIGNAL_NAME.BIN_0_TO_1 exclude WORK.TOP.SUB_BLOCK_INST.PORT_NAME.* # Example how to exclude FSM state "ST_ERROR" where "ST_ERROR" # is one of the enum values used to code the FSM. exclude WORK.TOP.CONTROLLER.CURR_STATE.BIN_STATE.ST_ERROR Coverage folding NVC supports merging code coverage of single entity / module instanti- ated on multiple places in hierarchy. Such type of coverage merging is called coverage folding. Coverage folding is useful when simulating a complex DUT. If a sub-block of a DUT has a logic that is hard to cover in DUT top level test-bench, then creating a unit test for such sub- block is easy way to achieve full sub-block coverage. The sub-block has different hierarchy when simulated in DUT top level test-bench and in the unit test. In DUT top level test-bench, the sub-block is instanti- ated under the DUT. In the unit-test, sub-block is instantiated di- rectly. To merge coverage data from two such instantiations, you can utilize coverage folding. Coverage folding is specified by `fold' command placed in Exclude file. The syntax of `fold' command is following: fold <DESTINATION_INSTANCE_HIERARCHY> <SOURCE_INSTANCE_HIERARCHY> where `<DESTINATION_INSTANCE_HIERARCHY>' is the destination hierarchy where the coverage data will be merged and `<SOURCE_INSTANCE_HIERARCHY>' is the source hierarchy from which the coverage data will be merged. When folding coverage, NVC merges coverage items similarly as during regular merging (based on hierarchical path). However, in case of folding, NVC strips `<DESTINATION_INSTANCE_HIERARCHY>' from the path of the destination coverage item, and strips `<SOURCE_INSTANCE_HIERARCHY>' from the source item. Thus NVC folds coverage items based on matching suffix of their hierarchical path. An example of how folding can be specified is following. Assume there is an entity `INSTR_CACHE' instantiated as: • `I_INSTR_CACHE' instance in a testbench `TB_TOP' • `DUT' instance in a unit test `CACHE_UNIT_TEST' `TB_TOP' testbench is compiled into `TB_TOP_LIB' library. Unit test is compiled into `UNIT_TEST_LIB' library. The following command folds cov- erage items of `INSTR_CACHE' from `CACHE_UNIT_TEST' to `TB_TOP' : fold TB_TOP_LIB.TB_TOP.DUT.I_CPU_DATAPATH.I_INSTR_CACHE UNIT_TEST_LIB.CACHE_UNIT_TEST.DUT Code coverage limitations When part of the design hierarchy is formed by an if-generate-else or case-generate statement, the hierarchical path of implicit block state- ments for each of the if-else branches or case choices is identical un- less the user provides an alternative label for each branch or choice. For example: my_gen : case (op_kind) generate when op_add => x <= a + b; when op_sub => x <= a - b; end generate my_gen; Both assignment statements have a hierarchical path that ends with `.MY_GEN._P0._SO' and will not be considered distinct when merging. To avoid this give each case branch a unique label: my_gen : case (op_kind) generate when branch1: op_add => x <= a + b; when branch2: op_sub => x <= a - b; end generate my_gen; Additional Information In coverage specification file and Exclude file `<ENTITY_NAME>' `<HIERARCHY>' and `<TYPE>' are case-insensitive. You can get examples of exclude commands from generated Code coverage report by clicking on a "Get Exclude Command" button. RELAXED RULES The --relaxed analysis flag enables "relaxed rules" mode which down- grades the following errors to warnings: • Impure function called from pure function. • File object declared in pure function. • Default expression in object interface declaration is not globally static. • Shared variable is not of protected type in VHDL-2000 or later. Additionally the following languages features from VHDL-2008 and later are enabled in earlier standards: • Any visible explicitly declared operator always hides an implicit operator regardless of the region in which it is declared. This is required to analyse code that uses the non-standard Synopsys std_logic_arith package. • References to generics and array slices are allowed in locally sta- tic expressions using the VHDL-2008 rules. • Range bounds with `universal_integer' type are not required to be numeric literals or attributes. This option allows ranges such as `-1 to 1' in VHDL-1993 which otherwise must be written `integer'(-1) to 1'. SELECTING SIGNALS Every signal object in an elaborated design has a unique hierarchical path name. In VHDL this can be accessed using the `PATH_NAME' at- tribute. A signal can be referred to using its full path name, for example `:top:sub:x', and `:top:other:x' are two different signals named `x' in the design. The character `:' is a hierarchy separator. The special character `*' is a wildcard that matches zero or more characters and may be used refer to a group of signals. For example `:top:*:x', `*:x', and `:top:sub:*', all select both of the previous signals. Restricting waveform dumps Path names and globs can be used to exclude or explicitly include sig- nals in a waveform dump. For simple cases this can be done using the --include and --exclude arguments. For example --exclude=":top:sub:*" will exclude all matching signals from the waveform dump. Multiple in- clusion and exclusion patterns can be provided. Specifying large numbers of patterns on the command line quickly be- comes cumbersome. Instead inclusion and exclusion patterns can be read from a text file. If the top-level unit name is `top' then inclusion patterns should be placed in a file called top.include and exclusion patterns in a file called top.exclude. These files should be in the working directory where the `nvc -r' command is executed. The format is one glob per line, with comments preceded by a `#' character. When both inclusion and exclusion patterns are present, exclusions have precedence over inclusions. If no inclusion patterns are present then all signals are implicitly included. VHPI nvc supports a subset of VHPI allowing access to signal values and events at runtime. The standard VHPI header file <vhpi_user.h> will be placed in the system include directory as part of the installation process. VHPI plugins should be compiled as shared libraries; for ex- ample: $ cc -shared -fPIC my_plugin.c -o my_plugin.so $ nvc -r --load my_plugin.so my_tb The plugin should define a global vhpi_startup_routines which is a NULL-terminated list of functions to call when the plugin is loaded: void (*vhpi_startup_routines[])() = { startup_1, startup_2, NULL }; Functions defined in VHPI plugin libraries may be called from VHDL us- ing either the standard VHPI protocol or a simplified protocol similar to ghdl(1) To use the standard VHPI protocol the VHDL function should be declared with the `FOREIGN' attribute giving the "object library name" and "model name" of the foreign function. For example: function my_func (x : integer; y : bit_vector; z : std_logic) return integer is begin report "should not reach here" severity failure; end function; attribute foreign of my_func : function is "VHPI my_lib my_func"; The VHPI plugin should then call vhpi_register_foreignf() to register the foreign subprogram. static void my_func_cb(const vhpiCbDataT *cb_data_p) { ... } vhpiForeignDataT my_func_data = { .kind = vhpiFuncF, .libraryName = "my_lib", .modelName = "my_func", .execf = my_func_cb, }; vhpi_register_foreignf(&my_func_data); To use the simplified protocol the VHDL the `FOREIGN' attribute should be specified with the keyword `VHPIDIRECT' and name of the function symbol exported from the plugin. For example: attribute foreign of my_func : function is "VHPIDIRECT my_func"; Where `my_func' is a global function defined in the plugin library as follows. int32_t my_func(int32_t x, const uint8_t *y, int64_t y_len, uint8_t z); Foreign procedures may be defined similarly: function my_proc (x : out integer; y : out bit_vector; z : std_logic); attribute foreign of my_proc : function is "VHPIDIRECT my_proc"; void my_proc(int32_t *x, uint8_t *y, int64_t y_len, uint8_t z); Note that scalar `out' parameters are passed by pointer. There is a simple mapping between VHDL and C types. Integers The smallest C integer type that holds the full range of the VHDL type. Reals C double regardless of the range of the VHDL type. Enumerated types The smallest unsigned integer type that holds the full range of the VHDL type. Constrained arrays Pointer to the element type. Unconstrained arrays Pointer to the element type followed by one int64_t length argument for each dimension. Note that the bounds and direction are not available and must be passed explicitly as separate argu- ments if required. Records Not yet supported. Here are several examples for common types: VHDL type C type INTEGER int32_t INTEGER range 1 to 5 int8_t REAL double BOOLEAN uint8_t BIT_VECTOR(1 to 3) uint8_t * STD_LOGIC uint8_t STD_LOGIC_VECTOR uint8_t *, int64_t Foreign functions must not modify arrays passed as `in' arguments. Ad- ditionally foreign subprograms must not retain any pointers passed as arguments after the subprogram returns. Violating these rules will re- sult in unpredictable and hard to debug behaviour. ENVIRONMENT NVC_CONCURRENT_JOBS Provides a hint for the number of concurrently ex- ecuting simulations. This allows nvc to scale its worker thread count to avoid overloading the sys- tem. This is set automatically by frameworks such as VUnit. See NVC_MAX_THREADS. NVC_COLORS Controls whether nvc uses ANSI colour escape se- quences to print diagnostic messages. The possi- ble values are never, always, and auto which en- ables colour if stdout is connected to a terminal. The default is auto. NVC_MAX_THREADS Limit the number of worker threads nvc can create. The default is either eight or the number of available CPUs, whichever is smaller. SEE ALSO ghdl(1), gtkwave(1) AUTHORS Written by Nick Gasson <nick@nickg.me.uk> BUGS Report bugs to nick@nickg.me.uk or using the GitHub issue tracker at https://github.com/nickg/nvc/issues. Please include enough information to reproduce the problem, ideally with a small VHDL test case. FreeBSD ports 15.0 $Mdocdate$ NVC(1)
NAME | SYNOPSIS | DESCRIPTION | LIBRARIES | TCL SCRIPTING | CODE COVERAGE | RELAXED RULES | SELECTING SIGNALS | VHPI | ENVIRONMENT | SEE ALSO | AUTHORS | BUGS
Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=nvc&sektion=1&manpath=FreeBSD+Ports+15.0>
