From fbc814b54a6a7126a678a13bc7337ad2a4baf0aa Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Fri, 29 May 2020 19:35:54 -0400 Subject: [PATCH] Internal code coverage fixes --- nodist/code_coverage.dat | 2 +- src/V3Ast.cpp | 4 +- src/V3Localize.cpp | 3 +- src/V3Number.cpp | 25 --- src/V3Number.h | 1 - src/V3Order.cpp | 10 +- src/V3Os.cpp | 7 +- src/V3ParseImp.h | 1 - src/V3ParseLex.cpp | 3 - src/V3PreProc.h | 2 +- src/V3SymTable.h | 4 +- src/VlcBucket.h | 6 +- src/verilog.l | 3 - test_regress/t/t_display.out | 2 +- test_regress/t/t_display.v | 2 +- test_regress/t/t_final.v | 1 + test_regress/t/t_func_return_bad.out | 10 ++ test_regress/t/t_func_return_bad.pl | 19 ++ test_regress/t/t_func_return_bad.v | 14 ++ test_regress/t/t_lint_restore_prag_bad.out | 4 + test_regress/t/t_lint_restore_prag_bad.pl | 19 ++ test_regress/t/t_lint_restore_prag_bad.v | 12 ++ test_regress/t/t_math_equal.v | 4 + test_regress/t/t_vams_kwd_bad.out | 199 +++++++++++++++++++++ test_regress/t/t_vams_kwd_bad.pl | 20 +++ test_regress/t/t_vams_kwd_bad.v | 78 ++++++++ 26 files changed, 403 insertions(+), 52 deletions(-) create mode 100644 test_regress/t/t_func_return_bad.out create mode 100755 test_regress/t/t_func_return_bad.pl create mode 100644 test_regress/t/t_func_return_bad.v create mode 100644 test_regress/t/t_lint_restore_prag_bad.out create mode 100755 test_regress/t/t_lint_restore_prag_bad.pl create mode 100644 test_regress/t/t_lint_restore_prag_bad.v create mode 100644 test_regress/t/t_vams_kwd_bad.out create mode 100755 test_regress/t/t_vams_kwd_bad.pl create mode 100644 test_regress/t/t_vams_kwd_bad.v diff --git a/nodist/code_coverage.dat b/nodist/code_coverage.dat index c85cfa642..49d6535ec 100644 --- a/nodist/code_coverage.dat +++ b/nodist/code_coverage.dat @@ -42,6 +42,6 @@ remove_source("*examples/*"); # Would just be removed with remove_source in later step remove_gcda_regexp(qr!test_regress/.*/(Vt_|Vtop_).*\.gcda!); -exclude_line_regexp(qr/(\bv3fatalSrc\b|\bfatalSrc\b|\bVL_UNCOVERABLE\b|\bVL_FATAL|\bUASSERT\bERROR_RSVD_WORD\bV3ERROR_NA)/); +exclude_line_regexp(qr/(\bv3fatalSrc\b|\bfatalSrc\b|\bVL_UNCOVERABLE\b|\bVL_FATAL|\bUASSERT|\bERROR_RSVD_WORD\bV3ERROR_NA)/); 1; diff --git a/src/V3Ast.cpp b/src/V3Ast.cpp index 3ea28e9f2..5d8b231dd 100644 --- a/src/V3Ast.cpp +++ b/src/V3Ast.cpp @@ -1154,10 +1154,10 @@ string AstNode::locationStr() const { const AstNode* backp = this; int itmax = 10000; // Max iterations before giving up on location search while (backp) { - if (--itmax < 0) { + if (VL_UNCOVERABLE(--itmax < 0)) { // Likely some circular back link, and V3Ast is trying to report a low-level error UINFO(1, "Ran out of iterations finding locationStr on " << backp << endl); - return ""; + return ""; // LCOV_EXCL_LINE } const AstScope* scopep; if ((scopep = VN_CAST_CONST(backp, Scope))) { diff --git a/src/V3Localize.cpp b/src/V3Localize.cpp index 1ca733c6a..bf400cee3 100644 --- a/src/V3Localize.cpp +++ b/src/V3Localize.cpp @@ -192,7 +192,8 @@ private: virtual void visit(AstVarRef* nodep) VL_OVERRIDE { if (!VarFlags(nodep->varp()).m_notOpt) { if (!m_cfuncp) { // Not in function, can't optimize - clearOptimizable(nodep->varp(), "BVnofunc"); + // Perhaps impossible, but better safe + clearOptimizable(nodep->varp(), "BVnofunc"); // LCOV_EXCL_LINE } else { // If we're scoping down to it, it isn't really in the same block if (!nodep->hierThis()) clearOptimizable(nodep->varp(), "HierRef"); diff --git a/src/V3Number.cpp b/src/V3Number.cpp index d62e0297d..8f49ac4e4 100644 --- a/src/V3Number.cpp +++ b/src/V3Number.cpp @@ -2231,31 +2231,6 @@ V3Number& V3Number::opSelInto(const V3Number& lhs, int lsbval, int width) { return *this; } -V3Number& V3Number::opCond(const V3Number& lhs, const V3Number& if1s, const V3Number& if0s) { - NUM_ASSERT_OP_ARGS3(lhs, if1s, if0s); - NUM_ASSERT_LOGIC_ARGS1(lhs); - V3Number lhstrue(&lhs); - lhstrue.opRedOr(lhs); - if (lhstrue.bitIs0(0)) { - this->opAssign(if0s); - } else if (lhstrue.bitIs1(0)) { - this->opAssign(if1s); - } else { // select is "X/Z" - setZero(); - NUM_ASSERT_LOGIC_ARGS2(if1s, if0s); - for (int bit = 0; bit < this->width(); bit++) { - if (if0s.bitIs1(bit) && if1s.bitIs1(bit)) { - setBit(bit, 1); - } else if (if0s.bitIs0(bit) && if1s.bitIs0(bit)) { - setBit(bit, 0); - } else { - setBit(bit, 'x'); - } - } - } - return *this; -} - //====================================================================== // Ops - Floating point diff --git a/src/V3Number.h b/src/V3Number.h index 93563a117..9245b2dfd 100644 --- a/src/V3Number.h +++ b/src/V3Number.h @@ -334,7 +334,6 @@ public: V3Number& opSelInto(const V3Number& lhs, int lsbval, int width); V3Number& opToLowerN(const V3Number& lhs); V3Number& opToUpperN(const V3Number& lhs); - V3Number& opCond(const V3Number& lhs, const V3Number& if1s, const V3Number& if0s); V3Number& opCaseEq(const V3Number& lhs, const V3Number& rhs); V3Number& opCaseNeq(const V3Number& lhs, const V3Number& rhs); V3Number& opWildEq(const V3Number& lhs, const V3Number& rhs); diff --git a/src/V3Order.cpp b/src/V3Order.cpp index 52a6cf250..1b19b26dd 100644 --- a/src/V3Order.cpp +++ b/src/V3Order.cpp @@ -1532,14 +1532,16 @@ void OrderVisitor::processDomainsIterate(OrderEitherVertex* vertexp) { } else if (domainp != fromVertexp->domainp()) { // Make a domain that merges the two domains bool ddebug = debug() >= 9; - if (ddebug) { + + if (ddebug) { // LCOV_EXCL_START + cout << endl; UINFO(0, " conflicting domain " << fromVertexp << endl); UINFO(0, " dorig=" << domainp << endl); domainp->dumpTree(cout); UINFO(0, " d2 =" << fromVertexp->domainp() << endl); fromVertexp->domainp()->dumpTree(cout); - } + } // LCOV_EXCL_STOP AstSenTree* newtreep = domainp->cloneTree(false); AstNodeSenItem* newtree2p = fromVertexp->domainp()->sensesp()->cloneTree(true); UASSERT_OBJ(newtree2p, fromVertexp->domainp(), @@ -1549,13 +1551,13 @@ void OrderVisitor::processDomainsIterate(OrderEitherVertex* vertexp) { V3Const::constifyExpensiveEdit(newtreep); // Remove duplicates newtreep->multi(true); // Comment that it was made from 2 clock domains domainp = m_finder.getSenTree(domainp->fileline(), newtreep); - if (ddebug) { + if (ddebug) { // LCOV_EXCL_START UINFO(0, " dnew =" << newtreep << endl); newtreep->dumpTree(cout); UINFO(0, " find =" << domainp << endl); domainp->dumpTree(cout); cout << endl; - } + } // LCOV_EXCL_STOP VL_DO_DANGLING(newtreep->deleteTree(), newtreep); } } diff --git a/src/V3Os.cpp b/src/V3Os.cpp index 7321d6e3b..d32023339 100644 --- a/src/V3Os.cpp +++ b/src/V3Os.cpp @@ -341,9 +341,10 @@ void V3Os::u_sleep(int64_t usec) { int V3Os::system(const string& command) { UINFO(1, "Running system: " << command << endl); const int ret = ::system(command.c_str()); - if (ret == -1) { - v3fatal("Failed to execute command:" << command << " " << strerror(errno)); - return -1; + if (VL_UNCOVERABLE(ret == -1)) { + v3fatal("Failed to execute command:" // LCOV_EXCL_LINE + << command << " " << strerror(errno)); + return -1; // LCOV_EXCL_LINE } else { UASSERT(WIFEXITED(ret), "system(" << command << ") returned unexpected value of " << ret); const int exit_code = WEXITSTATUS(ret); diff --git a/src/V3ParseImp.h b/src/V3ParseImp.h index 975ddaebe..4a89eff8a 100644 --- a/src/V3ParseImp.h +++ b/src/V3ParseImp.h @@ -227,7 +227,6 @@ public: // Interactions with lexer void lexNew(); void lexDestroy(); - void statePop(); // Parser -> lexer communication static int stateVerilogRecent(); // Parser -> lexer communication int prevLexToken() { return m_prevLexToken; } // Parser -> lexer communication size_t flexPpInputToLex(char* buf, size_t max_size) { return ppInputToLex(buf, max_size); } diff --git a/src/V3ParseLex.cpp b/src/V3ParseLex.cpp index 7f5895d93..ac314f909 100644 --- a/src/V3ParseLex.cpp +++ b/src/V3ParseLex.cpp @@ -43,7 +43,6 @@ public: : V3LexerBase(NULL) {} ~V3Lexer() {} // METHODS - void statePop() { yy_pop_state(); } void unputString(const char* textp, size_t length) { // Add characters to input stream in back-to-front order const char* cp = textp; @@ -51,8 +50,6 @@ public: } }; -void V3ParseImp::statePop() { parsep()->m_lexerp->statePop(); } - void V3ParseImp::unputString(const char* textp, size_t length) { parsep()->m_lexerp->unputString(textp, length); } diff --git a/src/V3PreProc.h b/src/V3PreProc.h index 4bed3ae54..de2d02215 100644 --- a/src/V3PreProc.h +++ b/src/V3PreProc.h @@ -103,7 +103,7 @@ protected: public: static V3PreProc* createPreProc(FileLine* fl); - virtual ~V3PreProc() {} + virtual ~V3PreProc() {} // LCOV_EXCL_LINE // Persistent }; #endif // Guard diff --git a/src/V3SymTable.h b/src/V3SymTable.h index 7a2b54331..d5430ea39 100644 --- a/src/V3SymTable.h +++ b/src/V3SymTable.h @@ -74,8 +74,8 @@ public: if (m_symPrefix != "") os << " symPrefix=" << m_symPrefix; os << " n=" << nodep(); os << endl; - if (doneSymsr.find(this) != doneSymsr.end()) { - os << indent << "| ^ duplicate, so no children printed\n"; + if (VL_UNCOVERABLE(doneSymsr.find(this) != doneSymsr.end())) { + os << indent << "| ^ duplicate, so no children printed\n"; // LCOV_EXCL_LINE } else { doneSymsr.insert(this); for (IdNameMap::const_iterator it = m_idNameMap.begin(); it != m_idNameMap.end(); diff --git a/src/VlcBucket.h b/src/VlcBucket.h index 994c2e3d2..b486aa3af 100644 --- a/src/VlcBucket.h +++ b/src/VlcBucket.h @@ -41,10 +41,10 @@ private: m_dataSize *= 2; // UINFO(9, "Realloc "<(realloc(m_datap, allocSize())); - if (!newp) { + if (VL_UNCOVERABLE(!newp)) { // cppcheck-suppress doubleFree // cppcheck 1.90 bug - realloc doesn't free on fail - free(m_datap); - v3fatal("Out of memory increasing buckets"); + free(m_datap); // LCOV_EXCL_LINE + v3fatal("Out of memory increasing buckets"); // LCOV_EXCL_LINE } m_datap = newp; for (vluint64_t i = oldsize; i < m_dataSize; i += 64) m_datap[i / 64] = 0; diff --git a/src/verilog.l b/src/verilog.l index c60c3a2d1..1fb711f2f 100644 --- a/src/verilog.l +++ b/src/verilog.l @@ -49,9 +49,6 @@ extern void yyerrorf(const char* format, ...); yyerrorf("Unsupported: " language " reserved word not implemented: '%s'", yytext); \ FL_BRK; } while(0) -// See V3Read.cpp -//void V3ParseImp::statePop() { yy_pop_state(); } - //====================================================================== void yyerror(const char* errmsg) { diff --git a/test_regress/t/t_display.out b/test_regress/t/t_display.out index efbf48307..3825f5ad7 100644 --- a/test_regress/t/t_display.out +++ b/test_regress/t/t_display.out @@ -52,7 +52,7 @@ hello, from a concatenated string. hello, from a concatenated format string [0]. extra argument: 0 0 : pre argument after -[0] Embedded <#013> return +[0] Embedded tab ' ' and <#013> return [0] Embedded multiline '23 23 23' diff --git a/test_regress/t/t_display.v b/test_regress/t/t_display.v index 02e2e2a54..c13999c87 100644 --- a/test_regress/t/t_display.v +++ b/test_regress/t/t_display.v @@ -145,7 +145,7 @@ module t; $write("hel", "lo, fr", "om a concatenated format string [%0t].\n", $time); $display("extra argument: ", $time); $display($time,, ": pre argument",, "after"); - $write("[%0t] Embedded \r return\n", $time); + $write("[%0t] Embedded tab '\t' and \r return\n", $time); $display("[%0t] Embedded\ multiline", $time); diff --git a/test_regress/t/t_final.v b/test_regress/t/t_final.v index c3d4eb588..8d29e3e38 100644 --- a/test_regress/t/t_final.v +++ b/test_regress/t/t_final.v @@ -13,6 +13,7 @@ module submodule (); final begin $write("d"); end + final ; // Empty test endmodule module t (); diff --git a/test_regress/t/t_func_return_bad.out b/test_regress/t/t_func_return_bad.out new file mode 100644 index 000000000..952689dc5 --- /dev/null +++ b/test_regress/t/t_func_return_bad.out @@ -0,0 +1,10 @@ +%Error: t/t_func_return_bad.v:10:7: Return isn't underneath a task or function + 10 | return; + | ^~~~~~ +%Error: t/t_func_return_bad.v:11:7: continue isn't underneath a loop + 11 | continue; + | ^~~~~~~~ +%Error: t/t_func_return_bad.v:12:7: break isn't underneath a loop + 12 | break; + | ^~~~~ +%Error: Exiting due to diff --git a/test_regress/t/t_func_return_bad.pl b/test_regress/t/t_func_return_bad.pl new file mode 100755 index 000000000..0c0e3ac70 --- /dev/null +++ b/test_regress/t/t_func_return_bad.pl @@ -0,0 +1,19 @@ +#!/usr/bin/env perl +if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; } +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2011 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 + +scenarios(linter => 1); + +lint( + fails => 1, + expect_filename => $Self->{golden_filename}, + ); + +ok(1); +1; diff --git a/test_regress/t/t_func_return_bad.v b/test_regress/t/t_func_return_bad.v new file mode 100644 index 000000000..34cba2533 --- /dev/null +++ b/test_regress/t/t_func_return_bad.v @@ -0,0 +1,14 @@ +// DESCRIPTION: Verilator: Verilog Test module +// +// This file ONLY is placed under the Creative Commons Public Domain, for +// any use, without warranty, 2011 by Wilson Snyder. +// SPDX-License-Identifier: CC0-1.0 + +module t (/*AUTOARG*/); + + initial begin + return; // Not under function + continue; // Not under loop + break; // Not under loop + end +endmodule diff --git a/test_regress/t/t_lint_restore_prag_bad.out b/test_regress/t/t_lint_restore_prag_bad.out new file mode 100644 index 000000000..00ac14fc0 --- /dev/null +++ b/test_regress/t/t_lint_restore_prag_bad.out @@ -0,0 +1,4 @@ +%Error: t/t_lint_restore_prag_bad.v:10:4: /*verilator lint_restore*/ without matching save. + 10 | /*verilator lint_restore*/ + | ^~~~~~~~~~~~~~~~~~~~~~~~~~ +%Error: Exiting due to diff --git a/test_regress/t/t_lint_restore_prag_bad.pl b/test_regress/t/t_lint_restore_prag_bad.pl new file mode 100755 index 000000000..07964a1b5 --- /dev/null +++ b/test_regress/t/t_lint_restore_prag_bad.pl @@ -0,0 +1,19 @@ +#!/usr/bin/env perl +if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; } +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2003-2009 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 + +scenarios(vlt => 1); + +lint( + fails => 1, + expect_filename => $Self->{golden_filename}, + ); + +ok(1); +1; diff --git a/test_regress/t/t_lint_restore_prag_bad.v b/test_regress/t/t_lint_restore_prag_bad.v new file mode 100644 index 000000000..643b001d5 --- /dev/null +++ b/test_regress/t/t_lint_restore_prag_bad.v @@ -0,0 +1,12 @@ +// DESCRIPTION: Verilator: Verilog Test module +// +// This file ONLY is placed under the Creative Commons Public Domain, for +// any use, without warranty, 2007 by Wilson Snyder. +// SPDX-License-Identifier: CC0-1.0 + +module t (); + + // No matching save + // verilator lint_restore + +endmodule diff --git a/test_regress/t/t_math_equal.v b/test_regress/t/t_math_equal.v index d9afe52f5..7346c86c4 100644 --- a/test_regress/t/t_math_equal.v +++ b/test_regress/t/t_math_equal.v @@ -51,6 +51,10 @@ module t (/*AUTOARG*/ if (5'd10 != 5'D10) $stop; if (5'd10 != 5'H a) $stop; if (5'd10 != 5 'O 12) $stop; + if (24'h29cbb8 != 24'o12345670) $stop; + if (6'b111xxx !== 6'o7x) $stop; + if (6'b111??? !== 6'o7?) $stop; + if (6'b111zzz !== 6'o7z) $stop; // if (r_wide0 !== {32'haa111111,32'hbb222222,32'hcc333333,32'hdd444444}) $stop; if (r_wide1 !== {32'haa111111,32'hbb222222}) $stop; diff --git a/test_regress/t/t_vams_kwd_bad.out b/test_regress/t/t_vams_kwd_bad.out new file mode 100644 index 000000000..739550c49 --- /dev/null +++ b/test_regress/t/t_vams_kwd_bad.out @@ -0,0 +1,199 @@ +%Error: t/t_vams_kwd_bad.v:12:8: Unsupported: AMS reserved word not implemented: 'above' + 12 | int above; + | ^~~~~ +%Error: t/t_vams_kwd_bad.v:12:13: syntax error, unexpected ';', expecting IDENTIFIER + 12 | int above; + | ^ +%Error: t/t_vams_kwd_bad.v:13:8: Unsupported: AMS reserved word not implemented: 'abs' + 13 | int abs; + | ^~~ +%Error: t/t_vams_kwd_bad.v:14:8: Unsupported: AMS reserved word not implemented: 'absdelay' + 14 | int absdelay; + | ^~~~~~~~ +%Error: t/t_vams_kwd_bad.v:15:8: Unsupported: AMS reserved word not implemented: 'abstol' + 15 | int abstol; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:16:8: Unsupported: AMS reserved word not implemented: 'ac_stim' + 16 | int ac_stim; + | ^~~~~~~ +%Error: t/t_vams_kwd_bad.v:17:8: Unsupported: AMS reserved word not implemented: 'access' + 17 | int access; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:18:8: Unsupported: AMS reserved word not implemented: 'acos' + 18 | int acos; + | ^~~~ +%Error: t/t_vams_kwd_bad.v:19:8: Unsupported: AMS reserved word not implemented: 'acosh' + 19 | int acosh; + | ^~~~~ +%Error: t/t_vams_kwd_bad.v:20:8: Unsupported: AMS reserved word not implemented: 'aliasparam' + 20 | int aliasparam; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:21:8: Unsupported: AMS reserved word not implemented: 'analog' + 21 | int analog; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:22:8: Unsupported: AMS reserved word not implemented: 'analysis' + 22 | int analysis; + | ^~~~~~~~ +%Error: t/t_vams_kwd_bad.v:23:8: Unsupported: AMS reserved word not implemented: 'assert' + 23 | int assert; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:24:8: Unsupported: AMS reserved word not implemented: 'branch' + 24 | int branch; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:25:8: Unsupported: AMS reserved word not implemented: 'connect' + 25 | int connect; + | ^~~~~~~ +%Error: t/t_vams_kwd_bad.v:26:8: Unsupported: AMS reserved word not implemented: 'connectmodule' + 26 | int connectmodule; + | ^~~~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:27:8: Unsupported: AMS reserved word not implemented: 'connectrules' + 27 | int connectrules; + | ^~~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:28:8: Unsupported: AMS reserved word not implemented: 'continuous' + 28 | int continuous; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:29:8: Unsupported: AMS reserved word not implemented: 'cross' + 29 | int cross; + | ^~~~~ +%Error: t/t_vams_kwd_bad.v:30:8: Unsupported: AMS reserved word not implemented: 'ddt' + 30 | int ddt; + | ^~~ +%Error: t/t_vams_kwd_bad.v:31:8: Unsupported: AMS reserved word not implemented: 'ddt_nature' + 31 | int ddt_nature; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:32:8: Unsupported: AMS reserved word not implemented: 'ddx' + 32 | int ddx; + | ^~~ +%Error: t/t_vams_kwd_bad.v:33:8: Unsupported: AMS reserved word not implemented: 'discipline' + 33 | int discipline; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:34:8: Unsupported: AMS reserved word not implemented: 'discrete' + 34 | int discrete; + | ^~~~~~~~ +%Error: t/t_vams_kwd_bad.v:35:8: Unsupported: AMS reserved word not implemented: 'domain' + 35 | int domain; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:36:8: Unsupported: AMS reserved word not implemented: 'driver_update' + 36 | int driver_update; + | ^~~~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:37:8: Unsupported: AMS reserved word not implemented: 'endconnectrules' + 37 | int endconnectrules; + | ^~~~~~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:38:8: Unsupported: AMS reserved word not implemented: 'enddiscipline' + 38 | int enddiscipline; + | ^~~~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:39:8: Unsupported: AMS reserved word not implemented: 'endnature' + 39 | int endnature; + | ^~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:40:8: Unsupported: AMS reserved word not implemented: 'endparamset' + 40 | int endparamset; + | ^~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:41:8: Unsupported: AMS reserved word not implemented: 'exclude' + 41 | int exclude; + | ^~~~~~~ +%Error: t/t_vams_kwd_bad.v:42:8: Unsupported: AMS reserved word not implemented: 'final_step' + 42 | int final_step; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:43:8: Unsupported: AMS reserved word not implemented: 'flicker_noise' + 43 | int flicker_noise; + | ^~~~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:44:8: Unsupported: AMS reserved word not implemented: 'flow' + 44 | int flow; + | ^~~~ +%Error: t/t_vams_kwd_bad.v:45:8: Unsupported: AMS reserved word not implemented: 'from' + 45 | int from; + | ^~~~ +%Error: t/t_vams_kwd_bad.v:46:8: Unsupported: AMS reserved word not implemented: 'ground' + 46 | int ground; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:47:8: Unsupported: AMS reserved word not implemented: 'idt' + 47 | int idt; + | ^~~ +%Error: t/t_vams_kwd_bad.v:48:8: Unsupported: AMS reserved word not implemented: 'idt_nature' + 48 | int idt_nature; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:49:8: Unsupported: AMS reserved word not implemented: 'idtmod' + 49 | int idtmod; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:50:8: Unsupported: AMS reserved word not implemented: 'inf' + 50 | int inf; + | ^~~ +%Error: t/t_vams_kwd_bad.v:51:8: Unsupported: AMS reserved word not implemented: 'initial_step' + 51 | int initial_step; + | ^~~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:52:8: Unsupported: AMS reserved word not implemented: 'laplace_nd' + 52 | int laplace_nd; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:53:8: Unsupported: AMS reserved word not implemented: 'laplace_np' + 53 | int laplace_np; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:54:8: Unsupported: AMS reserved word not implemented: 'laplace_zd' + 54 | int laplace_zd; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:55:8: Unsupported: AMS reserved word not implemented: 'laplace_zp' + 55 | int laplace_zp; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:56:8: Unsupported: AMS reserved word not implemented: 'last_crossing' + 56 | int last_crossing; + | ^~~~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:57:8: Unsupported: AMS reserved word not implemented: 'limexp' + 57 | int limexp; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:58:8: Unsupported: AMS reserved word not implemented: 'max' + 58 | int max; + | ^~~ +%Error: t/t_vams_kwd_bad.v:59:8: Unsupported: AMS reserved word not implemented: 'merged' + 59 | int merged; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:60:8: Unsupported: AMS reserved word not implemented: 'min' + 60 | int min; + | ^~~ +%Error: t/t_vams_kwd_bad.v:61:8: Unsupported: AMS reserved word not implemented: 'nature' + 61 | int nature; + | ^~~~~~ +%Error: t/t_vams_kwd_bad.v:62:8: Unsupported: AMS reserved word not implemented: 'net_resolution' + 62 | int net_resolution; + | ^~~~~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:63:8: Unsupported: AMS reserved word not implemented: 'noise_table' + 63 | int noise_table; + | ^~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:64:8: Unsupported: AMS reserved word not implemented: 'paramset' + 64 | int paramset; + | ^~~~~~~~ +%Error: t/t_vams_kwd_bad.v:65:8: Unsupported: AMS reserved word not implemented: 'potential' + 65 | int potential; + | ^~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:66:8: Unsupported: AMS reserved word not implemented: 'resolveto' + 66 | int resolveto; + | ^~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:67:8: Unsupported: AMS reserved word not implemented: 'slew' + 67 | int slew; + | ^~~~ +%Error: t/t_vams_kwd_bad.v:68:8: Unsupported: AMS reserved word not implemented: 'split' + 68 | int split; + | ^~~~~ +%Error: t/t_vams_kwd_bad.v:69:8: Unsupported: AMS reserved word not implemented: 'timer' + 69 | int timer; + | ^~~~~ +%Error: t/t_vams_kwd_bad.v:70:8: Unsupported: AMS reserved word not implemented: 'transition' + 70 | int transition; + | ^~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:71:8: Unsupported: AMS reserved word not implemented: 'units' + 71 | int units; + | ^~~~~ +%Error: t/t_vams_kwd_bad.v:72:8: Unsupported: AMS reserved word not implemented: 'white_noise' + 72 | int white_noise; + | ^~~~~~~~~~~ +%Error: t/t_vams_kwd_bad.v:73:8: Unsupported: AMS reserved word not implemented: 'zi_nd' + 73 | int zi_nd; + | ^~~~~ +%Error: t/t_vams_kwd_bad.v:74:8: Unsupported: AMS reserved word not implemented: 'zi_np' + 74 | int zi_np; + | ^~~~~ +%Error: t/t_vams_kwd_bad.v:75:8: Unsupported: AMS reserved word not implemented: 'zi_zd' + 75 | int zi_zd; + | ^~~~~ +%Error: t/t_vams_kwd_bad.v:76:8: Unsupported: AMS reserved word not implemented: 'zi_zp' + 76 | int zi_zp; + | ^~~~~ +%Error: Exiting due to diff --git a/test_regress/t/t_vams_kwd_bad.pl b/test_regress/t/t_vams_kwd_bad.pl new file mode 100755 index 000000000..623dba016 --- /dev/null +++ b/test_regress/t/t_vams_kwd_bad.pl @@ -0,0 +1,20 @@ +#!/usr/bin/env perl +if (!$::Driver) { use FindBin; exec("$FindBin::Bin/bootstrap.pl", @ARGV, $0); die; } +# DESCRIPTION: Verilator: Verilog Test driver/expect definition +# +# Copyright 2019 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 + +scenarios(vlt => 1); + +lint( + fails => 1, + verilator_flags2 => ["--error-limit 1000"], + expect_filename => $Self->{golden_filename}, + ); + +ok(1); +1; diff --git a/test_regress/t/t_vams_kwd_bad.v b/test_regress/t/t_vams_kwd_bad.v new file mode 100644 index 000000000..822d68bd8 --- /dev/null +++ b/test_regress/t/t_vams_kwd_bad.v @@ -0,0 +1,78 @@ +// DESCRIPTION: Verilator: Verilog Test module +// +// This file ONLY is placed into the Public Domain, for any use, +// without warranty, 2019 by Driss Hafdi. +// SPDX-License-Identifier: CC0-1.0 + +`begin_keywords "VAMS-2.3" + +module t (/*AUTOARG*/); + + // Just get errors on bad keywords (for code coverage) + int above; + int abs; + int absdelay; + int abstol; + int ac_stim; + int access; + int acos; + int acosh; + int aliasparam; + int analog; + int analysis; + int assert; + int branch; + int connect; + int connectmodule; + int connectrules; + int continuous; + int cross; + int ddt; + int ddt_nature; + int ddx; + int discipline; + int discrete; + int domain; + int driver_update; + int endconnectrules; + int enddiscipline; + int endnature; + int endparamset; + int exclude; + int final_step; + int flicker_noise; + int flow; + int from; + int ground; + int idt; + int idt_nature; + int idtmod; + int inf; + int initial_step; + int laplace_nd; + int laplace_np; + int laplace_zd; + int laplace_zp; + int last_crossing; + int limexp; + int max; + int merged; + int min; + int nature; + int net_resolution; + int noise_table; + int paramset; + int potential; + int resolveto; + int slew; + int split; + int timer; + int transition; + int units; + int white_noise; + int zi_nd; + int zi_np; + int zi_zd; + int zi_zp; + +endmodule