Fix incomplete enum warnings
This commit is contained in:
parent
78a2dc0738
commit
a4f7aaed68
|
|
@ -284,6 +284,7 @@ class CaseVisitor final : public VNVisitor {
|
||||||
// Returns true iff the case items cover all enum values/patterns.
|
// Returns true iff the case items cover all enum values/patterns.
|
||||||
bool checkExhaustiveEnum(const AstCase* const nodep, const AstEnumDType* const enump) {
|
bool checkExhaustiveEnum(const AstCase* const nodep, const AstEnumDType* const enump) {
|
||||||
const uint32_t numCases = 1UL << nodep->exprp()->width();
|
const uint32_t numCases = 1UL << nodep->exprp()->width();
|
||||||
|
bool fullyCovered = true;
|
||||||
for (AstEnumItem* eip = enump->itemsp(); eip; eip = VN_AS(eip->nextp(), EnumItem)) {
|
for (AstEnumItem* eip = enump->itemsp(); eip; eip = VN_AS(eip->nextp(), EnumItem)) {
|
||||||
const auto& match = matchPattern(nodep, VN_AS(eip->valuep(), Const));
|
const auto& match = matchPattern(nodep, VN_AS(eip->valuep(), Const));
|
||||||
const uint32_t mask = match.first.toUInt();
|
const uint32_t mask = match.first.toUInt();
|
||||||
|
|
@ -298,11 +299,11 @@ class CaseVisitor final : public VNVisitor {
|
||||||
nodep->v3warn(CASEINCOMPLETE,
|
nodep->v3warn(CASEINCOMPLETE,
|
||||||
"Enum item " << eip->prettyNameQ() << " not covered by case");
|
"Enum item " << eip->prettyNameQ() << " not covered by case");
|
||||||
}
|
}
|
||||||
// TODO: warn for all uncovered enum values, not just the first
|
fullyCovered = false;
|
||||||
return false; // enum has uncovered value by case items
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true; // enum is fully covered
|
return fullyCovered; // enum is fully covered
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check and warn if case items are not complete over all possible values.
|
// Check and warn if case items are not complete over all possible values.
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import vltest_bootstrap
|
||||||
|
test.scenarios('linter')
|
||||||
|
test.lint(fails=True, expect_filename=test.golden_filename)
|
||||||
|
test.passes()
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
module test_bug;
|
||||||
|
// Define an enum with 4 states
|
||||||
|
typedef enum logic [1:0] {
|
||||||
|
STATE_IDLE = 2'd0,
|
||||||
|
STATE_READ = 2'd1,
|
||||||
|
STATE_WRITE = 2'd2,
|
||||||
|
STATE_ERROR = 2'd3
|
||||||
|
} system_state_t;
|
||||||
|
|
||||||
|
system_state_t current_state;
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
current_state = STATE_IDLE;
|
||||||
|
|
||||||
|
// We only cover IDLE and READ.
|
||||||
|
// We intentionally leave out WRITE and ERROR!
|
||||||
|
unique case (current_state)
|
||||||
|
STATE_IDLE: $display("Idling...");
|
||||||
|
STATE_READ: $display("Reading...");
|
||||||
|
endcase
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
Loading…
Reference in New Issue