System verilog Icarus verilog:reg-show;不能由原语或连续赋值驱动
我正在尝试将一些Verilog源代码移植到SystemVerilog。这个问题专门针对Icarus Verilog(使用10.3和11进行测试,得到相同的结果),因为我在使用工具时没有发现任何错误(例如Yosys 0.9.0、Cadence Xcelium 19.09)。我的问题可以归结为以下最小的例子:System verilog Icarus verilog:reg-show;不能由原语或连续赋值驱动,system-verilog,iverilog,System Verilog,Iverilog,我正在尝试将一些Verilog源代码移植到SystemVerilog。这个问题专门针对Icarus Verilog(使用10.3和11进行测试,得到相同的结果),因为我在使用工具时没有发现任何错误(例如Yosys 0.9.0、Cadence Xcelium 19.09)。我的问题可以归结为以下最小的例子: module main(); logic sel; wire [31:0] wired; logic show; initial begin $monitor(&qu
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
中创建一些val\u o
值,并将其连接到main
中,以将其传递给subin
subin
获取值并返回一个受监控的位。换句话说,一个值从一个子模块传递到另一个子模块
我从iverilog
中得到的错误是:
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.
据我所知,它应该在subout
中为val_o
创建一个寄存器,在main
中为sel
创建一个寄存器。其他一切都只是电线。因为我们使用的是SystemVerilog,所以我使用的是逻辑
,不指定wire
/reg
。对我来说,结论reg show代码>已不正确
Icarus Verilog如何总结reg显示代码>
你能用iverilog运行这个例子吗
代码在旧版Icarus 10.0上正确运行。我猜你没有启用SystemVerilog标志-g2012
。默认情况下,Icarus在Verilog IEEE1364-2005中运行;这与设置标志-g2005
Verilog仅允许wire
s由assign
语句或输出端口驱动。
SystemVerilog放宽了规则,因此reg
和logic
由assign
语句或输出端口驱动,只要它们是唯一的驱动程序。(有点离题,但我个人更喜欢遵循更严格的Verilog规则,因为并不是所有工具都有强大的单源驱动程序检查reg
和logic
由assign
语句或输出端口驱动)
无论如何,请尝试以下命令:
iverilog -Wall -g2012 <file-with-above-content>
iverilog-Wall-g2012