verilator/test_regress/t/t_time.v

65 lines
1.9 KiB
Systemverilog
Raw Normal View History

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2024 by Paul Wright.
// SPDX-License-Identifier: CC0-1.0
/* Working through the $time example from IEEE Std 1364-2005
** Section 17.7.1
** The example uses a 10ns timeunit with a 1ns timeprecision
** For 16ns $time should return 2
** For 32ns $time should return 3
**/
2024-04-13 12:02:25 +00:00
`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);
module t ();
timeunit 10ns;
timeprecision 1ns;
longint should_be_2, should_be_3;
real should_be_1p6, should_be_3p2;
2024-04-13 12:02:25 +00:00
initial begin : initial_blk1
should_be_2 = 0;
should_be_3 = 0;
#(16ns);
$display("$time=%0t=%0d, $realtime=%g", $time(), $time(), $realtime());
should_be_2 = $time();
should_be_1p6 = $realtime();
#(16ns);
$display("$time=%0t=%0d, $realtime=%g", $time(), $time(), $realtime());
should_be_3 = $time();
should_be_3p2 = $realtime();
#(16ns);
$finish(1);
end
2024-04-13 12:02:25 +00:00
initial begin : initial_blk2
#(100ns);
$display("%%Error: We should not get here");
2024-04-13 12:02:25 +00:00
$stop;
end
function bit real_chk(input real tvar, input real evar);
real diff;
diff = tvar - evar;
return (diff < 1e-9) && (diff > -1e-9);
endfunction
2024-04-13 12:02:25 +00:00
final begin : last_blk
$display("Info: should_be_2 = %0d", should_be_2);
$display("Info: should_be_3 = %0d", should_be_3);
2024-04-13 12:02:25 +00:00
`checkd(should_be_2, 2);
`checkd(should_be_3, 3);
chk_2 : assert(should_be_2 == 2);
chk_3 : assert(should_be_3 == 3);
chk_1p6 : assert(real_chk(should_be_1p6, 1.6));
chk_3p2 : assert(real_chk(should_be_3p2, 3.2));
$write("*-* All Finished *-*\n");
end
endmodule