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

System verilog 如何在SystemVerilog中将字节与字符串连接起来,system-verilog,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中,这会在分配时导致编译错误不兼容类型:.r我不确定以下代码在模拟器中是否10

在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中,这会在分配时导致编译错误
不兼容类型:.r我不确定以下代码在模拟器中是否100%正常
Aldec Riviera
,因为我尝试了你的和我的代码在
VCS
中都正常。如果需要返回字符串类型s,可以尝试字符串方法
substr()


我不确定以下代码在模拟器
Aldec Riviera
中是否100%正常,因为我在
VCS
中尝试了你的和我的都正常。如果需要返回字符串类型s,可以尝试字符串方法
substr()


没错,ModelSim正在接受无效代码。规范明确定义了索引和赋值所涉及的类型

字符串变量的单个字符的类型为byte

整数类型的值可以指定给字符串变量,但需要强制转换

规范进一步详细说明了基于操作数的串联运算符的结果:

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

使用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

没错,ModelSim正在接受无效代码。规范明确定义了索引和赋值所涉及的类型

字符串变量的单个字符的类型为byte

整数类型的值可以指定给字符串变量,但需要强制转换

规范进一步详细说明了基于操作数的串联运算符的结果:

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

使用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

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

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

下面是一个小代码示例:

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

for(i=0;i这里是一个小的代码示例:

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

for(i=0;iI预期
s[i]
被视为长度为1的字符串,而不是
字节。在我看来,Riviera做的事情可能不正确。您是否有与此相关的LRM引用?此外,大括号当然可以用于连接位/逻辑/字节-这是Verilog的保留,在SystemVerilog LRM中可能不明确。@dwikle,theSystemVerilog 3.1a LRM,在第13页的表3-2:字符串运算符下,我看到的是。对我来说,这听起来像是所有操作数都必须是
String
或字符串文字。当然,使用{}将位、逻辑和字节串联也可以,但结果不会是字符串。我希望
s[I]
被视为长度为1的字符串,而不是
字节。在我看来,Riviera做的事情可能不正确。您是否有与此相关的LRM引用?此外,大括号当然可以用于连接位/逻辑/字节-这是Verilog的保留,在SystemVerilog LRM中可能不明确。@dwikle,theSystemVerilog 3.1a LRM,在第13页的表3-2:字符串运算符下是我所看到的。对我来说,这听起来像是所有操作数都必须是
字符串或字符串文字。当然,使用{}来连接位、逻辑和字节也可以,但结果不会是字符串。感谢您提到另一个选项。您可以通过编辑您的答案提供代码示例(可能基于我在问题中给出的代码)吗?感谢您提到另一个选项。您可以通过编辑您的答案提供代码示例(可能基于我在问题中给出的代码)吗?