Assertion to check signal stability between 2 events

In reply to Anudeep J:
SVA relies on clocking events, typically a clock. Thus, the following is correct


assert1: assert property (@(posedge clk) $fell(a) |-> (b throughout c[->1]));
// Also, "stable" is defined as 
// $stable returns true if the sampled value of the expression did not change between the
// sampled value at the previous cycle and the sampled value at the current cycle. 
// Otherwise, it returns false. Thus, 
assert_stable: assert property (@(posedge clk) ##1 $fell(a) |-> 
                                            ($stable(b) throughout c[->1]));


However, what you want is something that is asynchronous. For that, I suggest the use of tasks with fork/join_any. For example:


   task automatic t1(); 
     bit fail; 
     fork 
        begin : check_stable
          @(b) fail=1;
        end : check_stable

        begin : at_end
           @(posedge c);
        end : at_end
     join_any
     assert(!fail) else $display("b is unstable %t", $realtime);
   endtask 

  initial 
     forever @(negedge a) t1(); 

Read my paper: SVA Alternative for Complex Assertions
Verification Horizons - March 2018 Issue | Verification Academy

Ben Cohen
http://www.systemverilog.us/ ben@systemverilog.us
For training, consulting, services: contact Home - My cvcblr


  1. SVA Alternative for Complex Assertions
    Verification Horizons - March 2018 Issue | Verification Academy
  2. SVA: Package for dynamic and range delays and repeats | Verification Academy
  3. SVA in a UVM Class-based Environment
    SVA in a UVM Class-based Environment | Verification Horizons | Verification Academy