由于“生成”条件而来自未使用端口的编译器警告

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

我使用“生成”在模块内部创建不同的流程,有时在某些情况下会不使用端口。例如:

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 以某种方式删除端口?

构建此功能的正确方法是什么,以便没有此类警告?
当然真实的非常大,有许多参数和生成块的许多可能组合,所以为每个组合写一个函数是不可能的。

谢谢你,

布鲁诺

verilog system-verilog compiler-warnings
2个回答
0
投票

您可以添加类似“assign unused_ok = c;”的内容到 Yes 部分,这样你就可以避开这个警告,但这可能会产生其他警告(或 linting 违规)。您也可以重新编码,这样,您将获得一个输入数组,而不是三个单独的输入,其长度由一个参数控制——类似于:

parameter WIDTH = 3;
input [WIDTH-1:0][7:0] abc_list;

然后,您可以构建一个单一的参数化 always 块,并且不留下任何未使用的输入。


0
投票

许多端口无法通过 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
© www.soinside.com 2019 - 2024. All rights reserved.