166 lines
4.8 KiB
Systemverilog
166 lines
4.8 KiB
Systemverilog
// DESCRIPTION: Verilator: Verilog Test module
|
|
//
|
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
|
// any use, without warranty, 2025 by Wilson Snyder.
|
|
// SPDX-License-Identifier: CC0-1.0
|
|
|
|
// verilator lint_off WIDTH
|
|
`include "dpi/uvm_dpi.svh"
|
|
// verilator lint_on WIDTH
|
|
|
|
// verilog_format: off
|
|
`define stop $stop
|
|
`define checkh(gotv, expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got='h%x exp='h%x\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
|
|
`define checks(gotv, expv) do if ((gotv) !== (expv)) begin $write("%%Error: %s:%0d: got='%s' exp='%s'\n", `__FILE__,`__LINE__, (gotv), (expv)); `stop; end while(0);
|
|
// verilog_format: on
|
|
|
|
// Undocumented DPI available version of uvm_report
|
|
// UVM declares without 'context'
|
|
package uvm_pkg;
|
|
export "DPI-C" function m__uvm_report_dpi;
|
|
function void m__uvm_report_dpi(int severity, string id, string message, int verbosity,
|
|
string filename, int line);
|
|
$display("UVM Report %s:%0d: %s %s", filename, line, id, message);
|
|
endfunction
|
|
endpackage
|
|
|
|
module t;
|
|
int i;
|
|
string s;
|
|
chandle h;
|
|
|
|
// To cover testing cases, this has non-zero LSB/LO
|
|
logic [31+8:8] exposed /*verilator public*/;
|
|
|
|
uvm_hdl_data_t lval;
|
|
|
|
initial begin
|
|
// TODO TEST:
|
|
// extern const char* uvm_dpi_get_next_arg_c(int init);
|
|
|
|
//===== Exports
|
|
uvm_pkg::m__uvm_report_dpi(1, "id", "message", 1, `__FILE__, `__LINE__);
|
|
|
|
//===== Tool
|
|
s = uvm_dpi_get_tool_name_c();
|
|
$display("uvm_dpi_get_tool_name_c() = %s", s);
|
|
`checks(s, "Verilator");
|
|
|
|
s = uvm_dpi_get_tool_version_c();
|
|
// - is so doesn't compare in .out file, in case version changes
|
|
$display("- uvm_dpi_get_tool_version_c() = %s", s);
|
|
if (s == "") $stop;
|
|
|
|
//===== Regexp
|
|
$display("= uvm_re");
|
|
h = uvm_dpi_regcomp("a.*b");
|
|
|
|
i = uvm_dpi_regexec(h, "__a_b__");
|
|
`checkh(i, 0);
|
|
i = uvm_dpi_regexec(h, "__a_z__");
|
|
`checkh(i, 1);
|
|
|
|
uvm_dpi_regfree(h);
|
|
|
|
i = uvm_re_match("a.*b", "__a__b__");
|
|
`checkh(i, 0);
|
|
|
|
i = uvm_re_match("a.*b", "__a__z__");
|
|
`checkh(i, 1);
|
|
|
|
s = uvm_glob_to_re("a foo bar");
|
|
`checks(s, "/^a foo bar$/");
|
|
|
|
//===== Hier
|
|
`ifdef VERILATOR
|
|
`ifdef TEST_VERBOSE
|
|
$c("Verilated::scopesDump();");
|
|
`endif
|
|
`endif
|
|
|
|
$display("= uvm_hdl_check_path");
|
|
i = uvm_hdl_check_path("t.__NOT_FOUND");
|
|
`checkh(i, 0);
|
|
i = uvm_hdl_check_path("t.exposed");
|
|
`checkh(i, 1);
|
|
i = uvm_hdl_check_path("$root.t.exposed");
|
|
`checkh(i, 1);
|
|
|
|
$display("= uvm_hdl_read simple variable");
|
|
exposed = 32'hb001;
|
|
lval = '0; // Upper bits not cleared by uvm_hdl_read
|
|
i = uvm_hdl_read("t.exposed", lval);
|
|
`checkh(i, 1);
|
|
`checkh(lval[31:0], exposed);
|
|
|
|
lval = '0;
|
|
$display("= uvm_hdl_read not found (bad)");
|
|
$display("===\nUVM Report expected on next line:");
|
|
i = uvm_hdl_deposit("t.__DEPOSIT_NOT_FOUND", lval);
|
|
`checkh(i, 0);
|
|
|
|
$display("= uvm_hdl_deposit simple variable");
|
|
lval = 1024'hab;
|
|
i = uvm_hdl_deposit("t.exposed", lval);
|
|
`checkh(i, 1);
|
|
`checkh(exposed, 32'hab);
|
|
|
|
$display("= uvm_hdl_read single bit");
|
|
exposed = 32'habcd;
|
|
lval = '0; // Upper bits not cleared by uvm_hdl_read
|
|
i = uvm_hdl_read("t.exposed[11]", lval);
|
|
`checkh(i, 1);
|
|
`checkh(lval[0], exposed[11]);
|
|
|
|
$display("= uvm_hdl_deposit single bit");
|
|
lval = 1024'h0;
|
|
i = uvm_hdl_deposit("t.exposed[11]", lval);
|
|
`checkh(i, 1);
|
|
`checkh(exposed, 32'habc5);
|
|
|
|
$display("= uvm_hdl_read multi-bit");
|
|
exposed = 32'habcd;
|
|
lval = '0; // Upper bits not cleared by uvm_hdl_read
|
|
i = uvm_hdl_read("t.exposed[19:12]", lval);
|
|
`checkh(i, 1);
|
|
`checkh(lval[7:0], exposed[19:12]);
|
|
|
|
$display("= uvm_hdl_deposit multi-bit");
|
|
lval = 1024'h12;
|
|
i = uvm_hdl_deposit("t.exposed[19:12]", lval);
|
|
`checkh(i, 1);
|
|
`checkh(exposed, 32'ha12d);
|
|
|
|
$display("= uvm_hdl_deposit bad ranges");
|
|
$display("===\nUVM Report expected on next line:");
|
|
i = uvm_hdl_deposit("t.exposed[10:3]", lval);
|
|
`checkh(i, 0);
|
|
$display("===\nUVM Report expected on next line:");
|
|
i = uvm_hdl_deposit("t.exposed[99:15]", lval);
|
|
`checkh(i, 0);
|
|
|
|
`ifdef VERILATOR
|
|
// UNSUPPORTED: force/release via VPI
|
|
// If support, validate or throw unsupported on force/release part-selects
|
|
$display("= uvm_hdl_force");
|
|
$display("===\nUVM Report expected on next line:");
|
|
i = uvm_hdl_force("t.exposed", 62);
|
|
`checkh(i, 0);
|
|
|
|
$display("= uvm_hdl_release");
|
|
$display("===\nUVM Report expected on next line:");
|
|
i = uvm_hdl_release("t.exposed");
|
|
`checkh(i, 0);
|
|
|
|
$display("= uvm_hdl_release_and_read");
|
|
$display("===\nUVM Report expected on next line:");
|
|
i = uvm_hdl_release_and_read("t.exposed", lval);
|
|
`checkh(i, 0);
|
|
`endif
|
|
|
|
$write("*-* All Finished *-*\n");
|
|
$finish;
|
|
end
|
|
|
|
endmodule
|