diff --git a/test_regress/t/t_class_name.v b/test_regress/t/t_class_name.v index 8aa884a73..0be89d598 100644 --- a/test_regress/t/t_class_name.v +++ b/test_regress/t/t_class_name.v @@ -4,30 +4,158 @@ // any use, without warranty, 2020 by Wilson Snyder. // SPDX-License-Identifier: CC0-1.0 -task unit_name; - $write("unit_name = '%m'\n"); -endtask +`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; - static task static_name; - $write("static_name = '%m'\n"); - endtask - task nonstatic_name; - $write("nonstatic_name = '%m'\n"); - endtask -endclass : 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 -module t (/*AUTOARG*/); - initial begin +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; - $write("t = '%m'\n"); - unit_name(); - $write("Below results vary with simulator.\n"); - // E.g. '$unit.\Cls::static_name ' - // E.g. '$unit_x.Cls.static_name' - c.static_name(); - c.nonstatic_name(); + 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"); + // UNSUP `checks(s, "tmf top.t.mod_func_name"); + + s = unit_name(); + `checks(s, "u top.$unit"); + // UNSUP `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"); + // UNSUP `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"); + // UNSUP `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"); + // UNSUP `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"); + // UNSUP `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"); + // UNSUP `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"); + // UNSUP `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"); + // UNSUP `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