2012-11-05 39 views
1

在ModelSim的用细绳连接一个字节,下面的代码工作得很好:如何SystemVerilog中

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的海滨,这会导致编译错误Incompatible types at assignment: .r<string> <- s[i]<byte>

阅读SystemVerilog LRM,我可以看到花括号似乎只支持连接字符串,而不是字节。因此,ModelSim不像LRM那么严格,或者它将s[i]字节隐式转换为单字符字符串(在这种情况下似乎是合理的)。在里维埃拉,它看起来像我必须手动将字节s[i]转换为一个字符的字符串。什么是最有效和简洁的解决方案(如果可能,不必引入临时变量)?

+0

我想's [i]'被视为长度为1而不是字节的字符串。在我看来,里维埃拉可能不会做正确的事情。你有没有与此相关的LRM参考?此外,花括号当然可以用来连接位/逻辑/字节 - 这是Verilog的一个保留,在SystemVerilog LRM中可能不明确。 – dwikle

+0

@dwikle,SystemVerilog 3.1a LRM,在*表13-2:字符串运算符*在第13页是我正在看。对我来说,这听起来像所有的操作数必须是一个'字符串'或一个字符串文字。当然,使用{}连接位,逻辑和字节也可以,但结果不会是字符串。 – FriendFX

回答

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 
3

你是对的,ModelSim接受无效的代码。该规范明确定义了涉及索引和分配的类型。

字符串变量的单个字符的类型是字节。

...整型

可以赋值给一个字符串变量,但需要强制。

该规范进一步细节基于所述操作数并置运算符的结果:

每个操作数可以是一个字符串或字符串类型的表达式。

使用CAST:

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 
0

使用atobin()/ bintoa()为ASCII和二进制之间的转换功能。然后,您可以使用字符串/二进制值连接运算符“{}”。

+0

谢谢你提到另一种选择。你能通过编辑你的答案来提供一个代码示例(可能建立在我给出的问题中的代码上)? – FriendFX

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