使用generate有条件实例化的连线稍后不可见

问题描述 投票:0回答:1

我在一个模块中看到来自

iverilog
verilator
的失败错误,该模块具有基于条件实例化的
wire
。这最初发生在我从其他人那里获得的 SystemVerilog 模块中,该模块显然已使用 Xilinx 工具成功模拟和合成了代码。我创建了一个更简单的 Verilog 示例,它也存在同样的问题。

代码:

module test_gen
    #(parameter OPERATION_TYPE = 0)
    (
        input  logic [31:0] a,
        input  logic [31:0] b,
        output logic [63:0] z
    );
    generate 
        if (OPERATION_TYPE == 0) begin
        wire foo;
        end
    endgenerate
    wire [63:0] zz;

    generate
        always @ (a,b) begin
        if (OPERATION_TYPE == 0) begin
            assign foo = a[0] & b[0];
            z <= {foo, 63'b0};
        end
        else if (OPERATION_TYPE == 1) begin
            z <= a - b;
        end
        else if (OPERATION_TYPE == 2) begin
            z <= (a << 1) + b; // 2a+b
        end
        else begin
            z <= b - a;
        end
        end
    endgenerate
endmodule

iverilog 失败并显示以下消息:

test_gen.v:18:错误:找不到 变量

foo'' in 
test_gen'' test_gen.v:19: 错误:无法绑定 电线/reg/内存
foo' in 
test_gen' (如果 OPERATION_TYPE 设置为非零值,它将编译)

verilator 4.211 也出现错误:

%错误:test_gen.v:18:20:找不到变量的定义:'foo'
18 | 18赋值 foo = a[0] & b[0]; | ^~~ %错误:由于 1 个错误而退出

因此,即使条件为真,就好像电线 foo 从未被实例化。

像这样有条件地实例化一条线是合法的 Verilog/SystemVerilog 吗?或者这不合法,而 Xilinx 工具只是更宽松?

verilog system-verilog
1个回答
0
投票

该代码在 EDA Playground 上的每个模拟器上都有编译错误。

这最初发生在我获得的 SystemVerilog 模块中 显然已经成功模拟和合成的其他人 使用 Xilinx 工具编写代码。

也许你得到的代码并没有像你想象的那样工作。或者 Xilnix 工具可能更宽容。无论如何,您发布的代码有问题,无法按原样使用。

© www.soinside.com 2019 - 2024. All rights reserved.