我使用“生成”在模块内部创建不同的流程,有时在某些情况下会不使用端口。例如:
module addthese (a, b, c, d);
input [7:0] a, b, c;
output [9:0] d;
parameter addOnlyAandB = "NO";
generate
if (addOnlyAandB == "YES") begin : add_only_a_and_b
always @*
d <= a + b;
end else begin : add_a_b_and_c
always @*
d <= a + b + c;
end
endgenerate
endmodule
在参数 addOnlyAandB 中传递“YES”会导致输入 c 被忽略。这会导致编译器生成一堆警告(c 的每一位一个),正确的是,输入 c 是多余的并已删除。
[EFX-0200 WARNING] Removing redundant signal : c[7]. (C:\path\file.v:49)
这是“忽略警告”的这些情况之一,因为 addOnlyAandB 显然必须故意设置为“YES”。但是忽略警告是一件坏事,因为很容易看不到隐藏在许多“良性警告”中的一些重要警告,最终会出现意外失败。
能否根据 genvar 以某种方式删除端口?
构建此功能的正确方法是什么,以便没有此类警告?
当然真实的非常大,有许多参数和生成块的许多可能组合,所以为每个组合写一个函数是不可能的。
谢谢你,
布鲁诺
您可以添加类似“assign unused_ok = c;”的内容到 Yes 部分,这样你就可以避开这个警告,但这可能会产生其他警告(或 linting 违规)。您也可以重新编码,这样,您将获得一个输入数组,而不是三个单独的输入,其长度由一个参数控制——类似于:
parameter WIDTH = 3;
input [WIDTH-1:0][7:0] abc_list;
然后,您可以构建一个单一的参数化 always 块,并且不留下任何未使用的输入。
许多端口无法通过 genvars 控制。但在 SystemVerilog 中,您可以控制数组的大小。例如,
module addthese#(N = 2) (input logic [7:0] args[N], output logic [9:0] d);
if (N == 2) begin : add_only_a_and_b
always @*
d = args[0] + args[1];
end else if (N == 3) begin : add_a_b_and_c
always @*
d = args[0] + args[1] + args[2];
endmodule
实例化示例:
module tb();
logic [7:0] a, b, c;
logic [9:0] d1, d2;
addthese add2('{a,b}, d1);
addthese #(3) add3('{a,b,c}, d2);
endmodule