在ModelSim中,以下代码可以正常工作:
string r;
string s;
// ...assign some string to s...
integer i;
r = "";
for (i=s.len()-1; i>=0; i=i-1) begin
if (s[i] != "\n") begin
r = {s[i], r};
end
end
在Aldec Riviera中,这会导致编译错误Incompatible types at assignment: .r<string> <- s[i]<byte>
。
读取SystemVerilog LRM,我可以看到花括号似乎只支持连接字符串,而不是字节。因此,ModelSim对LRM的要求不严格,或者它将s[i]
字节隐式转换为单字符字符串(在此上下文中似乎是明智的)。在Riviera中,看起来我必须手动将字节s[i]
转换为单字符字符串。什么是最有效和最简洁的解决方案(如果可能的话,无需引入临时变量)?
答案 0 :(得分:3)
你没错,ModelSim接受无效代码。该规范明确定义了索引和赋值所涉及的类型。
字符串变量的单个字符是byte类型。
...
可以将整数类型的值分配给字符串变量,但需要强制转换。
规范进一步详细说明了基于操作数的连接运算符的结果:
每个操作数可以是字符串文字或字符串类型的表达式。
使用演员:
string r;
string s;
// ...assign some string to s...
integer i;
r = "";
for (i=s.len()-1; i>=0; i=i-1) begin
if (s[i] != "\n") begin
r = {string'(s[i]), r};
end
end
答案 1 :(得分:1)
我不确定以下代码在模拟器Aldec Riviera
中是100%正常,因为我在VCS
中尝试了你的两个代码。如果需要返回s的字符串类型,可以尝试使用字符串方法substr()
。
for (i=s.len()-1; i>=0; i=i-1) begin
if (s[i] != "\n") begin
r = {s.substr(i,i), r};
end
end
答案 2 :(得分:0)
使用atobin()/ bintoa()函数在ASCII和Binary之间进行转换。然后,您可以使用串联运算符“{}”和字符串/二进制值。
答案 3 :(得分:0)
这是一个小代码示例:
首先,从字符串创建字节动态数组的示例。动态字节数组包含每个字符的ASCII CODE编号表示。优点是这可以是例如随机的,但字符串不能随机化。
(创建例如
for(i=0;i<stringvar.len(); i++) begin
byte_din_array = {byte_din_array ,stringvar[i]}; //stringvar[i] will return empty byte if the index would be beyond the string length
//The advantage of using stringvar[i] instead of stringvar.atoi(i) is that
//the string can have all ASCII characters and not just numbers.
//Disadvantage is that the byte contains the ASCII CODE "number"
//representation of the character and that is not human readable
end
)。
以下是以串联字符串形式转换动态字节数组的示例。 您可能已使用先前的动态数组在xfer中部分随机化(带约束)或在post_randomize中更改。
function string convert_byte_array2string(byte stringdescriptionholder[]);
automatic string temp_str="";
automatic byte byte_temp;
automatic string str_test;
for ( int unsigned i = 0; i<stringdescriptionholder.size(); i++) begin
i=i;//debug breakpoint
byte_temp = stringdescriptionholder[i];
str_test = string'(byte_temp); //the "string cast" will convert the numeric ASCII representation in a string character
temp_str = {temp_str,str_test};
end
return temp_str;
endfunction