将任意数量的字符串作为参数的系统Verilog函数?



我想要一个可以接受任意数量的字符串参数的SystemVerilog函数,这个函数本质上是内置$display的包装器,因此我希望用户能够以相同的方式调用该函数,将任意数量的字符串传递到myfunc()中,如下所示:

myfunc(stringVar1, "literalString", stringVar2, stringVarN, intVarToConvertToString);

我目前的实现是只有一个字符串参数,并使用SystemVerilog连接运算符来连接我希望传递的所有字符串;例如

myfunc({stringVar1, "literalString", stringVar2, stringVarN, intVarToConvertToString});

但是,当我尝试将int等数字类型作为串联字符串传递时,它没有正确转换为其值的字符串表示形式,并且字符打印在其位置。我还尝试对正在连接的非字符串类型执行显式字符串转换,但无济于事。

我知道,如果我将所有参数分别传递给我的函数,我就可以将它们直接传递给$display它确实正确地将数字类型转换为它们的字符串表示以显示它们。有谁知道我将如何在系统Verilog中执行此操作?

如果要将整数的值转换为字符串表示形式,或者更具体地说,将 ASCII 数字的"字符串">转换为格式,则需要使用格式化函数(如$sformatf("%d",intVarToConvertToString))将值转换为十进制表示形式,或者可以将串联和格式组合到单个表达式中。

myfunc($sformat("%s%s%s%d",{stringVar1, "literalString"}, stringVar2, stringVarN, intVarToConvertToString);

concat运算符{}将其内容转换为位流。 verilog/system verilog 函数中没有变量参数。 无法将变量参数包装在$display中。

因此,最好的办法是使用字符串或队列的动态或关联数组。 以下是可能使用关联数组的示例:

package pkg;
function void multstr(string args[int]);
for(int i = 0; i < args.num; i++) begin
$display("arg%0d: %s", i, args[i]);
end
endfunction
endpackage
module testme();
string strings[int];
initial begin
strings[0] = "hello ";
strings[1] = "world";

pkg::multstr(strings);
end
endmodule

创建一个具有动态数组端口的函数,如下所示:

module tb ();

// function arg is a dynamic array of strings
function void printStrings(string mystrings[]);
foreach(mystrings[i])
$display("",mystrings[i]);
endfunction

// dynamic array of string
string names [];

initial
begin
names = new[2];
names = '{"bob","joe"};
printStrings(names);
$display("-----");
// make the d-array 1 bigger
names = new[names.size() + 1](names);
names = '{"bob","joe","bill"};
printStrings(names);
end

endmodule

它产生

bob
joe
-----
bob
joe
bill    

同样的事情也可以使用队列作为函数端口而不是 d 数组来完成。

最新更新