Get clarification of use of slice notation with unpacked arrays from SV-BC.
Make changes shown in red:
string
d[1:5] = { "a",
"b", "c", "d", "e" };
string
p[*];
p = { d[1:3],
"hello", d[4:5] };
Clarify and correct the use of the implication operator
Make changes shown in red:
The Boolean equivalent of the
implication operator a => b is (!a || b). This states that if the
expression is true then random numbers generated
are constrained by the constraint (or constraint block) otherwise the random
numbers generated are unconstrained.
The constraint is any valid constraint, and constraint_block represents an anonymous
constraint block. If the expression is true, all of the constraints in the
constraint block must also be satisfied.
For example:
mode == small => len < 10;
mode == large => len > 100;
In this example, the value of mode implies that
the value of len will be constrained to be less than 10 (mode == small), greater than 100 (mode ==
large), or unconstrained (mode != small and mode !=
large).
The boolean
equivalent of ( a =>
b ) is ( !a || b ).
Implication is a bidirectional operator. Consider the following example:
bit[3:0]
a, b;
constraint
c {a == 0) => (b == 1) ; };
Both a and b are 4 bits, so there are 256 combinations
of a and b. Constraint c says that a == 0 implies that b ==1, thereby
eliminating 15 combinations: {0,0}, {0,2}, … {0,15}. Therefore
the probability that a == 0 is thus 1/(256-15)
or 1/241.
It is important to that the constraint solver be designed to cover
the whole random value space with uniform probability. This allows
randomization to better explore the whole design space than in cases where
certain value combinations are preferred over others.
Reword definition of signal_identifier to clarify usage with other than port
Make changes shown in red:
The signal_identifier identifies a signal in the scope enclosing the clocking domain
declaration, and declares the name of a signal in the clocking domain. Unless a
hierarchical_expression is used, both
the signal and the clocking_item names shall be the same.
Reword the second form of NBA, for consistency with NBA. Delay and then evaluate, or evaluate and then delay, but Not block.
Make changes shown in red:
The second form of the synchronous drive uses the
intra-assignment syntax. An
intra-assignment event-count specification also delays execution of the assignment. In this case the
process does not block and the right-hand side expression is evaluated
when the statement executes.
Examples:
bus.data[3:0] <= 4’h5; //
drive data in current cycle
##1 bus.data
<= 8’hz; // wait 1 (bus) cycle and then drive data
##2; bus.data
<= 2; //
wait 2 default clocking cycles, then drive data
bus.data <= ##2 r; //
sample r then drive data 2 (bus) cycles later
Clarify usage of const with class.
Add the paragraph as shown in red:
A constant expression
contains literals and other named constants.
An instance of a class (an object handle) can also
be declared with the const keyword.
const class_name object = new(5,3);
This means that the object acts like a
variable that cannot be written. The arguments to the new method must be constant expressions.