我正在使用 Icarus Verilog 最近的主分支版本。
我应该期望以下内容运行吗?
module string_display ();
//reg [10:0][7:0] x = "initial";
string x = "initial";
always @* begin
$display ("x = %s",x);
end
initial begin
// Assign new string
x = "aaaaa";
#1
// Assign new string
x = "bbbb";
#1
#1 $finish;
end
endmodule
以上给出
internal error: 18vvp_fun_anyedge_sa: recv_string(initial) not implemented
vvp: vvp_net.cc:2972: virtual void vvp_net_fun_t::recv_string(vvp_net_ptr_t, const string&, vvp_context_t): Assertion `0' failed.
但是,如果我通过取消注释上面的行来将 'x' 定义为 reg,那么它会按预期工作......
x = aaaaa
x = bbbb
错误消息准确地告诉您出了什么问题:“未实现”。这意味着它认识到你想要做什么,但尚未实施。
不,您不应期望 Icarus Verilog 支持
string
关键字,该关键字是在 SystemVerilog 的 IEEE Std 1800 中引入的。
根据Icarus网站:
编译器本身的目的是解析和详细设计 根据 IEEE 标准 IEEE Std 1364-2005 编写的描述。这是 一个相当大和复杂的标准,所以需要一些时间来填补 标准的所有黑暗小巷,但这就是目标。
没有提及 IEEE Std 1800。
您可以查看 github 站点上的
extensions.txt
文件,其中指出:
Icarus Verilog 支持对基线 IEEE1364 的某些扩展 标准。其中一些是从扩展变体中挑选出来的 语言,例如 SystemVerilog,...
但是,那里没有提到
string
。
我在
edaplayground上使用
-g2012
选项尝试了你的代码,但我得到了同样的错误。 你可以在你的版本上尝试一下。
我刚刚尝试了类似的方法,它对我有用:
module testit;
integer code;
string str;
string word_0;
string word_1;
string word_2;
string word_3;
string word_4;
integer file;
initial begin
//file = $fopenr(" ../../testcase/testcase_4x4.txt");
str = "this is a test... 1, 2, 3";
code = $sscanf(str, "%s %s %s %s %s",
word_0, word_1, word_2, word_3, word_4);
$display("Number of words: %0d", code);
$display("words[0]:(%-0s)", word_0);
$display("words[1]:(%-0s)", word_1);
$display("words[2]:(%-0s)", word_2);
$display("words[3]:(%-0s)", word_3);
$display("words[4]:(%-0s)", word_4);
end
endmodule
Icarus Verilog 运行命令:
iverilog -g2012 .\testit.sv
vvp -i a.out
输出:
Number of words: 5
words[0]:(this)
words[1]:(is)
words[2]:(a)
words[3]:(test...)
words[4]:(1,)
伊卡洛斯 Verilog 版本:
PS> iverilog -v
Icarus Verilog 版本 11.0 (开发) (s20150603-612-ga9388a89)