1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
|
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2020 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
`ifdef verilator
`define stop $stop
`else
`define stop
`endif
`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);
function string unit_name;
return $sformatf("u %m");
endfunction
class Cls;
// We use the same name for all static_name's to check we resolve right
static function string static_name;
return $sformatf("c %m");
endfunction
// Different for non_statis to make sure likewise
function string c_auto_name;
return $sformatf("c %m");
endfunction
endclass
package P;
class Cls;
static function string static_name;
return $sformatf("p %m");
endfunction
function string p_auto_name;
return $sformatf("p %m");
endfunction
endclass
endpackage
module M;
class Cls;
static function string static_name;
return $sformatf("m %m");
endfunction
function string m_auto_name;
return $sformatf("m %m");
endfunction
endclass
S sub();
function string cls_static_name;
return Cls::static_name();
endfunction
function string cls_auto_name;
Cls c;
c = new;
return c.m_auto_name();
endfunction
endmodule
module S;
class Cls;
static function string static_name;
return $sformatf("ms %m");
endfunction
function string ms_auto_name;
return $sformatf("ms %m");
endfunction
endclass
function string cls_static_name;
return Cls::static_name();
endfunction
function string cls_auto_name;
Cls c;
c = new;
return c.ms_auto_name();
endfunction
endmodule
module t (/*AUTOARG*/);
string s;
M m();
function string mod_func_name;
return $sformatf("tmf %m");
endfunction
initial begin
Cls c;
P::Cls p;
p = new;
c = new;
s = mod_func_name();
`checks(s, "tmf top.t.mod_func_name");
s = unit_name();
`checks(s, "u top.$unit.unit_name");
// Others: "u $unit_????::unit_name
// Others: "u $unit::unit_name
// Others: "u \\package UnitScopePackage_1\ .UnitScopePackage_1.unit_name
// *** Below results vary with simulator.
s = Cls::static_name();
`checks(s, "c top.$unit.Cls.static_name");
// Others: "c $unit_????.Cls.static_name
// Others: "c $unit::\Cls::static_name
// Others: "c Cls.static_name
s = c.c_auto_name();
`checks(s, "c top.$unit.Cls.c_auto_name");
// Others: "c $unit_????.Cls.c_auto_name
// Others: "c $unit::\Cls::c_auto_name
// Others: "c Cls.c_auto_name
//UNSUP s = P::Cls::static_name();
//UNSUP `checks(s, "p top.P.Cls");
// UNSUP `checks(s, "p top.P.Cls.static_name");
// Others: "p P.Cls.static_name
// Others: "p P::Cls.static_name
// Others: "p P::\Cls::static_name
// Others: "p \\package P\ .Cls.static_name
s = p.p_auto_name();
`checks(s, "p top.P.Cls.p_auto_name");
// Others: "p P.Cls.p_auto_name
// Others: "p P::Cls.p_auto_name
// Others: "p P::\Cls::p_auto_name
// Others: "p \\package P\ .Cls.p_auto_name
s = m.cls_static_name();
`checks(s, "m top.t.m.Cls.static_name");
// Others: "m top.t.m.Cls.static_name
// Others: "m top.t.m.\Cls::static_name
s = m.cls_auto_name();
`checks(s, "m top.t.m.Cls.m_auto_name");
// Others: "m top.t.m.Cls.m_auto_name
// Others: "m top.t.m.\Cls::m_auto_name
s = m.sub.cls_static_name();
`checks(s, "ms top.t.m.sub.Cls.static_name");
// Others: "ms top.t.m.sub.Cls.static_name
// Others: "ms top.t.m.sub.\Cls::static_name
s = m.sub.cls_auto_name();
`checks(s, "ms top.t.m.sub.Cls.ms_auto_name");
// Others: "ms top.t.m.sub.Cls.ms_auto_name
// Others: "ms top.t.m.sub.\Cls::ms_auto_name
$write("*-* All Finished *-*\n");
$finish;
end
endmodule
|