【发布时间】: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