无法绑定参数?

时间:2018-02-10 04:23:11

标签: if-statement verilog

我正在尝试通过Verilog创建多个加法器来比较每个加法器的速度。

我收到以下错误Unable to bind parameter WIDTH in arith_unit

到目前为止,这是我的代码:

module arith_unit 
#(
parameter ADDER_TYPE = 0,
parameter WIDTH = 8)
(input [WIDTH-1:0] a,
input [WIDTH-1:0] b,    
output [WIDTH-1:0] sum,
);

////////////////////////////////////////////////////////////////
if (ADDER_TYPE == 0) 
begin
    ripple_carry rc1 (a, b, cin, sum, cout);
end

////////////////////////////////////////////////////////////////
else if (ADDER_TYPE == 1) 
begin
   carry_bypass cb1 (a, b, cin, sum, cout);
end

//// more else statment for ADDER_TYPE...

endmodule  

//////////////////////////////////////////////////////////////////
module ripple_carry_4_bit(a, b, cin, sum, cout);

input [3:0] a,b;
input cin;
wire c1,c2,c3;
output [3:0] sum;
output cout;

full_adder fa0(.a(a[0]), .b(b[0]),.cin(cin), .sum(sum[0]),.cout(c1));
full_adder fa1(.a(a[1]), .b(b[1]), .cin(c1), .sum(sum[1]),.cout(c2));
full_adder fa2(.a(a[2]), .b(b[2]), .cin(c2), .sum(sum[2]),.cout(c3));
full_adder fa3(.a(a[3]), .b(b[3]), .cin(c3), .sum(sum[3]),.cout(cout));

endmodule

////////////////////////////////////////////////////////////////
module ripple_carry (a, b, cin, sum, cout);

input [WIDTH-1:0] a,b;
input cin;
wire c1,c2,c3, c4, c5, c6, c7;
output [WIDTH-1:0] sum;
output cout;

if (WIDTH == 8) begin  //<-------- compiler is pointing here as the problem
    ripple_carry_4_bit rca1 (.a(a[3:0]),.b(b[3:0]),.cin(cin), .sum(sum[3:0]),.cout(c1));
    ripple_carry_4_bit rca2 (.a(a[7:4]),.b(b[7:4]),.cin(c1), .sum(sum[7:4]),.cout(cout));
end

else if (WIDTH == 16) begin
    ripple_carry_4_bit rca1 (.a(a[3:0]),.b(b[3:0]),.cin(cin), .sum(sum[3:0]),.cout(c1));
    ripple_carry_4_bit rca2 (.a(a[7:4]),.b(b[7:4]),.cin(c1), .sum(sum[7:4]),.cout(c2));
    ripple_carry_4_bit rca3 (.a(a[11:8]),.b(b[11:8]),.cin(c2), .sum(sum[11:8]),.cout(c3));
    ripple_carry_4_bit rca4 (.a(a[15:12]),.b(b[15:12]),.cin(c3), .sum(sum[15:12]),.cout(cout));
end

//// more else statment for 32 & 64 bits...

endmodule

我在线查看,似乎我的if和else语句是正确的。所以我假设我的WIDTH声明错了?我尝试通过WIDTH通过module ripple_carry (a, b, cin, sum, cout, WIDTH);传递C ++的方式,但我仍然得到同样的错误。

我已经用8位,16位等自己测试了ripple_carry(没有if语句,没有参数),它运行正常。所以我知道我ripple_carry的逻辑很好。

请帮帮我,谢谢。

1 个答案:

答案 0 :(得分:2)

这有助于显示行号的确切错误消息,但您在module ripple_carry中缺少WIDTH参数声明。

module ripple_carry #(parameter WIDTH=8)(...

在生成块中实例化它时添加它。

   ripple_carry #(WIDTH) (a, b, cin, sum, cout);