2015-11-10 15 views
0

我想设计一个波纹进位加法器,它将添加n位A和B数。添加之前,我想检查是否有任何输入为零。如果任何值为零,我想返回另一个输入作为输出。 我的脚本是类似的东西如下─n位数的其他条件

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

回答

2

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

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

仅有除去的条件和使用三元运营商? :)来代替。所以,你的代码如下:

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可能会有用。

+0

非常感谢您的回答。 – Snigdha203

+0

如果任何输入为零,我可以跳过添加吗?在三元运算符中,我首先计算加法,然后选择其中一个结果。我可以以相反的方式做到吗?这意味着三元赋值中的一个将包含整个生成块。 – Snigdha203

+1

在verilog中,当你实例化一个模块时,意味着你正在**添加硬件**到你的主板。你可以**有条件地**添加硬件(在生成或ifdef中使用'if'),或者你可以绕过**来处理某些输入,但是一旦实例化,你就不能删除**。在这里,你可以绕过'FA'模块,但它仍然会保留在你的主板上。使用三元运算符,如'assign R =(A == 0)? B:((B == 0)?A:r1)''会通过向您的设计添加一些MUX来绕过'FA'。 – sharvil111