Assertion Binding

The bind construct allows you to attach assertions (or any module/interface) to a Design Unit (module) without touching the original RTL code. This is crucial for keeping VerificationIP separate from DesignIP.

Why use Bind?

  • Non-intrusive: No need to edit the synthesis-ready RTL.
  • Modularity: Keep assertions in a separate file (e.g., fifo_props.sv).
  • Reusability: Apply the same assertion module to multiple instances of a design.

Bind Syntax

// bind    (....);

bind fifo_rtl my_fifo_assertions i_assertions (
    .clk(clk),
    .rst_n(reset_n),
    .data_in(d_in),
    .full(fifo_full)
);

In this example, my_fifo_assertions is "instantiated" inside fifo_rtl as if you had written the instantiation there yourself.

Binding to Instances

You can bind to a specific instance in the hierarchy instead of the module definition (which affects ALL instances).

bind top.u_fifo_0 my_fifo_assertions i_props (...);

Common Interview Questions

Q: Can I bind an interface to a module?
Yes! This is a very powerful pattern. You can bind a SystemVerilog Interface to an RTL module to "spy" on its internal signals, and then pass that virtual interface to your UVM testbench.