Fix parameter function string returns, bug1441.

This commit is contained in:
Wilson Snyder 2019-05-16 21:15:02 -04:00
parent 13ecb8e177
commit d841e68f4f
6 changed files with 57 additions and 4 deletions

View File

@ -14,6 +14,8 @@ The contributors that suggested a given feature are shown in []. Thanks!
**** Fix fault on $realtime with %t, bug1443. [Julien Margetts]
**** Fix parameter function string returns, bug1441. [Denis Rystsov]
* Verilator 4.014 2019-05-08

View File

@ -1674,8 +1674,12 @@ V3Number& V3Number::opBufIf1(const V3Number& ens, const V3Number& if1s) {
V3Number& V3Number::opAssign(const V3Number& lhs) {
// Note may be a width change during the assign
setZero();
for(int bit=0; bit<this->width(); bit++) {
setBit(bit,lhs.bitIs(bit));
if (isString()) {
m_stringVal = lhs.m_stringVal;
} else {
for (int bit=0; bit < this->width(); bit++) {
setBit(bit, lhs.bitIs(bit));
}
}
return *this;
}

View File

@ -220,8 +220,9 @@ private:
nump = new V3Number(nodep, nodep->width(), value);
m_numAllps.push_back(nump);
}
nump->isDouble(nodep->isDouble());
return nump;
nump->isDouble(nodep->isDouble());
nump->isString(nodep->isString());
return nump;
}
public:
V3Number* newNumber(AstNode* nodep, uint32_t value=0) {

View File

@ -0,0 +1,5 @@
String: ' 1'
s f(1): ' 1'
s parm: ' 1'
s strg: ' 1'
*-* All Finished *-*

View File

@ -0,0 +1,20 @@
#!/usr/bin/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.
scenarios(simulator => 1);
compile(
);
execute(
expect_filename => $Self->{golden_filename},
);
ok(1);
1;

View File

@ -0,0 +1,21 @@
// DESCRIPTION: Verilator: Verilog Test module
//
// This file ONLY is placed into the Public Domain, for any use,
// without warranty, 2003 by Wilson Snyder.
module t;
function automatic string foo(int i);
return $sformatf("'%d'", i); // %0d does not work here
endfunction
string bar = foo(1);
localparam string pbar = foo(1);
initial begin
$write("String: "); $display("' 1'");
//$write("foo(1): "); $display(foo(1));
$write("s f(1): "); $display("%s", foo(1));
$write("s parm: "); $display("%s", pbar);
$write("s strg: "); $display("%s", bar);
$write("*-* All Finished *-*\n");
$finish;
end
endmodule