为什么在Verilog中没有正确传递参数?

时间:2014-03-11 03:59:43

标签: parameter-passing verilog

我有两个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

我尝试了不同的语法来进行参数传递。所有都给出了相同的结果。 任何提示都将非常感激。 - 克里斯

1 个答案:

答案 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上的上述代码示例。