Point always range bound errors at the offending bound

This commit is contained in:
Yilou Wang 2026-06-18 14:18:44 +02:00
parent 065a344bc5
commit 824fd80a93
3 changed files with 26 additions and 25 deletions

View File

@ -1567,34 +1567,35 @@ class WidthVisitor final : public VNVisitor {
// for a strong always shall be bounded"). Weak always [m:$] is legal:
// an unbounded upper bound imposes no end-of-trace obligation.
if (nodep->isStrong() && (loUnbounded || hiUnbounded)) {
nodep->v3error("s_always range must be bounded (IEEE 1800-2023 16.12.11)");
AstNode* const boundp = loUnbounded ? nodep->loBoundp() : nodep->hiBoundp();
boundp->v3error("s_always range must be bounded (IEEE 1800-2023 16.12.11)");
nodep->dtypeSetBit();
return;
}
if (loUnbounded) {
// Only the high bound may be $ (cycle_delay_const_range_expression).
nodep->v3error("always range low bound must be a constant expression"
" (IEEE 1800-2023 16.12.11)");
nodep->loBoundp()->v3error("always range low bound must be a constant expression"
" (IEEE 1800-2023 16.12.11)");
nodep->dtypeSetBit();
return;
}
const AstConst* const loConstp = VN_CAST(nodep->loBoundp(), Const);
const AstConst* const hiConstp = VN_CAST(nodep->hiBoundp(), Const);
if (!loConstp) {
nodep->v3error("always range low bound must be a constant expression"
" (IEEE 1800-2023 16.12.11)");
nodep->loBoundp()->v3error("always range low bound must be a constant expression"
" (IEEE 1800-2023 16.12.11)");
}
if (!hiUnbounded && !hiConstp) {
nodep->v3error("always range high bound must be a constant expression"
" (IEEE 1800-2023 16.12.11)");
nodep->hiBoundp()->v3error("always range high bound must be a constant expression"
" (IEEE 1800-2023 16.12.11)");
}
if (loConstp && loConstp->toSInt() < 0) {
nodep->v3error("always range low bound must be non-negative"
" (IEEE 1800-2023 16.12.11)");
nodep->loBoundp()->v3error("always range low bound must be non-negative"
" (IEEE 1800-2023 16.12.11)");
}
if (!hiUnbounded && loConstp && hiConstp && hiConstp->toSInt() < loConstp->toSInt()) {
nodep->v3error("always range high bound must be >= low bound"
" (IEEE 1800-2023 16.12.11)");
nodep->hiBoundp()->v3error("always range high bound must be >= low bound"
" (IEEE 1800-2023 16.12.11)");
}
bool hasPropertyOp = propp->isMultiCycleSva();
if (!hasPropertyOp) {

View File

@ -3,12 +3,12 @@
13 | assert property (@(posedge clk) s_always a);
| ^~~~~~~~
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
%Error: t/t_assert_always_unbounded_bad.v:14:35: s_always range must be bounded (IEEE 1800-2023 16.12.11)
%Error: t/t_assert_always_unbounded_bad.v:14:47: s_always range must be bounded (IEEE 1800-2023 16.12.11)
: ... note: In instance 't'
14 | assert property (@(posedge clk) s_always [2:$] a);
| ^~~~~~~~
%Error: t/t_assert_always_unbounded_bad.v:18:35: always range low bound must be a constant expression (IEEE 1800-2023 16.12.11)
| ^
%Error: t/t_assert_always_unbounded_bad.v:18:43: always range low bound must be a constant expression (IEEE 1800-2023 16.12.11)
: ... note: In instance 't'
18 | assert property (@(posedge clk) always [$:5] a);
| ^~~~~~
| ^
%Error: Exiting due to

View File

@ -1,34 +1,34 @@
%Error: t/t_prop_always_bad.v:13:20: always range low bound must be non-negative (IEEE 1800-2023 16.12.11)
%Error: t/t_prop_always_bad.v:13:28: always range low bound must be non-negative (IEEE 1800-2023 16.12.11)
: ... note: In instance 't'
13 | assert property (always [-1:3] a);
| ^~~~~~
| ^
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
%Error: t/t_prop_always_bad.v:14:20: always range high bound must be >= low bound (IEEE 1800-2023 16.12.11)
%Error: t/t_prop_always_bad.v:14:30: always range high bound must be >= low bound (IEEE 1800-2023 16.12.11)
: ... note: In instance 't'
14 | assert property (always [5:2] a);
| ^~~~~~
| ^
%Error: t/t_prop_always_bad.v:15:28: Expecting expression to be constant, but variable isn't const: 'x'
: ... note: In instance 't'
15 | assert property (always [x:3] a);
| ^
%Error: t/t_prop_always_bad.v:15:20: always range low bound must be a constant expression (IEEE 1800-2023 16.12.11)
%Error: t/t_prop_always_bad.v:15:28: always range low bound must be a constant expression (IEEE 1800-2023 16.12.11)
: ... note: In instance 't'
15 | assert property (always [x:3] a);
| ^~~~~~
| ^
%Error: t/t_prop_always_bad.v:16:30: Expecting expression to be constant, but variable isn't const: 'x'
: ... note: In instance 't'
16 | assert property (always [1:x] a);
| ^
%Error: t/t_prop_always_bad.v:16:20: always range high bound must be a constant expression (IEEE 1800-2023 16.12.11)
%Error: t/t_prop_always_bad.v:16:30: always range high bound must be a constant expression (IEEE 1800-2023 16.12.11)
: ... note: In instance 't'
16 | assert property (always [1:x] a);
| ^~~~~~
| ^
%Error: t/t_prop_always_bad.v:17:20: s_always range must be bounded (IEEE 1800-2023 16.12.11)
: ... note: In instance 't'
17 | assert property (s_always a);
| ^~~~~~~~
%Error: t/t_prop_always_bad.v:18:20: s_always range must be bounded (IEEE 1800-2023 16.12.11)
%Error: t/t_prop_always_bad.v:18:32: s_always range must be bounded (IEEE 1800-2023 16.12.11)
: ... note: In instance 't'
18 | assert property (s_always [1:$] a);
| ^~~~~~~~
| ^
%Error: Exiting due to