Add verilator lint_save/lint_restore
git-svn-id: file://localhost/svn/verilator/trunk/verilator@912 77ca24e4-aefa-0310-84f0-b9a241c72d87
This commit is contained in:
parent
ea8445d187
commit
a216c1e7e4
3
Changes
3
Changes
|
|
@ -7,6 +7,9 @@ indicates the contributor was also the author of the fix; Thanks!
|
||||||
|
|
||||||
** Add --lint-only option.
|
** Add --lint-only option.
|
||||||
|
|
||||||
|
*** Add /*verilator lint_save*/ and /*verilator lint_restore*/ to allow
|
||||||
|
friendly control over re-enabling lint messages. [Gerald Williams]
|
||||||
|
|
||||||
*** Support SystemVerilog .name and .* interconnect.
|
*** Support SystemVerilog .name and .* interconnect.
|
||||||
|
|
||||||
*** Support while and do-while loops.
|
*** Support while and do-while loops.
|
||||||
|
|
|
||||||
|
|
@ -1152,6 +1152,26 @@ Disable the specified warning message for any warnings following the comment.
|
||||||
|
|
||||||
Re-enable the specified warning message for any warnings following the comment.
|
Re-enable the specified warning message for any warnings following the comment.
|
||||||
|
|
||||||
|
=item /*verilator lint_restore*/
|
||||||
|
|
||||||
|
After a /*verilator lint_save*/, pop the stack containing lint message
|
||||||
|
state. Often this is useful at the bottom of include files.
|
||||||
|
|
||||||
|
=item /*verilator lint_save*/
|
||||||
|
|
||||||
|
Push the current state of what lint messages are turned on or turned off to
|
||||||
|
a stack. Later meta-comments may then lint_on or lint_off specific
|
||||||
|
messages, then return to the earlier message state by using /*verilator
|
||||||
|
lint_restore*/. For example:
|
||||||
|
|
||||||
|
// verilator lint_save
|
||||||
|
// verilator lint_off SOME_WARNING
|
||||||
|
... // code needing SOME_WARNING turned off
|
||||||
|
// verilator lint_restore
|
||||||
|
|
||||||
|
If SOME_WARNING was on before the lint_off, it will now be restored to on,
|
||||||
|
and if it was off before the lint_off it will remain off.
|
||||||
|
|
||||||
=item /*verilator no_inline_task*/
|
=item /*verilator no_inline_task*/
|
||||||
|
|
||||||
Used in a function or task variable definition section to specify the
|
Used in a function or task variable definition section to specify the
|
||||||
|
|
|
||||||
|
|
@ -198,7 +198,8 @@ public:
|
||||||
void warnOff(V3ErrorCode code, bool flag) { m_warnOff.set(code,flag); } // Turn on/off warning messages on this line.
|
void warnOff(V3ErrorCode code, bool flag) { m_warnOff.set(code,flag); } // Turn on/off warning messages on this line.
|
||||||
bool warnOff(const string& code, bool flag); // Returns 1 if ok
|
bool warnOff(const string& code, bool flag); // Returns 1 if ok
|
||||||
bool warnIsOff(V3ErrorCode code);
|
bool warnIsOff(V3ErrorCode code);
|
||||||
void warnResetDefault() { m_warnOff=s_defaultFileLine.m_warnOff; }
|
void warnStateFrom(const FileLine& from) { m_warnOff=from.m_warnOff; }
|
||||||
|
void warnResetDefault() { warnStateFrom(s_defaultFileLine); }
|
||||||
|
|
||||||
void v3errorEnd(ostringstream& str);
|
void v3errorEnd(ostringstream& str);
|
||||||
inline bool operator==(FileLine rhs) { return (m_lineno==rhs.m_lineno && m_filename==rhs.m_filename); }
|
inline bool operator==(FileLine rhs) { return (m_lineno==rhs.m_lineno && m_filename==rhs.m_filename); }
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,7 @@ class V3Read {
|
||||||
int m_lastVerilogState; // Last LEX state in `begin_keywords
|
int m_lastVerilogState; // Last LEX state in `begin_keywords
|
||||||
deque<string*> m_stringps; // Created strings for later cleanup
|
deque<string*> m_stringps; // Created strings for later cleanup
|
||||||
deque<V3Number*> m_numberps; // Created numbers for later cleanup
|
deque<V3Number*> m_numberps; // Created numbers for later cleanup
|
||||||
|
deque<FileLine> m_lintState; // Current lint state for save/restore
|
||||||
//int debug() { return 9; }
|
//int debug() { return 9; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
@ -55,6 +56,8 @@ protected:
|
||||||
static void ppline (const char* text);
|
static void ppline (const char* text);
|
||||||
static void incLineno() { s_readp->fileline()->incLineno(); }
|
static void incLineno() { s_readp->fileline()->incLineno(); }
|
||||||
static void verilatorCmtLint(const char* text, bool on);
|
static void verilatorCmtLint(const char* text, bool on);
|
||||||
|
static void verilatorCmtLintSave();
|
||||||
|
static void verilatorCmtLintRestore();
|
||||||
static void verilatorCmtBad(const char* text);
|
static void verilatorCmtBad(const char* text);
|
||||||
static void pushBeginKeywords(int state) { s_readp->m_inBeginKwd++; s_readp->m_lastVerilogState=state; }
|
static void pushBeginKeywords(int state) { s_readp->m_inBeginKwd++; s_readp->m_lastVerilogState=state; }
|
||||||
static bool popBeginKeywords() { if (s_readp->m_inBeginKwd) { s_readp->m_inBeginKwd--; return true; } else return false; }
|
static bool popBeginKeywords() { if (s_readp->m_inBeginKwd) { s_readp->m_inBeginKwd--; return true; } else return false; }
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,19 @@ void V3Read::verilatorCmtLint(const char* textp, bool warnOff) {
|
||||||
yyerrorf("Unknown verilator lint message code: %s, in %s",msg.c_str(), textp);
|
yyerrorf("Unknown verilator lint message code: %s, in %s",msg.c_str(), textp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void V3Read::verilatorCmtLintSave() {
|
||||||
|
s_readp->m_lintState.push_back(*V3Read::fileline());
|
||||||
|
}
|
||||||
|
void V3Read::verilatorCmtLintRestore() {
|
||||||
|
if (s_readp->m_lintState.empty()) {
|
||||||
|
yyerror("/*verilator lint_restore*/ without matching save.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
V3Read::fileline()->warnStateFrom(s_readp->m_lintState.back());
|
||||||
|
s_readp->m_lintState.pop_back();
|
||||||
|
}
|
||||||
|
|
||||||
void V3Read::verilatorCmtBad(const char* textp) {
|
void V3Read::verilatorCmtBad(const char* textp) {
|
||||||
yyerrorf("Unknown verilator comment: %s",textp);
|
yyerrorf("Unknown verilator comment: %s",textp);
|
||||||
}
|
}
|
||||||
|
|
@ -515,6 +528,7 @@ escid \\[^ \t\f\r\n]+
|
||||||
"/*verilator coverage_block_off*/" {yylval.fileline = CRELINE(); return yVL_COVER_OFF;}
|
"/*verilator coverage_block_off*/" {yylval.fileline = CRELINE(); return yVL_COVER_OFF;}
|
||||||
"/*verilator full_case*/" {yylval.fileline = CRELINE(); return yVL_FULL_CASE;}
|
"/*verilator full_case*/" {yylval.fileline = CRELINE(); return yVL_FULL_CASE;}
|
||||||
"/*verilator inline_module*/" {yylval.fileline = CRELINE(); return yVL_INLINE_MODULE;}
|
"/*verilator inline_module*/" {yylval.fileline = CRELINE(); return yVL_INLINE_MODULE;}
|
||||||
|
"/*verilator isolate_assignments*/" {yylval.fileline = CRELINE(); return yVL_ISOLATE_ASSIGNMENTS;}
|
||||||
"/*verilator no_inline_module*/" {yylval.fileline = CRELINE(); return yVL_NO_INLINE_MODULE;}
|
"/*verilator no_inline_module*/" {yylval.fileline = CRELINE(); return yVL_NO_INLINE_MODULE;}
|
||||||
"/*verilator no_inline_task*/" {yylval.fileline = CRELINE(); return yVL_NO_INLINE_TASK;}
|
"/*verilator no_inline_task*/" {yylval.fileline = CRELINE(); return yVL_NO_INLINE_TASK;}
|
||||||
"/*verilator parallel_case*/" {yylval.fileline = CRELINE(); return yVL_PARALLEL_CASE;}
|
"/*verilator parallel_case*/" {yylval.fileline = CRELINE(); return yVL_PARALLEL_CASE;}
|
||||||
|
|
@ -522,12 +536,13 @@ escid \\[^ \t\f\r\n]+
|
||||||
"/*verilator public_flat*/" {yylval.fileline = CRELINE(); return yVL_PUBLIC_FLAT;}
|
"/*verilator public_flat*/" {yylval.fileline = CRELINE(); return yVL_PUBLIC_FLAT;}
|
||||||
"/*verilator public_module*/" {yylval.fileline = CRELINE(); return yVL_PUBLIC_MODULE;}
|
"/*verilator public_module*/" {yylval.fileline = CRELINE(); return yVL_PUBLIC_MODULE;}
|
||||||
"/*verilator sc_clock*/" {yylval.fileline = CRELINE(); return yVL_CLOCK;}
|
"/*verilator sc_clock*/" {yylval.fileline = CRELINE(); return yVL_CLOCK;}
|
||||||
"/*verilator isolate_assignments*/" {yylval.fileline = CRELINE(); return yVL_ISOLATE_ASSIGNMENTS;}
|
|
||||||
"/*verilator systemc_clock*/" {yylval.fileline = CRELINE(); return yVL_CLOCK;}
|
"/*verilator systemc_clock*/" {yylval.fileline = CRELINE(); return yVL_CLOCK;}
|
||||||
"/*verilator tracing_off*/" {yylval.fileline = CRELINE(); return yVL_TRACING_OFF;}
|
"/*verilator tracing_off*/" {yylval.fileline = CRELINE(); return yVL_TRACING_OFF;}
|
||||||
"/*verilator tracing_on*/" {yylval.fileline = CRELINE(); return yVL_TRACING_ON;}
|
"/*verilator tracing_on*/" {yylval.fileline = CRELINE(); return yVL_TRACING_ON;}
|
||||||
"/*verilator lint_off"[^*]*"*/" {V3Read::verilatorCmtLint(yytext, true); }
|
"/*verilator lint_off"[^*]*"*/" {V3Read::verilatorCmtLint(yytext, true); }
|
||||||
"/*verilator lint_on"[^*]*"*/" {V3Read::verilatorCmtLint(yytext, false); }
|
"/*verilator lint_on"[^*]*"*/" {V3Read::verilatorCmtLint(yytext, false); }
|
||||||
|
"/*verilator lint_restore*/" {V3Read::verilatorCmtLintRestore(); }
|
||||||
|
"/*verilator lint_save*/" {V3Read::verilatorCmtLintSave(); }
|
||||||
|
|
||||||
"/*"[^*]*"*/" {V3Read::verilatorCmtBad(yytext); }
|
"/*"[^*]*"*/" {V3Read::verilatorCmtBad(yytext); }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
if (!$::Driver) { use FindBin; exec("./driver.pl", @ARGV, $0); die; }
|
||||||
|
# $Id$
|
||||||
|
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||||
|
#
|
||||||
|
# Copyright 2003-2007 by Wilson Snyder. This program is free software; you can
|
||||||
|
# redistribute it and/or modify it under the terms of either the GNU
|
||||||
|
# General Public License or the Perl Artistic License.
|
||||||
|
|
||||||
|
compile (
|
||||||
|
v_flags2 => ["--lint-only"],
|
||||||
|
fails=>1,
|
||||||
|
expect=>
|
||||||
|
'.*%Warning-WIDTH: t/t_lint_restore_bad.v:\d+: Operator ASSIGN expects 5 bits on the Assign RHS, but Assign RHS\'s CONST generates 64 bits.
|
||||||
|
%Warning-WIDTH: Use .*
|
||||||
|
%Error: Exiting due to.*',
|
||||||
|
) if $Last_Self->{v3};
|
||||||
|
|
||||||
|
ok(1);
|
||||||
|
1;
|
||||||
|
|
@ -0,0 +1,23 @@
|
||||||
|
// $Id$
|
||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed into the Public Domain, for any use,
|
||||||
|
// without warranty, 2007 by Wilson Snyder.
|
||||||
|
|
||||||
|
module t ();
|
||||||
|
|
||||||
|
reg [3:0] four;
|
||||||
|
reg [4:0] five;
|
||||||
|
|
||||||
|
// verilator lint_save
|
||||||
|
|
||||||
|
// verilator lint_off WIDTH
|
||||||
|
initial four = 64'h1;
|
||||||
|
|
||||||
|
// verilator lint_restore
|
||||||
|
|
||||||
|
initial five = 64'h1;
|
||||||
|
|
||||||
|
initial $stop;
|
||||||
|
|
||||||
|
endmodule
|
||||||
Loading…
Reference in New Issue