if-else条件为n位数

时间:2015-11-10 01:31:14

标签: verilog system-verilog

我想设计一个纹波进位加法器,它将添加n位A和B数。在添加之前,我想检查是否有任何输入为零。如果任何值为零,我想返回另一个输入作为输出。 我的脚本类似于下面的内容 -

module RCA #(parameter n=10) (input [n-1:0] A, input [n-1:0] B,output [n-1:0] R);

wire [n-1:0] r1;
wire [n:0] carry;
assign carry[0]=0;

genvar i;
generate
for (i=0;i<n;i=i+1) begin:ripple_block
FA fa(.a(p[i]),.b(q[i]),.s(r1[i]),.cout(carry[i+1]));
end
endgenerate

if (p==0) begin:a1
assign R=q;
end

if (q==0) begin:a2
assign R=p;
end

else begin:a3
assign R=r1;
end

endmodule

我收到错误

"Elaboration time unknown or bad value encountered for generate if-statement condition 
expression. Please make sure it is elaboration time constant."

请帮我在脚本中找到错误。

由于 Farhana

1 个答案:

答案 0 :(得分:2)

您以错误的方式使用了if..else条件。必须在程序块中使用if..else条件。在这里,它直接在模块内部使用。

编译器期待if..else块内的generate。但我想这不是你的代码的意图。

只需删除条件,然后使用三元运算符? :)。因此,您的代码如下所示:

module RCA #(parameter n=10) (input [n-1:0] A, input [n-1:0] B,output [n-1:0] R);
// ...
// ...
generate
//...
//...
endgenerate

//if (p==0) begin:a1
/***Use of ternary operator here***/
  assign R= (p==0) ? q : ((q==0) ? p : r1); 
// end

// if (q==0) begin:a2
// assign R=p;
// end
// 
// else begin:a3
// assign R=r1;
// end

endmodule

也可以有其他方法。使用always_combalways @(*)是其中一些选择。有关三元运算符和您的问题的更多信息,请参阅this链接。与往常一样,SystemVerilog LRM 1800-2012 第11章和第12章可能很有用。