parent
50b6954cfc
commit
3a080ef543
|
|
@ -234,7 +234,7 @@ class AstNodeUOrStructDType VL_NOT_FINAL : public AstNodeDType {
|
||||||
string m_name; // Name from upper typedef, if any
|
string m_name; // Name from upper typedef, if any
|
||||||
const int m_uniqueNum;
|
const int m_uniqueNum;
|
||||||
bool m_packed;
|
bool m_packed;
|
||||||
bool m_isFourstate = false; // V3Width computes
|
bool m_isFourstate = false; // V3Width computes; true if any member is 4-state
|
||||||
bool m_constrainedRand = false; // True if struct has constraint expression
|
bool m_constrainedRand = false; // True if struct has constraint expression
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
|
|
@ -1871,9 +1871,11 @@ class LinkDotFindVisitor final : public VNVisitor {
|
||||||
nextp = argp->nextp();
|
nextp = argp->nextp();
|
||||||
AstVar* argrefp = nullptr;
|
AstVar* argrefp = nullptr;
|
||||||
if (AstParseRef* const parserefp = VN_CAST(argp, ParseRef)) {
|
if (AstParseRef* const parserefp = VN_CAST(argp, ParseRef)) {
|
||||||
// We use an int type, this might get changed in V3Width when types resolve
|
// IEEE 1800-2023 12.7.3: foreach loop variable type shall be int (2-state)
|
||||||
|
// This might get changed in V3Width when types resolve (e.g., for assoc
|
||||||
|
// arrays)
|
||||||
argrefp = new AstVar{parserefp->fileline(), VVarType::BLOCKTEMP,
|
argrefp = new AstVar{parserefp->fileline(), VVarType::BLOCKTEMP,
|
||||||
parserefp->name(), argp->findSigned32DType()};
|
parserefp->name(), argp->findIntDType()};
|
||||||
argrefp->lifetime(VLifetime::AUTOMATIC_EXPLICIT);
|
argrefp->lifetime(VLifetime::AUTOMATIC_EXPLICIT);
|
||||||
parserefp->replaceWith(argrefp);
|
parserefp->replaceWith(argrefp);
|
||||||
VL_DO_DANGLING2(parserefp->deleteTree(), parserefp, argp);
|
VL_DO_DANGLING2(parserefp->deleteTree(), parserefp, argp);
|
||||||
|
|
|
||||||
|
|
@ -5761,6 +5761,34 @@ class WidthVisitor final : public VNVisitor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IEEE 1800-2023 7.6: For unpacked arrays to be assignment compatible,
|
||||||
|
// the element types shall be equivalent (IEEE 1800-2023 6.22.2).
|
||||||
|
// Check specifically for 2-state vs 4-state mismatch for unpacked array
|
||||||
|
// to unpacked array assignments, as this is a common IEEE compliance issue.
|
||||||
|
// Note: Streaming operators and string literals have implicit conversion rules.
|
||||||
|
if (nodep->rhsp()->dtypep()) { // May be null on earlier errors
|
||||||
|
const AstNodeDType* const lhsDtp = lhsDTypep->skipRefp();
|
||||||
|
const AstNodeDType* const rhsDtp = nodep->rhsp()->dtypep()->skipRefp();
|
||||||
|
// Only check unpacked array to unpacked array assignments
|
||||||
|
const bool lhsIsUnpackArray
|
||||||
|
= VN_IS(lhsDtp, UnpackArrayDType) || VN_IS(lhsDtp, DynArrayDType)
|
||||||
|
|| VN_IS(lhsDtp, QueueDType) || VN_IS(lhsDtp, AssocArrayDType);
|
||||||
|
const bool rhsIsUnpackArray
|
||||||
|
= VN_IS(rhsDtp, UnpackArrayDType) || VN_IS(rhsDtp, DynArrayDType)
|
||||||
|
|| VN_IS(rhsDtp, QueueDType) || VN_IS(rhsDtp, AssocArrayDType);
|
||||||
|
if (lhsIsUnpackArray && rhsIsUnpackArray) {
|
||||||
|
if (lhsDtp->isFourstate() != rhsDtp->isFourstate()) {
|
||||||
|
nodep->v3error(
|
||||||
|
"Assignment between 2-state and 4-state types requires "
|
||||||
|
"equivalent element types (IEEE 1800-2023 6.22.2, 7.6)\n"
|
||||||
|
<< nodep->warnMore() << "... LHS type: " << lhsDtp->prettyDTypeNameQ()
|
||||||
|
<< (lhsDtp->isFourstate() ? " (4-state)" : " (2-state)") << "\n"
|
||||||
|
<< nodep->warnMore() << "... RHS type: " << rhsDtp->prettyDTypeNameQ()
|
||||||
|
<< (rhsDtp->isFourstate() ? " (4-state)" : " (2-state)"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iterateCheckAssign(nodep, "Assign RHS", nodep->rhsp(), FINAL, lhsDTypep);
|
iterateCheckAssign(nodep, "Assign RHS", nodep->rhsp(), FINAL, lhsDTypep);
|
||||||
// UINFOTREE(1, nodep, "", "AssignOut");
|
// UINFOTREE(1, nodep, "", "AssignOut");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||||
|
#
|
||||||
|
# Copyright 2026 by Wilson Snyder. This program is free software; you
|
||||||
|
# can redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||||
|
|
||||||
|
import vltest_bootstrap
|
||||||
|
|
||||||
|
test.scenarios('simulator')
|
||||||
|
|
||||||
|
test.compile()
|
||||||
|
|
||||||
|
test.execute()
|
||||||
|
|
||||||
|
test.passes()
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
// DESCRIPTION: Test for IEEE 1800-2023 6.22.2 - valid array assignments with matching state types
|
||||||
|
//
|
||||||
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||||
|
// any use, without warranty, 2026 by Wilson Snyder.
|
||||||
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
|
module t;
|
||||||
|
// 2-state arrays - assignment should work
|
||||||
|
bit [7:0] arr_2state_a [3:0];
|
||||||
|
bit [7:0] arr_2state_b [3:0];
|
||||||
|
|
||||||
|
// 4-state arrays - assignment should work
|
||||||
|
logic [7:0] arr_4state_a [3:0];
|
||||||
|
logic [7:0] arr_4state_b [3:0];
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
// Initialize
|
||||||
|
arr_2state_a[0] = 8'h10;
|
||||||
|
arr_2state_a[1] = 8'h20;
|
||||||
|
arr_2state_a[2] = 8'h30;
|
||||||
|
arr_2state_a[3] = 8'h40;
|
||||||
|
|
||||||
|
arr_4state_a[0] = 8'hA0;
|
||||||
|
arr_4state_a[1] = 8'hB0;
|
||||||
|
arr_4state_a[2] = 8'hC0;
|
||||||
|
arr_4state_a[3] = 8'hD0;
|
||||||
|
|
||||||
|
// Valid assignments: same state types
|
||||||
|
arr_2state_b = arr_2state_a; // 2-state to 2-state: OK
|
||||||
|
arr_4state_b = arr_4state_a; // 4-state to 4-state: OK
|
||||||
|
|
||||||
|
// Verify
|
||||||
|
if (arr_2state_b[0] !== 8'h10) $stop;
|
||||||
|
if (arr_2state_b[3] !== 8'h40) $stop;
|
||||||
|
if (arr_4state_b[0] !== 8'hA0) $stop;
|
||||||
|
if (arr_4state_b[3] !== 8'hD0) $stop;
|
||||||
|
|
||||||
|
$write("*-* All Coverage *-*\n");
|
||||||
|
$finish;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
%Error: t/t_fourstate_assign_bad.v:23:18: Assignment between 2-state and 4-state types requires equivalent element types (IEEE 1800-2023 6.22.2, 7.6)
|
||||||
|
: ... note: In instance 't'
|
||||||
|
: ... LHS type: 'bit[7:0]$[3:0]' (2-state)
|
||||||
|
: ... RHS type: 'logic[7:0]$[3:0]' (4-state)
|
||||||
|
23 | arr_2state = arr_4state;
|
||||||
|
| ^
|
||||||
|
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
|
||||||
|
%Error: Exiting due to
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||||
|
#
|
||||||
|
# Copyright 2026 by Wilson Snyder. This program is free software; you
|
||||||
|
# can redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# Lesser General Public License Version 3 or the Perl Artistic License
|
||||||
|
# Version 2.0.
|
||||||
|
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||||
|
|
||||||
|
import vltest_bootstrap
|
||||||
|
|
||||||
|
test.scenarios('linter')
|
||||||
|
|
||||||
|
test.lint(fails=True, expect_filename=test.golden_filename)
|
||||||
|
|
||||||
|
test.passes()
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
// DESCRIPTION: Test for IEEE 1800-2023 6.22.2 - 4-state to 2-state type equivalence
|
||||||
|
// This should produce a type error because bit and logic are not equivalent types
|
||||||
|
//
|
||||||
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||||
|
// any use, without warranty, 2026 by Wilson Snyder.
|
||||||
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
|
module t;
|
||||||
|
// IEEE 6.22.2: Packed arrays are equivalent if they contain the same number
|
||||||
|
// of total bits, are either all 2-state or all 4-state, and are either all
|
||||||
|
// signed or all unsigned.
|
||||||
|
|
||||||
|
// 2-state array
|
||||||
|
bit [7:0] arr_2state [3:0];
|
||||||
|
|
||||||
|
// 4-state array (should not be assignment compatible for unpacked arrays)
|
||||||
|
logic [7:0] arr_4state [3:0];
|
||||||
|
|
||||||
|
initial begin
|
||||||
|
// Per IEEE 7.6: For unpacked arrays to be assignment compatible,
|
||||||
|
// the element types shall be equivalent.
|
||||||
|
// bit[7:0] and logic[7:0] are NOT equivalent (one is 2-state, one is 4-state)
|
||||||
|
arr_2state = arr_4state;
|
||||||
|
$write("*-* All Coverage *-*\n");
|
||||||
|
$stop;
|
||||||
|
end
|
||||||
|
endmodule
|
||||||
Loading…
Reference in New Issue