我正在尝试将一些Verilog源代码移植到SystemVerilog。这个问题是针对Icarus的(用10.3和11提供了相同的结果进行了测试),因为我的工具没有任何错误(例如Yosys 0.9.0,Cadence Xcelium 19.09)。我所讨论的问题归结为以下最起码的例子:
module main();
logic sel;
wire [31:0] wired;
logic show;
initial begin
$monitor("show = %d", show);
sel = 1'b1;
#10;
sel = 1'b0;
end
subout a(.sel_i(sel), .val_o(wired));
subin b(.val_i(wired), .out_o(show));
endmodule
module subout(
input logic sel_i,
output logic [31:0] val_o
);
always @(sel_i) begin
val_o = 32'b0;
if (sel_i) begin
val_o = 32'b101010;
end
end
endmodule
module subin(
input logic [31:0] val_i,
output logic out_o
);
assign out_o = val_i[0];
endmodule显然,我希望在subout中创建一些subout值,并将其连接到main中,以便将其传递给subin。subin接受这个值并返回一个被监视的位。换句话说,一个值从一个子模块传递到另一个子模块。
我在iverilog <file-with-above-content>中遇到的错误是:
iverilog_issue.sv:35: error: reg out_o; cannot be driven by primitives or continuous assignment.
iverilog_issue.sv:15: error: reg show; cannot be driven by primitives or continuous assignment.
iverilog_issue.sv:15: error: Output port expression must support continuous assignment.
iverilog_issue.sv:15: : Port 2 (out_o) of subin is connected to show
3 error(s) during elaboration.据我所知,它应该为val_o在subout中创建一个寄存器,在main中创建一个寄存器sel。其他一切都只是电线。由于我们使用的是SystemVerilog,所以我使用logic而不指定wire/reg。对我来说,reg show;的结论已经不正确了。
reg show;发布于 2020-11-06 06:15:29
该代码在EDAplayground上正确运行,有一个较旧的Icarus10.0。因此,我猜您没有启用SystemVerilog标志-g2012。默认情况下,Icarus在Verilog same 1364-2005[1]中运行;这与设置标志-g2005相同。
Verilog只允许wire由assign语句或输出端口驱动。SystemVerilog放宽了规则,因此reg和logic由assign语句或输出端口驱动,只要这是唯一的驱动程序。(我个人更喜欢遵循更严格的Verilog规则,因为并非所有工具都有强大的单个源驱动程序来检查由reg语句或输出端口驱动的assign和logic )。
无论如何,尝试以下命令:
iverilog -Wall -g2012 <file-with-above-content>https://stackoverflow.com/questions/64708162
复制相似问题