AI-3

Get clarification of use of slice notation with unpacked arrays from SV-BC.

Section 4.7

Make changes shown in red:

 

string d[1:5] = { "a", "b", "c", "d", "e" };

string p[*];

p = { d[1:3], "hello", d[4:5] };

AI-87:

Clarify and correct the use of the implication operator

Section 20.9

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.

AI-89:

Reword definition of signal_identifier to clarify usage with other than port

Section 13.2

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.

AI-90:

Reword the second form of NBA, for consistency with NBA. Delay and then evaluate, or evaluate and then delay, but Not block.

Section 13.14

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

AI-93:

Clarify usage of const with class.

Section 5.3

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.