2026-03-20 23:29:20 +01:00
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain.
// SPDX-FileCopyrightText: 2026 PlanV GmbH
// SPDX-License-Identifier: CC0-1.0
// verilog_format: off
`define stop $stop
`define checkd(gotv,expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got=%0d exp=%0d\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
// verilog_format: on
module t ;
logic clk = 0 ;
always # 5 clk = ~ clk ;
logic [ 7 : 0 ] data_ref ;
logic [ 7 : 0 ] data_test ;
default clocking cb @ ( posedge clk ) ;
output # 0 data_ref ;
output # 0 data_test ;
endclocking
// =========================================================
// Branch 1: Procedural ##0 (IEEE 1800-2023 14.11)
// - Before clocking event: suspend until event fires
// - After clocking event: continue without suspension
// =========================================================
// 1a: ##0 at time 0 -- event has not yet fired, must wait
initial begin
# # 0 ;
`checkd ( int ' ( $time ) , 5 )
end
// 1b: ##0 after @(posedge clk) -- event already fired, no-op
initial begin
@ ( posedge clk ) ;
# # 0 ;
`checkd ( int ' ( $time ) , 5 )
end
// 1c: Multiple consecutive ##0 all resolve at same time
initial begin
# # 0 ;
# # 0 ;
# # 0 ;
`checkd ( int ' ( $time ) , 5 )
end
// 1d: ##0 followed by ##1 -- verify cycle counting still works
initial begin
# # 0 ;
`checkd ( int ' ( $time ) , 5 )
# # 1 ;
`checkd ( int ' ( $time ) , 15 )
end
// =========================================================
// Branch 2: ##0 in synchronous drive (IEEE 1800-2023 14.11)
// "shall have no effect, as if it were not present"
// cb.data <= ##0 value behaves same as cb.data <= value
// =========================================================
// Drive both at the same posedge: one with ##0, one without.
// If ##0 is truly "no effect", both signals update in the same cycle.
always begin
@ ( posedge clk ) ;
2026-03-21 15:56:13 +01:00
cb . data_ref < = 8 'hAB ; // no ##0 -- baseline
cb . data_test < = # # 0 8 'hAB ; // with ##0 -- should behave identically
2026-03-20 23:29:20 +01:00
@ ( posedge clk ) ;
`checkd ( data_test , data_ref )
`checkd ( data_test , 8 'hAB )
2026-03-21 15:56:13 +01:00
wait ( 0 ) ;
2026-03-20 23:29:20 +01:00
end
// =========================================================
// Branch 3: ##0 in property/sequence context
// a ##0 b = both a and b hold at the same clock tick
//
// =========================================================
logic p = 0 , q = 0 ;
int cycle = 0 ;
int assert_pass_count = 0 ;
always @ ( posedge clk ) begin
cycle < = cycle + 1 ;
p < = ( cycle = = 3 ) ; // p=1 only at cycle 4
q < = ( cycle = = 3 ) ; // q=1 only at cycle 4
end
// Pass action block: only incremented on nonvacuous success
2026-03-21 15:56:13 +01:00
assert property ( @ ( posedge clk ) p | - > ( p # # 0 q ) ) assert_pass_count + + ;
else $error ( " Branch 3: assertion (p |-> p ##0 q) failed " ) ;
2026-03-20 23:29:20 +01:00
// =========================================================
// Completion
// =========================================================
initial begin
# 200 ;
if ( assert_pass_count = = 0 ) begin
$write ( " %%Error: assertion (p |-> p ##0 q) never passed non-vacuously \n " ) ;
`stop ;
end
$write ( " *-* All Finished *-* \n " ) ;
$finish ;
end
endmodule