The covergroup keyword fileline fix (using $<fl>1 instead of $<fl>2)
shifts error column from the name position to the 'covergroup' keyword.
Update the golden output for t_covergroup_in_class_duplicate_bad to match.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Two bugs in the covergroup -> AstClass transformation in V3LinkParse:
1. Infinite recursion: when a covergroup has a clocking event (e.g.
`@(posedge clk)`), visit(AstCovergroup*) embeds a sentinel
AstCovergroup node inside the new AstClass to carry the event for
V3Covergroup.cpp. The subsequent iterate(cgClassp) call then visits
the sentinel via visit(AstNodeModule*) -> iterateChildren -> which
hits visit(AstCovergroup*) again, creating another class with another
sentinel, infinitely.
Fix: skip transformation in visit(AstCovergroup*) when already inside
a covergroup class (m_modp->isCovergroup()), so sentinel nodes are
left alone.
2. Wrong fileline column: AstCovergroup was created with the fileline of
the identifier token ($<fl>2, the name position) rather than the
'covergroup' keyword token ($<fl>1). This caused warnings about the
covergroup to point to the name column instead of the keyword column.
Fix: use $<fl>1 (the 'covergroup' keyword fileline) when constructing
AstCovergroup in the parser.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
V3LinkParse's visit(AstCovergroup) creates std:: references and calls
setUsesStdPackage(). The previous removeStd() call happened before
V3LinkParse ran, so it deleted the std package before those references
were created, causing:
%Error: Package/class for ':: reference' not found: 'std'
Move removeStd() to immediately after V3LinkParse::linkParse() inside
process() so the std package is only pruned after all parse-time
transformations have had a chance to declare their std:: usage.
Fixes test failures:
- t_covergroup_option
- t_covergroup_with_sample_args_too_many_bad
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Allow reordering pure statements with DPI import calls iff no public
variables (including those read via a DPI export) are involved. This
ensures the DPI import can't observe the reordering
- Allow reordering of pure statements with AstDisplay and AstStop. This
requires an assumption that AstDisplay and AstStop will not read or
write model state other than via a VarRef explicitly present int the
Ast.
Overall this allows eliminating a lot of conditionals around assertions,
which were previously not possible.
Introduce new pass that converts impure expressions, or those with
function and method calls into simple assignment statements. Please see
the blurb at the top of the file why this is useful and how it works.
In particular currently it enables more Dfg optimization as functions
will be inlined without AstExprStmt.
Ideally we should enforce this lowering is applied to every procedural
statement (there are still a handful of exceptions). With that, long
term with this pass + #6820, there should be no need to ever use an
AstExprStmt past this new lowering pass, which should enable more easier
optimization down the line.
Also ideally this should be run earlier. Currently it's after V3Tristate
as that calls pinReconnectSimple so we don't have to touch Cell ports.
Currently disabled when code coverage is enabled due to #7119.
Three node deletions were accidentally dropped from the initial covergroup
commit as collateral damage:
- wait_order (no-stmt variant): restore DEL($3) for vrdList
- expect (no-stmt variant): restore DEL($3) for property_spec
- property_exprCaseIf yIF/yELSE: restore DEL($3) for condition expr
In all three cases $3 is an AstNode* that is not assigned to $$ and would
be leaked without the deletion.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Add v3Global.useCovergroup() flag (following the useRandSequence()
pattern) that is set to true when a covergroup_declaration is parsed.
Gate the V3Covergroup::covergroup() pass in Verilator.cpp on this flag
so the pass is skipped entirely for designs with no covergroups.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Two bugs fixed:
1. AstCReset: mark as ineligible for coverage expressions via
isExprCoverageEligible() override, preventing verilogForTree
from being called on CReset nodes (which has no V3EmitV handler).
2. generateCrossCode: when a cross references an unknown coverpoint,
don't delete the cross node early. The caller's cleanup loop
(in visit(AstClass*)) is responsible for deleting all coverpoints
and crosses. Early deletion left a dangling pointer in m_coverCrosses
causing a use-after-free segfault.
3. hasUnsupportedEvent path: added coverpoint/cross cleanup before
returning so AST nodes don't reach downstream passes (V3EmitCFunc,
V3MergeCond) which no longer have stub visitors for them.
All 60 covergroup tests now pass.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>