Fix false IMPLICITSTATIC on localparam (#6835)

This commit is contained in:
Geza Lore 2025-12-18 12:51:31 +00:00 committed by GitHub
parent 41937ecbe4
commit 04a7b31b84
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 23 additions and 12 deletions

View File

@ -323,6 +323,7 @@ class LinkParseVisitor final : public VNVisitor {
"loop converted to automatic");
} else if (nodep->valuep() && nodep->lifetime().isNone() && m_lifetime.isStatic()
&& !nodep->isIO()
&& !nodep->isParam()
// In task, or a procedure but not Initial/Final as executed only once
&& ((m_ftaskp && !m_ftaskp->lifetime().isStaticExplicit())
|| (m_procedurep && !VN_IS(m_procedurep, Initial)

View File

@ -5,27 +5,27 @@
| ^~~~~~~~~~~~~
... For warning description see https://verilator.org/warn/IMPLICITSTATIC?v=latest
... Use "/* verilator lint_off IMPLICITSTATIC */" and lint_on around source to disable this message.
%Warning-IMPLICITSTATIC: t/t_lint_implicitstatic_bad.v:19:16: Function/task's lifetime implicitly set to static
%Warning-IMPLICITSTATIC: t/t_lint_implicitstatic_bad.v:20:16: Function/task's lifetime implicitly set to static
: ... Suggest use 'function automatic' or 'function static'
19 | function int f_implicit_static();
20 | function int f_implicit_static();
| ^~~~~~~~~~~~~~~~~
t/t_lint_implicitstatic_bad.v:20:9: ... Location of implicit static variable
t/t_lint_implicitstatic_bad.v:21:9: ... Location of implicit static variable
: ... The initializer value will only be set once
20 | int cnt = 0;
21 | int cnt = 0;
| ^~~
%Warning-IMPLICITSTATIC: t/t_lint_implicitstatic_bad.v:24:8: Function/task's lifetime implicitly set to static
%Warning-IMPLICITSTATIC: t/t_lint_implicitstatic_bad.v:25:8: Function/task's lifetime implicitly set to static
: ... Suggest use 'task automatic' or 'task static'
24 | task f_implicit_static();
25 | task f_implicit_static();
| ^~~~~~~~~~~~~~~~~
t/t_lint_implicitstatic_bad.v:25:9: ... Location of implicit static variable
t/t_lint_implicitstatic_bad.v:26:9: ... Location of implicit static variable
: ... The initializer value will only be set once
25 | int cnt = 0;
26 | int cnt = 0;
| ^~~
%Error: t/t_lint_implicitstatic_bad.v:24:8: Unsupported in C: Task has the same name as function: 'f_implicit_static'
24 | task f_implicit_static();
%Error: t/t_lint_implicitstatic_bad.v:25:8: Unsupported in C: Task has the same name as function: 'f_implicit_static'
25 | task f_implicit_static();
| ^~~~~~~~~~~~~~~~~
t/t_lint_implicitstatic_bad.v:19:16: ... Location of original declaration
19 | function int f_implicit_static();
t/t_lint_implicitstatic_bad.v:20:16: ... Location of original declaration
20 | function int f_implicit_static();
| ^~~~~~~~~~~~~~~~~
... See the manual at https://verilator.org/verilator_doc.html?v=latest for more assistance.
%Error: Exiting due to

View File

@ -14,6 +14,7 @@ module t (
always @(posedge clk) begin
int implicit_warn = 1; // <--- Warning: IMPLICITSTATIC
localparam int NO_WARN = 2; // No warning here
end
function int f_implicit_static();
@ -26,4 +27,13 @@ module t (
++cnt;
endtask
function int f_no_implicit_static();
localparam int ONE = 1; // No warning here
return ONE;
endfunction
task t_no_implicit_static();
localparam TWO = 2; // No warning here
endtask
endmodule