diff --git a/src/V3LinkDot.cpp b/src/V3LinkDot.cpp index 07914fab5..6079f3b3d 100644 --- a/src/V3LinkDot.cpp +++ b/src/V3LinkDot.cpp @@ -2529,7 +2529,13 @@ class LinkDotIfaceVisitor final : public VNVisitor { void visit(AstModportVarRef* nodep) override { // IfaceVisitor:: UINFO(5, " fiv: " << nodep); iterateChildren(nodep); - VSymEnt* const symp = m_curSymp->findIdFallback(nodep->name()); + VSymEnt* symp = nullptr; + if (nodep->m_exp()) { + nodep->v3warn(E_UNSUPPORTED, + "Unsupported: Modport expressions (IEEE 1800-2023 25.5.4)"); + } else { + symp = m_curSymp->findIdFallback(nodep->name()); + } if (!symp) { nodep->v3error("Modport item not found: " << nodep->prettyNameQ()); } else if (AstVar* const varp = VN_CAST(symp->nodep(), Var)) { diff --git a/test_regress/t/t_interface_modport_expr.out b/test_regress/t/t_interface_modport_expr.out new file mode 100644 index 000000000..277926b00 --- /dev/null +++ b/test_regress/t/t_interface_modport_expr.out @@ -0,0 +1,39 @@ +%Error-UNSUPPORTED: t/t_interface_modport_expr.v:15:22: Unsupported: Modport expressions (IEEE 1800-2023 25.5.4) + 15 | modport mp1(input .a(sig_a), output .b(sig_b)); + | ^ + ... For error description see https://verilator.org/warn/UNSUPPORTED?v=latest +%Error: t/t_interface_modport_expr.v:15:22: Modport item not found: 'a' + 15 | modport mp1(input .a(sig_a), output .b(sig_b)); + | ^ + ... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance. +%Error-UNSUPPORTED: t/t_interface_modport_expr.v:15:40: Unsupported: Modport expressions (IEEE 1800-2023 25.5.4) + 15 | modport mp1(input .a(sig_a), output .b(sig_b)); + | ^ +%Error: t/t_interface_modport_expr.v:15:40: Modport item not found: 'b' + 15 | modport mp1(input .a(sig_a), output .b(sig_b)); + | ^ +%Error-UNSUPPORTED: t/t_interface_modport_expr.v:16:22: Unsupported: Modport expressions (IEEE 1800-2023 25.5.4) + 16 | modport mp2(input .a(sig_c), output .b(sig_d)); + | ^ +%Error: t/t_interface_modport_expr.v:16:22: Modport item not found: 'a' + 16 | modport mp2(input .a(sig_c), output .b(sig_d)); + | ^ +%Error-UNSUPPORTED: t/t_interface_modport_expr.v:16:40: Unsupported: Modport expressions (IEEE 1800-2023 25.5.4) + 16 | modport mp2(input .a(sig_c), output .b(sig_d)); + | ^ +%Error: t/t_interface_modport_expr.v:16:40: Modport item not found: 'b' + 16 | modport mp2(input .a(sig_c), output .b(sig_d)); + | ^ +%Error: t/t_interface_modport_expr.v:28:18: Can't find definition of 'a' in dotted variable/method: 'i.a' + 28 | assign i.b = i.a; + | ^ +%Error: t/t_interface_modport_expr.v:28:12: Can't find definition of 'b' in dotted variable/method: 'i.b' + 28 | assign i.b = i.a; + | ^ +%Error: t/t_interface_modport_expr.v:22:18: Can't find definition of 'a' in dotted variable/method: 'i.a' + 22 | assign i.b = i.a; + | ^ +%Error: t/t_interface_modport_expr.v:22:12: Can't find definition of 'b' in dotted variable/method: 'i.b' + 22 | assign i.b = i.a; + | ^ +%Error: Exiting due to diff --git a/test_regress/t/t_interface_modport_expr.py b/test_regress/t/t_interface_modport_expr.py index c6e56559a..3fada1a58 100755 --- a/test_regress/t/t_interface_modport_expr.py +++ b/test_regress/t/t_interface_modport_expr.py @@ -11,8 +11,10 @@ import vltest_bootstrap test.scenarios('simulator') -test.compile(verilator_flags2=["--binary"]) +test.compile(fails=test.vlt_all, expect_filename=test.golden_filename, + verilator_flags2=["--binary"]) -test.execute() +if not test.vlt_all: + test.execute() test.passes() diff --git a/test_regress/t/t_interface_modport_expr_partsel.out b/test_regress/t/t_interface_modport_expr_partsel.out new file mode 100644 index 000000000..deb4ee46c --- /dev/null +++ b/test_regress/t/t_interface_modport_expr_partsel.out @@ -0,0 +1,39 @@ +%Error-UNSUPPORTED: t/t_interface_modport_expr_partsel.v:16:22: Unsupported: Modport expressions (IEEE 1800-2023 25.5.4) + 16 | modport mp1(input .in(a[7:0]), output .out(b)); + | ^~ + ... For error description see https://verilator.org/warn/UNSUPPORTED?v=latest +%Error: t/t_interface_modport_expr_partsel.v:16:22: Modport item not found: 'in' + 16 | modport mp1(input .in(a[7:0]), output .out(b)); + | ^~ + ... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance. +%Error-UNSUPPORTED: t/t_interface_modport_expr_partsel.v:16:42: Unsupported: Modport expressions (IEEE 1800-2023 25.5.4) + 16 | modport mp1(input .in(a[7:0]), output .out(b)); + | ^~~ +%Error: t/t_interface_modport_expr_partsel.v:16:42: Modport item not found: 'out' + 16 | modport mp1(input .in(a[7:0]), output .out(b)); + | ^~~ +%Error-UNSUPPORTED: t/t_interface_modport_expr_partsel.v:17:22: Unsupported: Modport expressions (IEEE 1800-2023 25.5.4) + 17 | modport mp2(input .in(a[15:8]), output .out(c)); + | ^~ +%Error: t/t_interface_modport_expr_partsel.v:17:22: Modport item not found: 'in' + 17 | modport mp2(input .in(a[15:8]), output .out(c)); + | ^~ +%Error-UNSUPPORTED: t/t_interface_modport_expr_partsel.v:17:43: Unsupported: Modport expressions (IEEE 1800-2023 25.5.4) + 17 | modport mp2(input .in(a[15:8]), output .out(c)); + | ^~~ +%Error: t/t_interface_modport_expr_partsel.v:17:43: Modport item not found: 'out' + 17 | modport mp2(input .in(a[15:8]), output .out(c)); + | ^~~ +%Error: t/t_interface_modport_expr_partsel.v:29:21: Can't find definition of 'in' in dotted variable/method: 'i.in' + 29 | assign i.out = ~i.in; + | ^~ +%Error: t/t_interface_modport_expr_partsel.v:29:12: Can't find definition of 'out' in dotted variable/method: 'i.out' + 29 | assign i.out = ~i.in; + | ^~~ +%Error: t/t_interface_modport_expr_partsel.v:23:20: Can't find definition of 'in' in dotted variable/method: 'i.in' + 23 | assign i.out = i.in; + | ^~ +%Error: t/t_interface_modport_expr_partsel.v:23:12: Can't find definition of 'out' in dotted variable/method: 'i.out' + 23 | assign i.out = i.in; + | ^~~ +%Error: Exiting due to diff --git a/test_regress/t/t_interface_modport_expr_partsel.py b/test_regress/t/t_interface_modport_expr_partsel.py index c6e56559a..3fada1a58 100755 --- a/test_regress/t/t_interface_modport_expr_partsel.py +++ b/test_regress/t/t_interface_modport_expr_partsel.py @@ -11,8 +11,10 @@ import vltest_bootstrap test.scenarios('simulator') -test.compile(verilator_flags2=["--binary"]) +test.compile(fails=test.vlt_all, expect_filename=test.golden_filename, + verilator_flags2=["--binary"]) -test.execute() +if not test.vlt_all: + test.execute() test.passes()