diff --git a/Changes b/Changes index 041c08589..3a68943e0 100644 --- a/Changes +++ b/Changes @@ -5,6 +5,8 @@ The contributors that suggested a given feature are shown in []. Thanks! * Verilator 4.107 devel +**** Fix passing parameter type instantiations by position number. + * Verilator 4.106 2020-12-02 diff --git a/src/V3LinkDot.cpp b/src/V3LinkDot.cpp index c82b3dba5..d9d32c101 100644 --- a/src/V3LinkDot.cpp +++ b/src/V3LinkDot.cpp @@ -1161,7 +1161,7 @@ class LinkDotFindVisitor final : public AstNVisitor { VSymEnt* insp = m_statep->insertSym(m_curSymp, nodep->name(), nodep, m_classOrPackagep); if (m_statep->forPrimary() && nodep->isGParam()) { - m_paramNum++; + ++m_paramNum; VSymEnt* symp = m_statep->insertSym(m_curSymp, "__paramNumber" + cvtToStr(m_paramNum), nodep, m_classOrPackagep); @@ -1191,6 +1191,12 @@ class LinkDotFindVisitor final : public AstNVisitor { UASSERT_OBJ(m_curSymp, nodep, "Parameter type not under module/package/$unit"); iterateChildren(nodep); m_statep->insertSym(m_curSymp, nodep->name(), nodep, m_classOrPackagep); + if (m_statep->forPrimary() && nodep->isGParam()) { + ++m_paramNum; + VSymEnt* symp = m_statep->insertSym(m_curSymp, "__paramNumber" + cvtToStr(m_paramNum), + nodep, m_classOrPackagep); + symp->exported(false); + } } virtual void visit(AstCFunc* nodep) override { // For dotted resolution, ignore all AstVars under functions, otherwise shouldn't exist diff --git a/test_regress/t/t_class_vparam.out b/test_regress/t/t_class_vparam.out index 1816089b8..c5a35f922 100644 --- a/test_regress/t/t_class_vparam.out +++ b/test_regress/t/t_class_vparam.out @@ -1,7 +1,4 @@ %Error-UNSUPPORTED: t/t_class_vparam.v:13:40: Unsupported: parameterized packages 13 | pure virtual function void funcname(paramed_class_t #(CTYPE_t) v); | ^~~~~~~~~~~~~~~ -%Error: t/t_class_vparam.v:13:58: Parameter pin not found: '__paramNumber1' - 13 | pure virtual function void funcname(paramed_class_t #(CTYPE_t) v); - | ^~~~~~~ %Error: Exiting due to diff --git a/test_regress/t/t_param_type3.v b/test_regress/t/t_param_type3.v index d0fc19307..dca6bdc19 100644 --- a/test_regress/t/t_param_type3.v +++ b/test_regress/t/t_param_type3.v @@ -17,32 +17,42 @@ module t (/*AUTOARG*/ output T_t o; output T_t o2; - sub #(.T_t(T_t)) - sub (.i, .o); + sub1 #(.T_t(T_t), .CHECK(1)) + sub1 (.i, .o); - sub2 #(.T_t(T_t)) + sub2 #(.T_t(T_t), .CHECK(2)) sub2 (.i, .o(o2)); + sub1 #(T_t, 1) + sub1b (i, o); + + sub2 #(T_t, 2) + sub2b (i, o2); + endmodule -module sub (i,o); - parameter type T_t = logic; +module sub1 (i,o); + parameter type T_t = real; localparam type T2_t = T_t; + parameter int CHECK = 0; input T_t i; output T2_t o; assign o = i; + if (CHECK != 1) $error; endmodule module sub2 #( - parameter type T_t = logic, - localparam type T2_t = T_t + parameter type T_t = real, + localparam type T2_t = T_t, + parameter int CHECK = 0 ) ( input T_t i, output T_t o ); assign o = i; + if (CHECK != 2) $error; endmodule // Local Variables: