通过端口映射将总线阵列传递给另一个模块

Passing bus array to another module via port mapping

我在 SV 模块中有以下代码,我在其中实例化另一个 SV 模块并将 5 位总线传递给它以检查 X 和 Z,代码如下:

  input  [4:0] analdo_trim; 
  cds_XZ_checker XZ_check_analdo_trim (.in(analdo_trim),.in_ok(analdo_trim_ok));

这是 cds_XZ_checker 的模块定义:

module cds_XZ_checker(in,in_ok);
input in;
output bit in_ok;

always_comb  begin              //Asynchronous assertion check block
      asynch_XZ_check: assert (!($isunknown(in))) in_ok=1'b1; 
        else begin 
            $warning ("WARNING (%M) digital signal in=%b is undefined at time %t",in,$time); 
            in_ok=1'b0;
        end//else
end

endmodule

问题是当我通过端口读取上述模块中的 5 位 analdo_trim 时,它只读取 analdo_trim 的 LSB,因为它在声明中没有总线宽度。

模块cds_XZ_checker是通用模块,在其他几个模块中实例化。因此,我不能将 'in' 声明为 [4:0],因为其他一些模块可能会通过不同位宽的总线。有没有一种方法可以将其参数化,使其适用于任何位宽?

您可以使用 parameter 来适应不同的输入总线宽度:

module cds_XZ_checker #(parameter WIDTH=5) (in,in_ok);
input [WIDTH-1:0] in;
output bit in_ok;

always_comb  begin              //Asynchronous assertion check block
      asynch_XZ_check: assert (!($isunknown(in))) in_ok=1'b1; 
        else begin 
            $warning ("WARNING (%M) digital signal in=%b is undefined at time %t",in,$time); 
            in_ok=1'b0;
        end//else
end
endmodule

module tb;
    logic a,b;
    logic [4:0] c;
    logic d;

    cds_XZ_checker #(.WIDTH(1)) i0 (a, b);
    cds_XZ_checker i1 (c, d);
endmodule

tb 模块显示了如何参数化检查器模块的每个实例。默认宽度为5。如果您的检查器输入是5位,则传递参数是可选的。

演示 edaplayground