System verilog Icarus verilog:reg-show;不能由原语或连续赋值驱动

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

我正在尝试将一些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("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