In Section 14.4 replace:

 

Drives are used to propagate the value of output or inout signals at their corresponding clock edge. A drive is an assignment in which the left hand side is a signal in a clocking domain.

 

The syntax to drive a signal is:

 

@delay signal_expression = expression;

or

signal_expression <= expression;

 

The delay optionally specifies the number of clocking events (i.e. cycles) that pass before the signal is driven. When no delay is specified, the default is @0, i.e., the current cycle.

 

The signal_expression is either a bit-select, slice, or the entire signal in a clocking that is to be driven (concatenation is not allowed):

 

dom.sig // entire signal

    

dom.sig[2] // bit-select

 

dom.sig[8:2] // slice

 

The expression can be any valid expression that is type compatible with the signal.

 

For example:

 

bus.data[3:0] = 4’h5; // drive on current cycle

@1 bus.data = 8’hz; // wait 1 cycle and then drive

 

The value driven onto an output signal is not applied until the signal’s drive edge (typically the clocking event) plus any output skew has transpired.

 

with:

 

Clocking domain outputs (output or inout) are used to drive values onto their corresponding signals, but at a specified time.  That is, the corresponding signal changes value at the indicated clocking event as modified by the output skew.

 

The syntax to specify a synchronous drive is similar to an assignment:

 

[ ## event_count ] clockvar_expression = expression;

or

clockvar_expression = [ ## event_count ] expression;

 

The clockvar_expression is either or a bit-select, slice, or the entire clocking domain output whose corresponding signal is to be driven (concatenation is not allowed):

 

dom.sig              // entire clockvar

dom.sig[2]           // bit-select

dom.sig[8:2]         // slice

 

The expression can be any valid expression that is assignment compatible with the type of the corresponding signal.

 

The event_count is an integral expression that optionally specifies the number of clocking events (i.e. cycles) that must pass before the statement executes.  Specifying a non-zero event_count blocks the current process until the specified number of clocking events have elapsed otherwise the statement executes at the current time.  The event_count uses a syntax similar to the cycle-delay operator (see Section 13.10), however, the synchronous drive uses the clocking domain of the signal being driven and not the default clocking.

 

The second form of the synchronous drive uses the intra-assignment syntax.  An intra-assignment event-count specification also delays execution of the statement, but the right-hand side expression is evaluated before the process blocks, instead of after.

 

Examples:

 

bus.data[3:0] = 4’h5;      // drive in current cycle

##1 bus.data = 8’hz;       // wait 1 (bus) cycle and then drive

##[2]; bus.data = 2;       // wait 2 default clocking cycles, then drive

bus.data = ##2 r;          // sample r, wait 2 (bus) cycles, the drive

 

Regardless of when the drive statement executes (due to event-count delays), the driven value is assigned to the corresponding signal only at the time specified by the output skew.