Hardware Reference
In-Depth Information
sequence seq_previously(e);
e ##1 1;
endsequence : seq_previously
property previously(e);
seq_previously(e).triggered;
endproperty : previously
sequence seq_not_first;
##1 1;
endsequence : seq_not_first
property first;
!seq_not_first.triggered;
endproperty : first
sequence seq_once(e);
e ##[ * ]1;
endsequence : seq_once
property once(e);
seq_once(e).triggered;
endproperty : once
property sofar(e);
!seq_once(!e).triggered;
endproperty : sofar
sequence seq_since(e1, e2);
e2 ##1 e1[ * ];
endsequence : seq_since
property since(e1, e2);
seq_since(e1, e2).triggered;
endproperty : since
Fig. 11.12
Past temporal properties
11.2.1.2
Triggered Outside Assertions in RTL
Using triggered method is not limited to assertions, it is also legal in procedural
code. For example, if a and b are wires, and s is a sequence, the following statement
is legal:
assign a = s.triggered || b;
Even though this code looks innocent, it is dangerous in modules and interfaces
to use a in a concurrent assertion. Consider the following assertion:
a1: assert property (@( posedge clk) a);
The semantics of the assign statement evaluation with respect to a change in the
value of s.triggered is not well defined. We know that the value of s.triggered
persists only until the end of the simulation tick, and at the beginning of the next
simulation tick the new value of s.triggered is reset to 0. However, it is not
Search WWH ::




Custom Search