Files
iverilog/ivtest/ivltests/simparam.v
T
Stephen Williams cea237b407 Add ivtest to the iverilog source tree
By adding ivtest to the iverilog source tree, it is easier to keep
the regression test synchronized with the source that is being tested.
This should be especially helpful for PRs that add a new feature, and
have a matching ivtest PR with the regression test for that feature.
2022-01-15 10:18:50 -08:00

158 lines
4.2 KiB
Verilog

`timescale 1ns/1ps
module top;
lower dut();
endmodule
module lower;
parameter bad_name = "this_is_a_bad_name";
reg [15:0] def = "OK";
reg pass = 1'b1;
reg [1023:0] result;
real rl_res;
initial begin
#1;
/* Display the version and other information. */
$display("Testing with Icarus Verilog version: %g, subversion: %g",
$simparam("simulatorVersion"), $simparam("simulatorSubversion"));
$display("Using a CPU word size of %g bits.", $simparam("CPUWordSize"));
$display("Running in directory: %0s\n", $simparam$str("cwd"));
/*
* Check the time units and precision.
*
* Since this is double math check that the result is within a
* factor of 1e-10 of the correct value.
*/
rl_res = $simparam("timeUnit") - 1e-9;
rl_res = (rl_res < 0) ? -rl_res : rl_res;
if (rl_res > 1e-9*1e-10) begin
$display("$simparam(\"timeUnit\") failed, got %g.", rl_res);
pass = 1'b0;
end
rl_res = $simparam("timePrecision") - 1e-12;
rl_res = (rl_res < 0) ? -rl_res : rl_res;
if (rl_res >= 1e-12*1e-10) begin
$display("$simparam(\"timePrecision\") failed, got %g.", rl_res);
pass = 1'b0;
end
/* Check the string routines, see below for why this is a task. */
check_string;
/* Check that a bad parameter name with a default works. */
if ($simparam(bad_name, 1.0) != 1.0) begin
$display("$simparam with a bad name and a default value failed.");
pass = 1'b0;
end
result = $simparam$str(bad_name, def);
if (result[15:0] != "OK") begin
$display("$simparam$str with a bad name and a default value failed.");
pass = 1'b0;
end
/* These should also print an error message. */
if ($simparam(bad_name) != 0.0) begin
$display("$simparam with a bad name failed.");
pass = 1'b0;
end
result = $simparam$str(bad_name);
if (result[55:0] != "<error>") begin
$display("$simparam$str with a bad name failed.");
pass = 1'b0;
end
/* All these are currently unimplemented and just return 0.0 or N/A. */
if ($simparam("gdev") != 0.0) begin
$display("$simparam(\"gdev\") failed.");
pass = 1'b0;
end
if ($simparam("gmin") != 0.0) begin
$display("$simparam(\"gmin\") failed.");
pass = 1'b0;
end
if ($simparam("imax") != 0.0) begin
$display("$simparam(\"imax\") failed.");
pass = 1'b0;
end
if ($simparam("imelt") != 0.0) begin
$display("$simparam(\"imelt\") failed.");
pass = 1'b0;
end
if ($simparam("iteration") != 0.0) begin
$display("$simparam(\"iteration\") failed.");
pass = 1'b0;
end
if ($simparam("scale") != 0.0) begin
$display("$simparam(\"scale\") failed.");
pass = 1'b0;
end
if ($simparam("shrink") != 0.0) begin
$display("$simparam(\"shrink\") failed.");
pass = 1'b0;
end
if ($simparam("sourceScaleFactor") != 0.0) begin
$display("$simparam(\"sourceScaleFactor\") failed.");
pass = 1'b0;
end
if ($simparam("tnom") != 0.0) begin
$display("$simparam(\"tnom\") failed.");
pass = 1'b0;
end
result = $simparam$str("analysis_name");
if (result[23:0] != "N/A") begin
$display("$simparam$str(\"analysis_name\") failed.");
pass = 1'b0;
end
result = $simparam$str("analysis_type");
if (result[23:0] != "N/A") begin
$display("$simparam$str(\"analysis_type\") failed.");
pass = 1'b0;
end
if (pass) $display("\nPASSED");
end
/* We need this to make instance and path different. */
task check_string;
begin
result = $simparam$str("module");
if (result[39:0] != "lower") begin
$display("$simparam$str(\"module\") failed, got %0s.", result);
pass = 1'b0;
end
result = $simparam$str("instance");
if (result[55:0] != "top.dut") begin
$display("$simparam$str(\"instance\") failed, got %0s.", result);
pass = 1'b0;
end
result = $simparam$str("path");
if (result[159:0] != "top.dut.check_string") begin
$display("$simparam$str(\"instance\") failed, got %0s.", result);
pass = 1'b0;
end
end
endtask
endmodule