我有两个verlog模块,如下所示。假设参数语句也允许我传递总线宽度,我想在实例化另一个模块。
我在尝试编译说“端口表达式64与预期宽度1或2不匹配时”时出现错误。
module LabL3;
parameter SIZE = 64;
reg [SIZE-1:0]a;
reg [SIZE-1:0]b;
reg c;
wire [SIZE-1:0]z;
integer i,j,k;
yMux #(SIZE) mux(z,a,b,c);
initial
begin
for(i=0;i<4;i=i+1)begin
for(j=0;j<4;j=j+1)begin
for(k=0;k<2;k=k+1)begin
a=i;b=j;c=k;
#1$display("a=%d b=%d c=%d z=%d",a,b,c,z);
end
end
end
end
endmodule
,另一个文件是:
module yMux(z,a,b,c);
parameter SIZE= 0;
output [SIZE-1:0]z;
input [SIZE-1:0]a,b;
input c;
yMux1 mux[SIZE-1:0](z,a,b,c);
endmodule
最后
module yMux1(z,a,b,c);
output z;
input a,b,c;
wire not_C, upper, lower;
not my_not(notC,c);
and upperAnd(upper,a,notC);
and lowerAnd(lower,c,b);
or my_or(z,upper,lower);
endmodule
我正在使用的命令是:iverilog LabL3.v yMux1.v yMux.v
我尝试了不同的语法来进行参数传递。所有都给出了相同的结果。 任何提示都将非常感激。 - 克里斯
答案 0 :(得分:4)
您正在使用向量实例:
yMux1 mux[SIZE-1:0](z,a,b,c);
最终得到SIZE
个yMux1实例。这应该按位正确连接z,a,b并通过复制将单个位c
连接到所有yMux1 c端口。
如果您真的想将所有c端口驱动到相同的值,我会尝试手动复制端口:
yMux1 mux[SIZE-1:0](z,a,b,{SIZE{c}});
Example on EDAPlayground对我来说很好。可能是特定工具无法正确支持向量实例的问题。
如果可能,我建议使用SystemVerilog IEEE 1800-2012 Standard第23.2.1节中的命名端口连接( ANSI标题样式)。
这种风格对于你的设计意图非常清楚,我觉得它更容易阅读,这与更少的错误有关。它还允许更容易重构代码,因为命名连接并且不依赖于顺序。
module LabL3;
parameter SIZE = 64;
reg [SIZE-1:0] a;
reg [SIZE-1:0] b;
reg c;
wire [SIZE-1:0] z;
yMux #(
.SIZE(SIZE)
) mux (
.z(z),
.a(a),
.b(b),
.c(c)
);
yMux definiton:
module yMux #(
parameter SIZE= 0
) (
output [SIZE-1:0] z,
input [SIZE-1:0] a,
input [SIZE-1:0] b,
input c
);
// ...
endmodule
EDAPlayground上的上述代码示例。