In reply to ben@SystemVerilog.us:
Ben ,
A final question regarding the Original Code ( Trying to document in my notes )
Based on your code I change the property to ::
property read_latency_check ;
int Ldelay ;
( $fell( rd_ ) , Ldelay = readLatency ) ##0 // Changed to ##0 from ##1
first_match( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) ) [*0:$]
##1 ( Ldelay == 0 ) )
##0 ( 1 , $display("TIME : %2t Antecedent is True ", $time ) ) |-> ( read_data == expected_data ) ;
endproperty
If I were to expand the expression within the first_match ::
( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) )[*0] ##1 ( Ldelay == 0 ) ) or
( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) )[*1] ##1 ( Ldelay == 0 ) ) or
( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) )[*2] ##1 ( Ldelay == 0 ) ) or
( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) )[*3] ##1 ( Ldelay == 0 ) ) or
( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) )[*4] ##1 ( Ldelay == 0 ) ) or
( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) )[*5] ##1 ( Ldelay == 0 ) ) or
( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) )[*6] ##1 ( Ldelay == 0 ) ) or
( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) )[*7] ##1 ( Ldelay == 0 ) ) or ..............
Which of these would the antecedent be True for ’ readLatency = 5 ’ ?
I am confused between the following two ::
(a) ( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) )[*5] ##1 ( Ldelay == 0 ) )
(b) ( ( 1 , Ldelay-- , $display("TIME : %2t Ldelay is %0d ", $time , Ldelay ) )[*6] ##1 ( Ldelay == 0 ) )
Via (a) Ldelay gets decremented to 0 such that after 1 clock ( Ldelay == 0 ) is True .
Via (b) Ldelay gets decremented to -1 but after 1 clock ( Ldelay == 0 ) isn’t True .