如何在SystemVerilog中将字节与字符串连接起来

时间:2012-11-05 04:45:02

标签: system-verilog

在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]转换为单字符字符串。什么是最有效和最简洁的解决方案(如果可能的话,无需引入临时变量)?

4 个答案:

答案 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