diff --git a/src/V3Clock.cpp b/src/V3Clock.cpp index e3315b35b..57eac4a6a 100644 --- a/src/V3Clock.cpp +++ b/src/V3Clock.cpp @@ -122,8 +122,15 @@ class ClockVisitor final : public VNVisitor { AstNodeExpr* const origp = nodep->origp()->unlinkFrBack(); AstNodeExpr* const changeWrp = nodep->changep()->unlinkFrBack(); AstNodeExpr* const changeRdp = ConvertWriteRefsToRead::main(changeWrp->cloneTree(false)); - AstIf* const newp - = new AstIf{nodep->fileline(), new AstXor{nodep->fileline(), origp, changeRdp}, incp}; + AstNodeExpr* comparedp = nullptr; + // Xor will optimize better than Eq, when CoverToggle has bit selects, + // but can only use Xor with non-opaque types + if (const AstBasicDType* const bdtypep + = VN_CAST(origp->dtypep()->skipRefp(), BasicDType)) { + if (!bdtypep->isOpaque()) comparedp = new AstXor{nodep->fileline(), origp, changeRdp}; + } + if (!comparedp) comparedp = AstEq::newTyped(nodep->fileline(), origp, changeRdp); + AstIf* const newp = new AstIf{nodep->fileline(), comparedp, incp}; // We could add another IF to detect posedges, and only increment if so. // It's another whole branch though versus a potential memory miss. // We'll go with the miss. diff --git a/test_regress/t/t_cover_toggle.out b/test_regress/t/t_cover_toggle.out index 3baf9007b..33fac7398 100644 --- a/test_regress/t/t_cover_toggle.out +++ b/test_regress/t/t_cover_toggle.out @@ -7,13 +7,12 @@ module t (/*AUTOARG*/ // Inputs - clk, - check_real, - check_string + clk, check_real, check_array_real, check_string ); 000019 input clk; input real check_real; // Check issue #2741 + 000021 input real check_array_real [1:0]; input string check_string; // Check issue #2766 typedef struct packed { diff --git a/test_regress/t/t_cover_toggle.v b/test_regress/t/t_cover_toggle.v index a6ed04bd4..d5bd2c9a9 100644 --- a/test_regress/t/t_cover_toggle.v +++ b/test_regress/t/t_cover_toggle.v @@ -6,13 +6,12 @@ module t (/*AUTOARG*/ // Inputs - clk, - check_real, - check_string + clk, check_real, check_array_real, check_string ); input clk; input real check_real; // Check issue #2741 + input real check_array_real [1:0]; input string check_string; // Check issue #2766 typedef struct packed { diff --git a/test_regress/t/t_cover_toggle_points.out b/test_regress/t/t_cover_toggle_points.out index 120ddeebd..7a7ed1e14 100644 --- a/test_regress/t/t_cover_toggle_points.out +++ b/test_regress/t/t_cover_toggle_points.out @@ -7,14 +7,15 @@ module t (/*AUTOARG*/ // Inputs - clk, - check_real, - check_string + clk, check_real, check_array_real, check_string ); 000019 input clk; +000019 point: comment=clk input real check_real; // Check issue #2741 + 000021 input real check_array_real [1:0]; ++000021 point: comment=check_array_real[0] ++000021 point: comment=check_array_real[1] input string check_string; // Check issue #2766 typedef struct packed {