Sarti
Sarti

Reputation: 143

SystemVerilog bind assertion sequence with variable

I have to write a SystemVerilog assertion with binding.

The assertion should be something like:

assert property (@(posedge (mod_clk & clk_gen_enable)) ##delay (clk_sync == 1));

mod_clk, clk_gen_en and clk_sync are signals of the module which I bind to, and delay is a variable which is a result of a calculation and should be in "units" of st_clk, which is also signal of the module which I bind to.

How can I write it correctly?

Upvotes: 0

Views: 817

Answers (1)

dave_59
dave_59

Reputation: 42623

For bind to work, all you need is encapsulate this assertion in a module

module my_module;
assert property (@(posedge (mod_clk & clk_gen_enable)) ##delay (clk_sync == 1));
endmodule

Then use the bind construct to insert my_module into your target module. Verilog search rules will search upwards to find your signal names.

bind my_target_module my_module my_instance_name();

##delay works on the clock edge you specified before it which you have as mod_clk & clk_gen_enable. I'm guessing you really mean to have clk_gen_enable as an implication.

property sync;
  int counter;
  @(posedge mod_clk) (clk_gen_enable, counter=delay)
        |-> @(posedge st_clk) (1,counter--)[*0:$] ##1 counter<0 ##0 (clk_sync == 1));
endproperty

Upvotes: 2

Related Questions