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