diff --git a/src/V3Width.cpp b/src/V3Width.cpp index efcae0483..2dfc4534e 100644 --- a/src/V3Width.cpp +++ b/src/V3Width.cpp @@ -5496,9 +5496,15 @@ private: VL_DO_DANGLING(nodep->deleteTree(), nodep); } else { userIterateChildren(nodep, WidthVP{SELF, BOTH}.p()); - if (nodep->edgeType().anEdge() && nodep->sensp()->dtypep()->skipRefp()->isDouble()) { - nodep->sensp()->v3error( - "Edge event control not legal on real type (IEEE 1800-2017 6.12.1)"); + if (nodep->edgeType().anEdge()) { + AstNodeDType* sensDtp = nodep->sensp()->dtypep()->skipRefp(); + if (sensDtp->isDouble()) { + nodep->sensp()->v3error( + "Edge event control not legal on real type (IEEE 1800-2017 6.12.1)"); + } else if (sensDtp->basicp() && !sensDtp->basicp()->keyword().isIntNumeric()) { + nodep->sensp()->v3error("Edge event control not legal on non-integral type " + "(IEEE 1800-2017 9.4.2)"); + } } } } diff --git a/test_regress/t/t_lint_edge_real_bad.out b/test_regress/t/t_lint_edge_real_bad.out index c3fbd266c..6932b75ea 100644 --- a/test_regress/t/t_lint_edge_real_bad.out +++ b/test_regress/t/t_lint_edge_real_bad.out @@ -1,5 +1,9 @@ -%Error: t/t_lint_edge_real_bad.v:16:22: Edge event control not legal on real type (IEEE 1800-2017 6.12.1) +%Error: t/t_lint_edge_real_bad.v:19:22: Edge event control not legal on real type (IEEE 1800-2017 6.12.1) : ... In instance t - 16 | always @ (posedge rbad) $stop; + 19 | always @ (posedge rbad) $stop; + | ^~~~ +%Error: t/t_lint_edge_real_bad.v:20:22: Edge event control not legal on non-integral type (IEEE 1800-2017 9.4.2) + : ... In instance t + 20 | always @ (posedge ebad) $stop; | ^~~~ %Error: Exiting due to diff --git a/test_regress/t/t_lint_edge_real_bad.v b/test_regress/t/t_lint_edge_real_bad.v index 58dfad8ad..4db3ae293 100644 --- a/test_regress/t/t_lint_edge_real_bad.v +++ b/test_regress/t/t_lint_edge_real_bad.v @@ -10,9 +10,13 @@ module t (/*AUTOARG*/ ); input real rbad; input real rok; + event ebad; + struct packed { int a; } sok; always @ (rok) $stop; + always @ (sok) $stop; always @ (posedge rbad) $stop; + always @ (posedge ebad) $stop; endmodule