diff --git a/src/V3Coverage.cpp b/src/V3Coverage.cpp index 7f25d6b5b..c39e613f9 100644 --- a/src/V3Coverage.cpp +++ b/src/V3Coverage.cpp @@ -300,7 +300,9 @@ class CoverageVisitor final : public VNVisitor { void visit(AstLoop* nodep) override { UASSERT_OBJ(!nodep->contsp(), nodep, "'contsp' only used before LinkJump"); VL_RESTORER(m_state); + VL_RESTORER(m_exprStmtsp); VL_RESTORER(m_inToggleOff); + m_exprStmtsp = nodep; m_inToggleOff = true; createHandle(nodep); iterateAndNextNull(nodep->stmtsp()); diff --git a/test_regress/t/t_cover_expr.out b/test_regress/t/t_cover_expr.out index 9acf096c7..53fc1ef61 100644 --- a/test_regress/t/t_cover_expr.out +++ b/test_regress/t/t_cover_expr.out @@ -209,6 +209,12 @@ -000000 point: type=expr comment=(t2==0) => 0 hier=top.t end end + for (int loop_var_2 = 0; loop_var_2 < 32; loop_var_2 += 2) begin +~000131 if (cyc[loop_var_2] | cyc[loop_var_2 + 1]) $write(""); +-000006 point: type=expr comment=(cyc[(loop_var_2 + 32'sh1)[4:0]+:1]==1) => 1 hier=top.t ++000131 point: type=expr comment=(cyc[loop_var_2[4:0]+:1]==0 && cyc[(loop_var_2 + 32'sh1)[4:0]+:1]==0) => 0 hier=top.t +-000009 point: type=expr comment=(cyc[loop_var_2[4:0]+:1]==1) => 1 hier=top.t + end // stop at the first layer even if there's more to find %000007 if ((cyc[3+32'(t1&&t2)+:2] == cyc[5+32'(t3||t4)+:2]) || cyc[31]) $write(""); -000002 point: type=expr comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2])==0 && cyc[31]==0) => 0 hier=top.t @@ -295,8 +301,8 @@ %000001 while (ta || tb || tc) begin -000001 point: type=expr comment=(ta==0 && tb==0 && tc==0) => 0 hier=top.t -000000 point: type=expr comment=(ta==1) => 1 hier=top.t --000000 point: type=expr comment=(tb==1) => 1 hier=top.t --000000 point: type=expr comment=(tc==1) => 1 hier=top.t +-000001 point: type=expr comment=(tb==1) => 1 hier=top.t +-000001 point: type=expr comment=(tc==1) => 1 hier=top.t tc = tb; tb = ta; ta = '0; diff --git a/test_regress/t/t_cover_expr.v b/test_regress/t/t_cover_expr.v index ff5ecc410..d51e9ccee 100644 --- a/test_regress/t/t_cover_expr.v +++ b/test_regress/t/t_cover_expr.v @@ -86,6 +86,9 @@ module t ( if (cyc[loop_var] && t2) $write(""); end end + for (int loop_var_2 = 0; loop_var_2 < 32; loop_var_2 += 2) begin + if (cyc[loop_var_2] | cyc[loop_var_2 + 1]) $write(""); + end // stop at the first layer even if there's more to find if ((cyc[3+32'(t1&&t2)+:2] == cyc[5+32'(t3||t4)+:2]) || cyc[31]) $write(""); // impossible branches and redundant terms diff --git a/test_regress/t/t_cover_expr_max.out b/test_regress/t/t_cover_expr_max.out index c1faed6a8..974946ae5 100644 --- a/test_regress/t/t_cover_expr_max.out +++ b/test_regress/t/t_cover_expr_max.out @@ -209,6 +209,12 @@ -000000 point: type=expr comment=(t2==0) => 0 hier=top.t end end + for (int loop_var_2 = 0; loop_var_2 < 32; loop_var_2 += 2) begin +~000131 if (cyc[loop_var_2] | cyc[loop_var_2 + 1]) $write(""); +-000006 point: type=expr comment=(cyc[(loop_var_2 + 32'sh1)[4:0]+:1]==1) => 1 hier=top.t ++000131 point: type=expr comment=(cyc[loop_var_2[4:0]+:1]==0 && cyc[(loop_var_2 + 32'sh1)[4:0]+:1]==0) => 0 hier=top.t +-000009 point: type=expr comment=(cyc[loop_var_2[4:0]+:1]==1) => 1 hier=top.t + end // stop at the first layer even if there's more to find %000007 if ((cyc[3+32'(t1&&t2)+:2] == cyc[5+32'(t3||t4)+:2]) || cyc[31]) $write(""); -000002 point: type=expr comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2])==0 && cyc[31]==0) => 0 hier=top.t @@ -423,8 +429,8 @@ %000001 while (ta || tb || tc) begin -000001 point: type=expr comment=(ta==0 && tb==0 && tc==0) => 0 hier=top.t -000000 point: type=expr comment=(ta==1) => 1 hier=top.t --000000 point: type=expr comment=(tb==1) => 1 hier=top.t --000000 point: type=expr comment=(tc==1) => 1 hier=top.t +-000001 point: type=expr comment=(tb==1) => 1 hier=top.t +-000001 point: type=expr comment=(tc==1) => 1 hier=top.t tc = tb; tb = ta; ta = '0; diff --git a/test_regress/t/t_cover_expr_trace.out b/test_regress/t/t_cover_expr_trace.out index 9acf096c7..53fc1ef61 100644 --- a/test_regress/t/t_cover_expr_trace.out +++ b/test_regress/t/t_cover_expr_trace.out @@ -209,6 +209,12 @@ -000000 point: type=expr comment=(t2==0) => 0 hier=top.t end end + for (int loop_var_2 = 0; loop_var_2 < 32; loop_var_2 += 2) begin +~000131 if (cyc[loop_var_2] | cyc[loop_var_2 + 1]) $write(""); +-000006 point: type=expr comment=(cyc[(loop_var_2 + 32'sh1)[4:0]+:1]==1) => 1 hier=top.t ++000131 point: type=expr comment=(cyc[loop_var_2[4:0]+:1]==0 && cyc[(loop_var_2 + 32'sh1)[4:0]+:1]==0) => 0 hier=top.t +-000009 point: type=expr comment=(cyc[loop_var_2[4:0]+:1]==1) => 1 hier=top.t + end // stop at the first layer even if there's more to find %000007 if ((cyc[3+32'(t1&&t2)+:2] == cyc[5+32'(t3||t4)+:2]) || cyc[31]) $write(""); -000002 point: type=expr comment=((cyc[(32'sh3 + (t1 && t2))[4:0]+:2] == cyc[(32'sh5 + (t3 || t4))[4:0]+:2])==0 && cyc[31]==0) => 0 hier=top.t @@ -295,8 +301,8 @@ %000001 while (ta || tb || tc) begin -000001 point: type=expr comment=(ta==0 && tb==0 && tc==0) => 0 hier=top.t -000000 point: type=expr comment=(ta==1) => 1 hier=top.t --000000 point: type=expr comment=(tb==1) => 1 hier=top.t --000000 point: type=expr comment=(tc==1) => 1 hier=top.t +-000001 point: type=expr comment=(tb==1) => 1 hier=top.t +-000001 point: type=expr comment=(tc==1) => 1 hier=top.t tc = tb; tb = ta; ta = '0; diff --git a/test_regress/t/t_cover_line_expr.out b/test_regress/t/t_cover_line_expr.out index b74986880..59f60ceb8 100644 --- a/test_regress/t/t_cover_line_expr.out +++ b/test_regress/t/t_cover_line_expr.out @@ -285,6 +285,16 @@ -000000 point: type=branch comment=if hier=top.t end end +~000144 for (int loop_var_2 = 0; loop_var_2 < 32; loop_var_2 += 2) begin +-000009 point: type=line comment=block hier=top.t ++000144 point: type=line comment=block hier=top.t +~000131 if (cyc[loop_var_2] | cyc[loop_var_2 + 1]) $write(""); +-000006 point: type=expr comment=(cyc[(loop_var_2 + 32'sh1)[4:0]+:1]==1) => 1 hier=top.t ++000131 point: type=expr comment=(cyc[loop_var_2[4:0]+:1]==0 && cyc[(loop_var_2 + 32'sh1)[4:0]+:1]==0) => 0 hier=top.t +-000009 point: type=expr comment=(cyc[loop_var_2[4:0]+:1]==1) => 1 hier=top.t ++000013 point: type=branch comment=if hier=top.t ++000131 point: type=branch comment=else hier=top.t + end // stop at the first layer even if there's more to find %000007 if ((cyc[3+32'(t1&&t2)+:2] == cyc[5+32'(t3||t4)+:2]) || cyc[31]) $write(""); -000007 point: type=branch comment=if hier=top.t @@ -411,8 +421,8 @@ %000003 while (ta || tb || tc) begin -000001 point: type=expr comment=(ta==0 && tb==0 && tc==0) => 0 hier=top.t -000000 point: type=expr comment=(ta==1) => 1 hier=top.t --000000 point: type=expr comment=(tb==1) => 1 hier=top.t --000000 point: type=expr comment=(tc==1) => 1 hier=top.t +-000001 point: type=expr comment=(tb==1) => 1 hier=top.t +-000001 point: type=expr comment=(tc==1) => 1 hier=top.t -000003 point: type=line comment=block hier=top.t %000003 tc = tb; -000003 point: type=line comment=block hier=top.t