-- verify the setup time on W and R signals
-- we assume W and R are asserted alternatingly
timing_check: process
variable w_asserted: time;
variable r_asserted: time;
begin
-- wait for DUT to be reset
wait until RST = '1';
wait until RST = '0';
-- verify write access
wait until W = '0';
w_asserted := now;
wait until W = '1';
print("I@TB: detected W access");
assert (now - w_asserted) >= tSU_W
report "E@TB: W setup time too short"
severity Error;
-- verify read access
wait until R = '0';
r_asserted := now;
wait until R = '1';
print("I@TB: detected R access");
assert (now - r_asserted) >= tSU_R
report "E@TB: R setup time too short"
severity Error;
end process timing_check;
Rerunning the simulation, the problem becomes immediately apparent:
VSIM 31> run -all # I@TB: detected W access # I@TB: detected R access VSIM 32>
The transaction log contains an insufficient number of write and read cycles. The problem can be fixed in the timing checker as shown:
-- wait for DUT to be reset wait until RST = '1'; wait until RST = '0'; loop -- verify write access wait until W = '0'; ... end loop; end process timing_check;
And now the problem in the circuit is detected:
VSIM 8> run -all # I@TB: detected W access # I@TB: detected R access # I@TB: detected W access # I@TB: detected R access # ** Error: E@TB: R setup time too short # Time: 64 ns Iteration: 0 # I@TB: detected W access VSIM 9>
In order to effectively work with transaction logs it's helpful to write them to files. Here is a way to do this with the MTI simulator:
vsim tb1 -c -do "run 400 ns ; exit -f" > sim.log
These logs should be kept for each test, so that in a later simulation run the current log can be automatically compared with the golden log.
Below are the files which have been simulated in this section:
|
|
|
| txt_util.vhd | hang2.vhd | tloop.vhd |