158 lines
4.2 KiB
Verilog
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
|