Suppress unsupported for unused constant sequences

This commit is contained in:
Wilson Snyder 2025-12-03 21:23:48 -05:00
parent 4dedfbfe08
commit 7957701db8
12 changed files with 257 additions and 120 deletions

View File

@ -161,14 +161,15 @@ private:
void visit(AstModportClockingRef* const nodep) override {
// It has to be converted to a list of ModportClockingVarRefs,
// because clocking blocks are removed in this pass
for (AstClockingItem* itemp = nodep->clockingp()->itemsp(); itemp;
itemp = VN_AS(itemp->nextp(), ClockingItem)) {
AstVar* const varp = itemp->varp() ? itemp->varp() : VN_AS(itemp->user1p(), Var);
if (varp) {
AstModportVarRef* const modVarp
= new AstModportVarRef{nodep->fileline(), varp->name(), itemp->direction()};
modVarp->varp(varp);
nodep->addNextHere(modVarp);
for (AstNode* itemp = nodep->clockingp()->itemsp(); itemp; itemp = itemp->nextp()) {
if (AstClockingItem* citemp = VN_CAST(itemp, ClockingItem)) {
if (AstVar* const varp
= citemp->varp() ? citemp->varp() : VN_AS(citemp->user1p(), Var)) {
AstModportVarRef* const modVarp = new AstModportVarRef{
nodep->fileline(), varp->name(), citemp->direction()};
modVarp->varp(varp);
nodep->addNextHere(modVarp);
}
}
}
VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep);

View File

@ -765,15 +765,15 @@ class AstClocking final : public AstNode {
// Parents: MODULE
// Children: SENITEM, CLOCKING ITEMs, VARs
// @astgen op1 := sensesp : AstSenItem
// @astgen op2 := itemsp : List[AstClockingItem]
// @astgen op2 := itemsp : List[AstNode]
// @astgen op3 := eventp : Optional[AstVar]
std::string m_name; // Clocking block name
const bool m_isDefault; // True if default clocking
const bool m_isGlobal; // True if global clocking
public:
AstClocking(FileLine* fl, const std::string& name, AstSenItem* sensesp,
AstClockingItem* itemsp, bool isDefault, bool isGlobal)
AstClocking(FileLine* fl, const std::string& name, AstSenItem* sensesp, AstNode* itemsp,
bool isDefault, bool isGlobal)
: ASTGEN_SUPER_Clocking(fl)
, m_name{name}
, m_isDefault{isDefault}
@ -2347,6 +2347,22 @@ public:
}
string verilogKwd() const override { return "property"; }
};
class AstSequence final : public AstNodeFTask {
// A sequence inside a module
// TODO when supported might not want to be a NodeFTask
bool m_referenced = false; // Ever referenced (for unsupported check)
public:
AstSequence(FileLine* fl, const string& name, AstNode* stmtp)
: ASTGEN_SUPER_Sequence(fl, name, stmtp) {}
ASTGEN_MEMBERS_AstSequence;
bool hasDType() const override VL_MT_SAFE { return true; }
AstNodeFTask* cloneType(const string& name) override {
return new AstSequence{fileline(), name, nullptr};
}
string verilogKwd() const override { return "sequence"; }
bool isReferenced() const { return m_referenced; }
void isReferenced(bool flag) { m_referenced = flag; }
};
class AstTask final : public AstNodeFTask {
// A task inside a module
public:

View File

@ -931,28 +931,29 @@ class LinkParseVisitor final : public VNVisitor {
VL_RESTORER(m_defaultInSkewp);
VL_RESTORER(m_defaultOutSkewp);
// Find default input and output skews
AstClockingItem* nextItemp = nodep->itemsp();
for (AstClockingItem* itemp = nextItemp; itemp; itemp = nextItemp) {
nextItemp = VN_AS(itemp->nextp(), ClockingItem);
if (itemp->exprp() || itemp->assignp()) continue;
if (itemp->skewp()) {
if (itemp->direction() == VDirection::INPUT) {
// Disallow default redefinition; note some simulators allow this
if (m_defaultInSkewp) {
itemp->skewp()->v3error("Multiple default input skews not allowed");
for (AstNode *nextp, *itemp = nodep->itemsp(); itemp; itemp = nextp) {
nextp = itemp->nextp();
if (AstClockingItem* citemp = VN_CAST(itemp, ClockingItem)) {
if (citemp->exprp() || citemp->assignp()) continue;
if (citemp->skewp()) {
if (citemp->direction() == VDirection::INPUT) {
// Disallow default redefinition; note some simulators allow this
if (m_defaultInSkewp) {
citemp->skewp()->v3error("Multiple default input skews not allowed");
}
m_defaultInSkewp = citemp->skewp();
} else if (citemp->direction() == VDirection::OUTPUT) {
// Disallow default redefinition; note some simulators allow this
if (m_defaultOutSkewp) {
citemp->skewp()->v3error("Multiple default output skews not allowed");
}
m_defaultOutSkewp = citemp->skewp();
} else {
citemp->v3fatalSrc("Incorrect direction");
}
m_defaultInSkewp = itemp->skewp();
} else if (itemp->direction() == VDirection::OUTPUT) {
// Disallow default redefinition; note some simulators allow this
if (m_defaultOutSkewp) {
itemp->skewp()->v3error("Multiple default output skews not allowed");
}
m_defaultOutSkewp = itemp->skewp();
} else {
itemp->v3fatalSrc("Incorrect direction");
}
VL_DO_DANGLING(pushDeletep(citemp->unlinkFrBack()), citemp);
}
VL_DO_DANGLING(pushDeletep(itemp->unlinkFrBack()), itemp);
}
iterateChildren(nodep);
}

View File

@ -188,6 +188,10 @@ class LinkResolveVisitor final : public VNVisitor {
}
void visit(AstNodeFTaskRef* nodep) override {
VL_RESTORER(m_currentRandomizeSelectp);
if (nodep->taskp()) {
if (AstSequence* const seqp = VN_CAST(nodep->taskp(), Sequence))
seqp->isReferenced(true);
}
if (nodep->name() == "randomize") {
if (const AstMethodCall* const methodcallp = VN_CAST(nodep, MethodCall)) {

View File

@ -3469,10 +3469,12 @@ class WidthVisitor final : public VNVisitor {
AstVar* memberSelClocking(AstMemberSel* nodep, AstClocking* clockingp) {
// Returns node if ok
VSpellCheck speller;
for (AstClockingItem* itemp = clockingp->itemsp(); itemp;
itemp = VN_AS(itemp->nextp(), ClockingItem)) {
if (itemp->varp()->name() == nodep->name()) return itemp->varp();
speller.pushCandidate(itemp->varp()->prettyName());
for (AstNode* itemp = clockingp->itemsp(); itemp; itemp = itemp->nextp()) {
if (AstClockingItem* citemp = VN_CAST(itemp, ClockingItem)) {
if (citemp->varp()->name() == nodep->name()) return citemp->varp();
speller.pushCandidate(citemp->varp()->prettyName());
}
}
const string suggest = speller.bestCandidateMsg(nodep->prettyName());
nodep->v3error(
@ -6462,6 +6464,15 @@ class WidthVisitor final : public VNVisitor {
nodep->doingWidth(false);
}
void visit(AstReturn* nodep) override { nodep->v3fatalSrc("'return' missed in LinkJump"); }
void visit(AstSequence* nodep) override {
// UNSUPPORTED message is thrown only where the sequence is referenced
// in order to enable some UVM tests.
// When support more here will need finer-grained UNSUPPORTED if items
// under the sequence are not supported
if (nodep->isReferenced()) nodep->v3warn(E_UNSUPPORTED, "Unsupported: sequence");
userIterateChildren(nodep, nullptr);
if (!nodep->isReferenced()) VL_DO_DANGLING(nodep->unlinkFrBack()->deleteTree(), nodep);
}
AstPackage* getItemPackage(AstNode* pkgItemp) {
while (pkgItemp->backp() && pkgItemp->backp()->nextp() == pkgItemp) {

View File

@ -6127,17 +6127,17 @@ clocking_event<senItemp>: // IEEE: clocking_event
| '@' '(' event_expression ')' { $$ = $3; }
;
clocking_itemListE<clockingItemp>:
clocking_itemListE<nodep>:
/* empty */ { $$ = nullptr; }
| clocking_itemList { $$ = $1; }
;
clocking_itemList<clockingItemp>: // IEEE: [ clocking_item ]
clocking_itemList<nodep>: // IEEE: [ clocking_item ]
clocking_item { $$ = $1; }
| clocking_itemList clocking_item { if ($1) $$ = addNextNull($1, $2); }
;
clocking_item<clockingItemp>: // IEEE: clocking_item
clocking_item<nodep>: // IEEE: clocking_item
yDEFAULT yINPUT clocking_skew ';' { $$ = new AstClockingItem{$<fl>1, VDirection::INPUT, $3, nullptr}; }
| yDEFAULT yOUTPUT clocking_skew ';' { $$ = new AstClockingItem{$<fl>1, VDirection::OUTPUT, $3, nullptr}; }
| yDEFAULT yINPUT clocking_skew yOUTPUT clocking_skew ';'
@ -6154,8 +6154,16 @@ clocking_item<clockingItemp>: // IEEE: clocking_item
{ $$ = GRAMMARP->makeClockingItemList($<fl>1, VDirection::INPUT, nullptr, $2->cloneTree(true));
$$->addNext(GRAMMARP->makeClockingItemList($<fl>1, VDirection::OUTPUT, nullptr, $2)); }
| assertion_item_declaration
{ $$ = nullptr;
BBUNSUP($1, "Unsupported: assertion items in clocking blocks"); DEL($1); }
{ $$ = $1;
for (AstNode* nodep = $1; nodep; nodep = nodep->nextp()) {
if (!VN_IS(nodep, Sequence)) {
$$ = nullptr;
BBUNSUP(nodep, "Unsupported: assertion items in clocking blocks");
DEL($1);
break;
}
}
}
;
list_of_clocking_decl_assign<nodep>: // IEEE: list_of_clocking_decl_assign
@ -6395,13 +6403,16 @@ sequence_declaration<nodeFTaskp>: // ==IEEE: sequence_declaration
{ $$ = $1;
$$->addStmtsp($2);
$$->addStmtsp($4);
GRAMMARP->endLabel($<fl>6, $$, $6); }
GRAMMARP->endLabel($<fl>6, $$, $6);
// No error on UVM special case with no reference; see t_sequence_unused.v
if (! (!$$->stmtsp() || (VN_IS($$->stmtsp(), Const) && !$$->stmtsp()->nextp())))
$$->v3warn(E_UNSUPPORTED, "Unsupported: sequence");
}
;
sequence_declarationFront<nodeFTaskp>: // IEEE: part of sequence_declaration
ySEQUENCE idAny/*new_sequence*/
{ BBUNSUP($1, "Unsupported: sequence");
$$ = new AstProperty{$<fl>2, *$2, nullptr}; }
{ $$ = new AstSequence{$<fl>2, *$2, nullptr}; }
;
sequence_port_listE<nodep>: // IEEE: [ ( [ sequence_port_list ] ) ]

View File

@ -0,0 +1,6 @@
%Error-UNSUPPORTED: t/t_sequence_ref_unsup.v:9:12: Unsupported: sequence
: ... note: In instance 't'
9 | sequence s_one;
| ^~~~~
... For error description see https://verilator.org/warn/UNSUPPORTED?v=latest
%Error: Exiting due to

View File

@ -0,0 +1,16 @@
#!/usr/bin/env python3
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2024 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('vlt')
test.lint(expect_filename=test.golden_filename, verilator_flags2=['--timing'], fails=True)
test.passes()

View File

@ -0,0 +1,19 @@
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2023 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
module t;
sequence s_one;
1;
endsequence
initial begin
@s_one;
$display("got sequence");
$finish;
end
endmodule

View File

@ -1,175 +1,175 @@
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:27:4: Unsupported: sequence
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:27:13: Unsupported: sequence
27 | sequence s_a;
| ^~~~~~~~
| ^~~
... For error description see https://verilator.org/warn/UNSUPPORTED?v=latest
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:30:4: Unsupported: sequence
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:30:13: Unsupported: sequence
30 | sequence s_var;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:35:4: Unsupported: sequence
35 | sequence s_within;
| ^~~~~~~~
| ^~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:36:9: Unsupported: within (in sequence expression)
36 | a within(b);
| ^~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:39:4: Unsupported: sequence
39 | sequence s_and;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:35:13: Unsupported: sequence
35 | sequence s_within;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:40:9: Unsupported: and (in sequence expression)
40 | a and b;
| ^~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:43:4: Unsupported: sequence
43 | sequence s_or;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:39:13: Unsupported: sequence
39 | sequence s_and;
| ^~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:44:9: Unsupported: or (in sequence expression)
44 | a or b;
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:47:4: Unsupported: sequence
47 | sequence s_throughout;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:43:13: Unsupported: sequence
43 | sequence s_or;
| ^~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:48:9: Unsupported: throughout (in sequence expression)
48 | a throughout b;
| ^~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:51:4: Unsupported: sequence
51 | sequence s_intersect;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:47:13: Unsupported: sequence
47 | sequence s_throughout;
| ^~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:52:9: Unsupported: intersect (in sequence expression)
52 | a intersect b;
| ^~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:55:4: Unsupported: sequence
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:51:13: Unsupported: sequence
51 | sequence s_intersect;
| ^~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:55:13: Unsupported: sequence
55 | sequence s_uni_cycdelay_id;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:58:4: Unsupported: sequence
| ^~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:58:13: Unsupported: sequence
58 | sequence s_uni_cycdelay_pid;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:61:4: Unsupported: sequence
61 | sequence s_uni_cycdelay_range;
| ^~~~~~~~
| ^~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:62:7: Unsupported: ## range cycle delay range expression
62 | ## [1:2] b;
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:64:4: Unsupported: sequence
64 | sequence s_uni_cycdelay_star;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:61:13: Unsupported: sequence
61 | sequence s_uni_cycdelay_range;
| ^~~~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:65:7: Unsupported: ## [*] cycle delay range expression
65 | ## [*] b;
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:67:4: Unsupported: sequence
67 | sequence s_uni_cycdelay_plus;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:64:13: Unsupported: sequence
64 | sequence s_uni_cycdelay_star;
| ^~~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:68:7: Unsupported: ## [+] cycle delay range expression
68 | ## [+] b;
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:71:4: Unsupported: sequence
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:67:13: Unsupported: sequence
67 | sequence s_uni_cycdelay_plus;
| ^~~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:71:13: Unsupported: sequence
71 | sequence s_cycdelay_id;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:74:4: Unsupported: sequence
| ^~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:74:13: Unsupported: sequence
74 | sequence s_cycdelay_pid;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:77:4: Unsupported: sequence
77 | sequence s_cycdelay_range;
| ^~~~~~~~
| ^~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:78:9: Unsupported: ## range cycle delay range expression
78 | a ## [1:2] b;
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:80:4: Unsupported: sequence
80 | sequence s_cycdelay_star;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:77:13: Unsupported: sequence
77 | sequence s_cycdelay_range;
| ^~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:81:9: Unsupported: ## [*] cycle delay range expression
81 | a ## [*] b;
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:83:4: Unsupported: sequence
83 | sequence s_cycdelay_plus;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:80:13: Unsupported: sequence
80 | sequence s_cycdelay_star;
| ^~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:84:9: Unsupported: ## [+] cycle delay range expression
84 | a ## [+] b;
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:87:4: Unsupported: sequence
87 | sequence s_booleanabbrev_brastar_int;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:83:13: Unsupported: sequence
83 | sequence s_cycdelay_plus;
| ^~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:88:9: Unsupported: [*] boolean abbrev expression
88 | a [* 1 ];
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:88:12: Unsupported: boolean abbrev (in sequence expression)
88 | a [* 1 ];
| ^
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:90:4: Unsupported: sequence
90 | sequence s_booleanabbrev_brastar;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:87:13: Unsupported: sequence
87 | sequence s_booleanabbrev_brastar_int;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:91:9: Unsupported: [*] boolean abbrev expression
91 | a [*];
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:91:9: Unsupported: boolean abbrev (in sequence expression)
91 | a [*];
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:93:4: Unsupported: sequence
93 | sequence s_booleanabbrev_plus;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:90:13: Unsupported: sequence
90 | sequence s_booleanabbrev_brastar;
| ^~~~~~~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:94:9: Unsupported: [+] boolean abbrev expression
94 | a [+];
| ^~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:94:9: Unsupported: boolean abbrev (in sequence expression)
94 | a [+];
| ^~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:96:4: Unsupported: sequence
96 | sequence s_booleanabbrev_eq;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:93:13: Unsupported: sequence
93 | sequence s_booleanabbrev_plus;
| ^~~~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:97:9: Unsupported: [= boolean abbrev expression
97 | a [= 1];
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:97:12: Unsupported: boolean abbrev (in sequence expression)
97 | a [= 1];
| ^
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:99:4: Unsupported: sequence
99 | sequence s_booleanabbrev_eq_range;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:96:13: Unsupported: sequence
96 | sequence s_booleanabbrev_eq;
| ^~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:100:9: Unsupported: [= boolean abbrev expression
100 | a [= 1:2];
| ^~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:100:12: Unsupported: boolean abbrev (in sequence expression)
100 | a [= 1:2];
| ^
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:102:4: Unsupported: sequence
102 | sequence s_booleanabbrev_minusgt;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:99:13: Unsupported: sequence
99 | sequence s_booleanabbrev_eq_range;
| ^~~~~~~~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:103:9: Unsupported: [-> boolean abbrev expression
103 | a [-> 1];
| ^~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:103:13: Unsupported: boolean abbrev (in sequence expression)
103 | a [-> 1];
| ^
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:105:4: Unsupported: sequence
105 | sequence s_booleanabbrev_minusgt_range;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:102:13: Unsupported: sequence
102 | sequence s_booleanabbrev_minusgt;
| ^~~~~~~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:106:9: Unsupported: [-> boolean abbrev expression
106 | a [-> 1:2];
| ^~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:106:13: Unsupported: boolean abbrev (in sequence expression)
106 | a [-> 1:2];
| ^
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:109:4: Unsupported: sequence
109 | sequence p_arg_seqence(sequence inseq);
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:105:13: Unsupported: sequence
105 | sequence s_booleanabbrev_minusgt_range;
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:109:27: Unsupported: sequence argument data type
109 | sequence p_arg_seqence(sequence inseq);
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:113:4: Unsupported: sequence
113 | sequence s_firstmatch_a;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:109:13: Unsupported: sequence
109 | sequence p_arg_seqence(sequence inseq);
| ^~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:114:7: Unsupported: first_match (in sequence expression)
114 | first_match (a);
| ^~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:116:4: Unsupported: sequence
116 | sequence s_firstmatch_ab;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:113:13: Unsupported: sequence
113 | sequence s_firstmatch_a;
| ^~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:117:7: Unsupported: first_match (in sequence expression)
117 | first_match (a, res0 = 1);
| ^~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:119:4: Unsupported: sequence
119 | sequence s_firstmatch_abc;
| ^~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:116:13: Unsupported: sequence
116 | sequence s_firstmatch_ab;
| ^~~~~~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:120:7: Unsupported: first_match (in sequence expression)
120 | first_match (a, res0 = 1, res1 = 2);
| ^~~~~~~~~~~
%Error-UNSUPPORTED: t/t_sequence_sexpr_unsup.v:119:13: Unsupported: sequence
119 | sequence s_firstmatch_abc;
| ^~~~~~~~~~~~~~~~
%Warning-COVERIGN: t/t_sequence_sexpr_unsup.v:123:10: Ignoring unsupported: cover sequence
123 | cover sequence (s_a) $display("");
| ^~~~~~~~

View File

@ -0,0 +1,18 @@
#!/usr/bin/env python3
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 2025 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()

View File

@ -0,0 +1,34 @@
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed under the Creative Commons Public Domain, for
// any use, without warranty, 2025 by Wilson Snyder.
// SPDX-License-Identifier: CC0-1.0
interface apb_if (
input bit clk
);
wire [31:0] paddr;
wire [31:0] prdata;
clocking mck @(posedge clk);
output paddr;
input prdata;
// Some UVM tests declare this sequence but never use it
// so we defer UNSUPPORTED until usage point
sequence at_posedge;
1;
endsequence : at_posedge
endclocking
endinterface
module t (
input clk
);
apb_if ifc(clk);
initial $finish;
endmodule