9.7.5 Implicit event_expression list
The event_expression list of an event control is a common source of bugs in RTL simulations. Users tend to forget to add some of the nets or variables read in the timing control statement. This is often found when comparing RTL and gate level versions of a design. The implicit event_expression, @*, is a convenient shorthand that eliminates these problems by adding all nets and variables which are read by the statement (which can be a statement group) of a procedural_timing_control_statement to the event_expression.
All net and variable identifiers which appear in the statement will be automatically added to the event expression with these exceptions:
- Identifiers which only appear in wait or event expressions.
- Identifiers which only appear as a hierarchical_reg_identifier in
the reg_lvalue of the left hand side of assignments.
Nets and variables which appear on the right hand side of assignments, in function and task calls, or case and conditional expressions shall all be included by these rules.
Examples:
Example 1
always @(*) // equivalent to @(a or b or c or d or f)
y = (a & b) | (c & d) | myfunction(f);
Example 2
always @* begin // equivalent to @(a or b or c or d or tmp1 or tmp2)
tmp1 = a & b;
tmp2 = c & d;
y = tmp1 | tmp2;
end
Example 3
always @* begin // equivalent to @(b)
@(i) kid = b; // i is not added to @*
end
Example 4
always @* begin // equivalent to @(a or b or c or d)
x = a ^ b;
@* // equivalent to @(c or d)
x = c ^ d;
end