我在一个模块中看到来自iverilog 和verilator 的失败错误,该模块具有基于条件实例化的线路。这最初发生在我从其他人那里获得的 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:错误:找不到 变量
test_gen'' test_gen.v:19: 错误:无法绑定 电线/reg/内存foo'' in
test_gen' (如果 OPERATION_TYPE 设置为非零值,它将编译)foo' in
verilator 4.211 也出现错误:
%错误:test_gen.v:18:20:找不到变量的定义:'foo'
18 | 18赋值 foo = a[0] & b[0]; | ^~~ %错误:由于 1 个错误而退出
因此,即使条件为真,就好像电线 foo 从未被实例化。
像这样有条件地实例化一条线是合法的 Verilog/SystemVerilog 吗?或者这不合法,而 Xilinx 工具只是更宽松?
该代码在 EDA Playground 上的每个模拟器上都有编译错误。
这最初发生在我获得的 SystemVerilog 模块中 显然已经成功模拟和合成的其他人 使用 Xilinx 工具编写代码。
也许你得到的代码并没有像你想象的那样工作。或者 Xilnix 工具可能更宽容。