Add error on misused genvar (#408).

This commit is contained in:
Wilson Snyder
2024-10-03 18:54:30 -04:00
parent 554653900a
commit 4bdfc653a3
7 changed files with 89 additions and 72 deletions
+9
View File
@@ -50,6 +50,7 @@ class LinkResolveVisitor final : public VNVisitor {
AstNodeFTask* m_ftaskp = nullptr; // Function or task we're inside
AstNodeCoverOrAssert* m_assertp = nullptr; // Current assertion
int m_senitemCvtNum = 0; // Temporary signal counter
bool m_underGenFor = false; // Under GenFor
bool m_underGenerate = false; // Under GenFor/GenIf
// VISITs
@@ -105,6 +106,12 @@ class LinkResolveVisitor final : public VNVisitor {
void visit(AstNodeVarRef* nodep) override {
// VarRef: Resolve its reference
if (nodep->varp()) nodep->varp()->usedParam(true);
// TODO should look for where genvar is valid, but for now catch
// just gross errors of using genvar outside any generate
if (nodep->varp() && nodep->varp()->isGenVar() && !m_underGenFor) {
nodep->v3error("Genvar " << nodep->prettyNameQ()
<< " used outside generate for loop (IEEE 1800-2024 27.4)");
}
iterateChildren(nodep);
}
@@ -450,7 +457,9 @@ class LinkResolveVisitor final : public VNVisitor {
// We keep Modport's themselves around for XML dump purposes
void visit(AstGenFor* nodep) override {
VL_RESTORER(m_underGenFor);
VL_RESTORER(m_underGenerate);
m_underGenFor = true;
m_underGenerate = true;
iterateChildren(nodep);
}