Problem: For a bus, ignore delta cycle changes and report only the eventual value at the and of the current time (slot).
`timescale 1ns/1ps
module tb;
logic [3:0] my_bus;
initial $timeformat(-9, 3, " ns", 10);
initial begin
my_bus = '0;
$display("0: %t: new value: %bb", $realtime, my_bus);
#5ns;
foreach (my_bus[i]) begin
my_bus[i] = ~my_bus[i];
#1;
end
$display("0: %t: new value: %bb", $realtime, my_bus);
#(10ns - $realtime);
foreach (my_bus[i]) begin
my_bus[i] = ~my_bus[i];
#0;
end
$display("0: %t: new value: %bb", $realtime, my_bus);
#(15ns - $realtime);
$finish;
end
initial begin
logic[3:0] old_val;
realtime tstamp;
old_val = my_bus;
tstamp = $realtime;
forever begin
@(my_bus)
if ($realtime > tstamp) begin
tstamp = $realtime;
if (old_val != my_bus) begin
$display("1: %t: new value: %bb", $realtime, my_bus);
old_val = my_bus;
end
end
end
end
initial begin
logic[3:0] old_val;
realtime tstamp;
old_val = my_bus;
tstamp = $realtime;
forever begin
@(my_bus)
tstamp = $realtime;
if (old_val != my_bus) begin
$display("3: %t: new value: %bb", $realtime, my_bus);
old_val = my_bus;
end
end
end
initial begin
logic[3:0] old_val;
realtime tstamp;
event e;
fork begin
forever begin
wait(e.triggered);
$display("2: %t: new value: %bb", $realtime, my_bus);
#1step;
end
end join_none
old_val = my_bus;
tstamp = $realtime;
forever begin
@(my_bus)
if (old_val != my_bus) begin
->> e;
old_val = my_bus;
end
end
end
initial begin
logic[3:0] old_val;
realtime tstamp;
event e;
fork begin
forever begin
wait(e.triggered);
$display("4: %t: new value: %bb", $realtime, my_bus);
#1step;
end
end join_none
old_val = my_bus;
tstamp = $realtime;
forever begin
@(my_bus)
if (old_val != my_bus) begin
-> e;
old_val = my_bus;
end
end
end
initial begin
forever begin
@(my_bus);
$monitor("6: %t: new value: %bb", $realtime, my_bus);
end
end
program p1 (
input logic[3:0] pbus
);
initial begin
forever begin
@(pbus);
$display("5: %t: new value: %bb", $realtime, my_bus);
end
end
endprogram
p1 p(.pbus(my_bus));
endmodule
The output from Questa 2024.1:
# 0: 0.000 ns: new value: 0000b # 3: 5.000 ns: new value: 1000b # 1: 5.000 ns: new value: 1000b # 4: 5.000 ns: new value: 1000b # 2: 5.000 ns: new value: 1000b # 5: 5.000 ns: new value: 1000b # 6: 5.000 ns: new value: 1000b # 3: 6.000 ns: new value: 1100b # 1: 6.000 ns: new value: 1100b # 4: 6.000 ns: new value: 1100b # 2: 6.000 ns: new value: 1100b # 5: 6.000 ns: new value: 1100b # 6: 6.000 ns: new value: 1100b # 3: 7.000 ns: new value: 1110b # 1: 7.000 ns: new value: 1110b # 4: 7.000 ns: new value: 1110b # 2: 7.000 ns: new value: 1110b # 5: 7.000 ns: new value: 1110b # 6: 7.000 ns: new value: 1110b # 3: 8.000 ns: new value: 1111b # 1: 8.000 ns: new value: 1111b # 4: 8.000 ns: new value: 1111b # 2: 8.000 ns: new value: 1111b # 5: 8.000 ns: new value: 1111b # 6: 8.000 ns: new value: 1111b # 0: 9.000 ns: new value: 1111b # 3: 10.000 ns: new value: 0111b # 1: 10.000 ns: new value: 0111b # 4: 10.000 ns: new value: 0111b # 3: 10.000 ns: new value: 0011b # 3: 10.000 ns: new value: 0001b # 3: 10.000 ns: new value: 0000b # 0: 10.000 ns: new value: 0000b # 2: 10.000 ns: new value: 0000b # 5: 10.000 ns: new value: 0000b # 6: 10.000 ns: new value: 0000b