通过端口映射将总线阵列传递给另一个模块
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位,则传递参数是可选的。
我在 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位,则传递参数是可选的。