【问题标题】:How to concatenate a byte with a string in SystemVerilog如何在 SystemVerilog 中将字节与字符串连接起来
【发布时间】:2016-02-05 16:06:07
【问题描述】:

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

【问题讨论】:

  • 我希望 s[i] 被视为长度为 1 的字符串,而不是 byte。在我看来,里维埃拉可能没有做正确的事情。你有与此相关的 LRM 参考吗?此外,大括号当然可以用于连接位/逻辑/字节 - 这是 Verilog 的保留,在 SystemVerilog LRM 中可能不明确。
  • @dwikle,SystemVerilog 3.1a LRM,在第 13 页的 表 3-2:字符串运算符 下是我正在查看的内容。对我来说,这听起来像是所有操作数都必须是 string 或字符串文字。当然,使用 {} 连接位、逻辑和字节也可以,但结果不会是字符串。

标签: system-verilog


【解决方案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 = {string'(s[i]), r};
    end
end

【讨论】:

    【解决方案2】:

    我不确定以下代码在模拟器Aldec Riviera 中是否 100% OK,因为我在 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】:

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

      【讨论】:

      • 感谢您提及另一个选项。您能否通过编辑您的答案提供代码示例(可能基于我在问题中提供的代码)?
      【解决方案4】:

      这里是一个小例子的代码:

      首先,一个从字符串创建字节动态数组的示例。动态字节数组包含每个字符的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-31
        • 2014-08-30
        • 1970-01-01
        • 1970-01-01
        • 2023-01-24
        • 2011-05-13
        相关资源
        最近更新 更多