verilator/test_regress/t/t_func_recurse_param.v

45 lines
1.3 KiB
Systemverilog

// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2003 by Wilson Snyder.
// 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 (%s !== %s)\n", `__FILE__,`__LINE__, (gotv), (expv), `"gotv`", `"expv`"); `stop; end while(0);
// verilog_format: on
module t;
function automatic int recurse_self;
input int i;
int r1;
int r2;
// Simulator support for statics in constant functions get varying results, not testing
static int local_static = 10;
automatic int local_automatic; // check each function call resets to zero
if (i == 0) begin
local_static = 0;
recurse_self = 0;
end
else begin
local_static = local_static + 1;
local_automatic = local_automatic + 10;
recurse_self = i + recurse_self(i - 1) * 2 + recurse_self(i - 1) * 3 + local_automatic;
end
endfunction
localparam int F0 = recurse_self(0);
localparam int F3 = recurse_self(3);
localparam int F4 = recurse_self(4);
initial begin
`checkd(F0, 0);
`checkd(F3, 348);
`checkd(F4, 1754);
$write("*-* All Finished *-*\n");
$finish;
end
endmodule