Waveform
Definition:
A series of transactions, each of
which represents a future value of the driver of a signal. The
transactions in a waveform are ordered with respect to time, so that
one transaction appears before another if the first represents a
value that will occur sooner than the value represented by the other.
Syntax:
waveform ::= waveform_element { , waveform_element }
| unaffected
waveform_element ::= value_expression [ after
time_expression ]
| null [ after
time_expression ]
Description
The waveform statement
appears on the right-hand side of the signal
assignment statement. It supports new values for the signal,
possibly together with expected delays
when the changes of the values will take effect. Alternatively, in
concurrent signal assignments, the reserved word unaffected
can be used instead of new values.
Each waveform element is composed of an expression whose value will
be assigned to the signal driver
and optional time expression is defined following the reserved word after.
The type of the expression appearing in the waveform element must be
the same as the type of the target signal (Example 1).
If there is no time expression specified in the waveform element of
the signal assignment statement, then the time delay is implicitly
delcared as after 0 ns (Example
2).
An expression in a waveform can be substituted by the value null.
This value can be assigned only to signals declared as guarded,
additionally with a resolution function (Example 3).
If the reserved word unaffected
is used as a waveform in a concurrent signal assignment, it is
equivalent to a process executing a null statement.
Evaluation of a waveform element produces a single transaction, i.e.
a pair: new value for a signal and time when this value will be
assigned. The time is determined by the current simulation time added
to the value of time expression in the waveform element.
Examples
Example 1
signal D_OUT, E_OUT :
BIT_VECTOR (3 downto 0);
.............................
D_OUT <= "0000" after
2 ns;
E_OUT <= "0000" after
2 ns, "1111" after
7 ns;
In the first signal assignment statement the "0000" value
will be assigned to the driver D_OUT after 2ns. In the second
assignment, first the "0000" value will be assigned to the
E_OUT after 2ns and then after additional 5 ns the signal will be
assigned the "1111" value.
Example 2
C_OUT <= 'X';
if C_OUT = 'X' then ...
Although the signal assignment will take place "after 0 ns",
it is not immediate and when the if statement is executed, C_OUT
will still have its value unchanged. Update of the C_OUT signal will
take place at the end of simulation cycle, i.e. when the process is suspended.
Example 3
architecture test_null of test is
function res_fun (res_val: bit_vector)
return bit is
begin
for i
in res_val'RANGE loop
if res_val
(i) = '1' then return '1';
end if;
return '0';
end loop;
end res_fun;
signal H : res_fun BIT register;
begin
P1: process
begin
A1: H <= '1' after 10
ns, null after 20 ns;
end process P1;
P2: process
begin
A2: H <= '1' after
5 ns, '0' after 10 ns;
end process P2;
end architecture test_null;
When the signal assignment statements A1 and A2 are executed:
-
two transactions are placed in driver of the signal H in process P1
('1' after 10 ns), (null after
20 ns) and
-
two transactions are placed in driver of the signal H in process P2
('1' after 5 ns), ('0' after
10 ns)..
This means that the value of the signal H at 5 ns is determined by
the resolution function with the value from process P2 equal to '1'
and the value from process P1 equal to '0'. After 10 ns the
resolution function will be called with '1' from process P1 and '0'
from process P2. After 20 ns the resolution function will be called
with a vector containing only one element ('0', contributed by
process P2) as the driver from the process P1 is disconnected.
Important Notes
|