This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English version of the page.

Note: This page has been translated by MathWorks. Click here to see
To view all translated materials including this page, select Country from the country navigator on the bottom of this page.

Generate Native SystemVerilog Assertions from Simulink

This example shows you how to generate native SystemVerilog assertions from assertions in a Simulink model. This capability is useful whenever you need the same assertion behaviour in Simulink and in your HDL testing environment.

Requirements and Prerequisites

Products required for this example:

  • MATLAB®

  • Simulink®

  • Simulink Coder™

  • Mentor Graphics® ModelSim®/QuestaSim®

  • One of the supported C compilers: Microsoft® Visual C++, or GNU GCC

Overview

To generate a DPI-C component that contains SystemVerilog assertions, the Simulink model must use the Assertion for DPI-C block. Find this block in the HDL Verifier-> For Use with DPI-C SystemVerilog library as shown below:

This block can be used just like the generic Assertion block in the Model Verification library. The simulation behavior is identical to the Simulink Assertion block, however during DPI-C component generation the block generates a native SystemVerilog assertion for each Assertion for DPI-C block present in the model.

Set Up Example

The model in this example contains two Assertion for DPI-C block blocks. One of them is used to provide information for a delay using the customization option, the second block is set to provide warnings when a second delay is over.

Run the following code to set up the design.

cd(tempdir);
[~, ~, ~] = rmdir('svdpi_assertion', 's');
mkdir('svdpi_assertion');
cd('svdpi_assertion');
open_system('svdpi_assertion');

Set Up Model for Code Generation

The model is preconfigured with one of the DPI-C system target files (systemverilog_dpi_grt.tlc). Before generating the DPI-C component make sure to configure the desired assertion behavior in SystemVerilog via the block mask.

By default the assertion block will generate a SystemVerilog error ($error("")) with an empty message when triggered. This can be changed either by providing an error message, changing the error to a warning ($warning("")) with a warning message, or providing your own custom SystemVerilog command to be executed.

The picture below shows the SystemVerilog behavior configuration for the assertion block after the first delay. The parameters outside of the DPI-C assertion options group only affect Simulink simulation behavior.

Notice that the Assertion custom command is a valid SystemVerilog statement.

The second assertion block is configured to output a warning with a specified message as shown below.

If we run the model we can see that two assertion warnings are triggered in Simulink:

Generate SystemVerilog DPI-C Component

  1. In the svdpi_assertion model, right click the DPI_C_Assertion block, and select C/C++ Code -> Build This Subsystem.

  2. Click Build in the dialog box that appears.

  3. The build generates C code for the DPI_C_Assertion subsystem, and a System Verilog DPI-C wrapper and package file named "DPI_C_Assertion_build/DPI_C_Assertion_dpi.sv" and "DPI_C_Assertion_build/DPI_C_Assertion_dpi_pkg.sv".

Alternatively you can generate the component by executing: rtwbuild('svdpi_assertion/DPI_C_Assertion');

Run Generated Testbench in HDL Simulator

For this example ModelsSim/QuestaSim simulator will be used. To get more detailed instructions on how to run the testbench please refer to "Getting Started with SystemVerilog DPI Component Generation".

After running the testbench notice the messages and the warnings that are being thrown by the DPI-C component.

Tracing a SystemVerilog Assertion Back to Simulink

If you want to trace the assertion that generated the warning back to Simulink you need to find the Simulink Identifier (SID) from the warning message as shown below:

Once you find the SID for the assertion block you can use Simulink programmatic API's to highlight the corresponding block. Execute:

Simulink.ID.hilite('svdpi_assertion:7');

This will highlight the relevant block.

Filtering an Assertion in the HDL Simulator

If you want to filter an assertion in the HDL Simulator, you need to supply the SID of the block you want to filter as a plusargs argument to the HDL Simulator.

For instance the SID of the "InfoAssertion" assertion block is "svdpi_assertion:6". So in order to filter the informative messages given by this block we need to supply the argument "+svdpi_assertion:6" to the HDL Simulator. For this example in ModelSim/QuestaSim the simulation command would be:

vsim -c -voptargs=+acc -sv_lib ../DPI_C_Assertion work.DPI_C_Assertion_dpi_tb +svdpi_assertion:6