Fix variables in class methods to be automatic (#4111) (#4137)

This commit is contained in:
Peter Monsson 2023-04-21 14:07:22 +02:00 committed by GitHub
parent 84a46939b3
commit 08330bad0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 77 additions and 2 deletions

View File

@ -231,6 +231,9 @@ private:
nodep->v3warn(STATICVAR, "Static variable with assignment declaration declared in a "
"loop converted to automatic");
}
if (m_ftaskp && m_ftaskp->classMethod() && nodep->lifetime().isNone()) {
nodep->lifetime(VLifetime::AUTOMATIC);
}
if (nodep->lifetime().isNone() && nodep->varType() != VVarType::PORT) {
nodep->lifetime(m_lifetime);
}

View File

@ -29,7 +29,7 @@ typedef cls_t cls2_t;
class Singleton #(type T=int);
static function Singleton#(T) self;
Singleton#(T) c = new;
static Singleton#(T) c = new;
return c;
endfunction
function int get_size;
@ -39,7 +39,7 @@ endclass
class SingletonUnusedDefault #(type T=int);
static function SingletonUnusedDefault#(T) self;
SingletonUnusedDefault#(T) c = new;
static SingletonUnusedDefault#(T) c = new;
return c;
endfunction
endclass

View File

@ -0,0 +1,21 @@
#!/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 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(simulator => 1);
compile(
);
execute(
check_finished => 1,
);
ok(1);
1;

View File

@ -0,0 +1,51 @@
// DESCRIPTION: Verilator: Simple static elaboration case
//
// This file ONLY is placed into the Public Domain, for any use,
// without warranty, 2015 by Todd Strader.
// SPDX-License-Identifier: CC0-1.0
class string_utils;
typedef string array_of_string[];
static function array_of_string split_by_dash(string s);
string parts[$];
int last_char_position = -1;
for (int i = 0; i < s.len(); i++) begin
if (i == s.len()-1) begin
parts.push_back(s.substr(last_char_position+1, i));
end
// Can't remove this, because then the code will work
if (string'(s[i]) == "-") begin
parts.push_back(s.substr(last_char_position+1, i-1));
last_char_position = i;
end
end // for (int i = 0; i < s.len(); i++)
return parts;
endfunction // split_by_dash
endclass // string_utils
class filter;
local static filter single_instance;
static function filter get();
if (single_instance == null)
single_instance = new();
return single_instance;
endfunction // get
local function new();
string parts[] = string_utils::split_by_dash("*");
if (parts.size() != 1)
$fatal(0, "Expected single element");
if (parts[0] != "*")
$fatal(0, "Expected element to be *");
endfunction // new
endclass // filter
module t (/*AUTOARG*/);
const filter _filter = filter::get();
initial begin
$write("*-* All Finished *-*\n");
$finish();
end
endmodule