1

在 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]字节转换为一个字符的字符串(这在这种情况下似乎是明智的)。在里维埃拉,看起来我必须s[i]手动将字节转换为一个字符的字符串。什么是最有效和最简洁的解决方案(如果可能,不必引入临时变量)?

4

4 回答 4

3

你是对的,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 = {string'(s[i]), r};
    end
end
于 2012-11-06T02:33:40.287 回答
1

我不确定以下代码在模拟器中是否 100% OK Aldec Riviera,因为我尝试你和我的都可以VCS。如果需要返回s的字符串类型,可以试试string方法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
于 2012-11-05T14:01:37.543 回答
0

使用 atobin()/bintoa() 函数在 ASCII 和二进制之间进行转换。然后,您可以将连接运算符“{}”与字符串/二进制值一起使用。

于 2015-09-30T10:16:18.387 回答
0

这是一个小代码示例:

首先,一个从字符串创建字节动态数组的示例。动态字节数组包含每个字符的 ASCII 代码数字表示。优点是这可以是例如随机的,但字符串不能是随机的。

(创建做例如

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
于 2016-02-05T07:44:50.387 回答