Verilog n位数字的If-else条件

Verilog n位数字的If-else条件,verilog,system-verilog,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位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
请帮我找到脚本中的错误

谢谢
Farhana

您以错误的方式使用了
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\u comb
always@(*)
是一些替代方法。有关三元运算符和您的问题的更多信息,请参阅链接。和往常一样,SystemVerilog第11章和第12章可能会很有用。

如果任何输入为零,我可以跳过加法吗?在三元运算符中,我首先计算加法,然后选择一个结果。我能用相反的方法做吗?这意味着其中一个三值赋值将包含整个生成块。在verilog中,当您实例化一个模块时,意味着您正在向电路板添加硬件。您可以有条件地添加该硬件(使用generate中的
if
ifdef
),也可以对某些输入绕过该硬件,但一旦实例化,就无法删除该硬件。在这里,您可以绕过
FA
模块,但它仍将保留在您的板上。使用三元运算符,如
赋值R=(A==0)?B:((B==0)?A:r1)
将通过在您的设计中添加一些多路复用器来绕过
FA
。我只是为了确保在任何输入为零时开关功率降低。如果A=0,是否会绕过FA模块或仍然会计算r1,然后选择一个答案?此处,模块
FA
在延迟方面被绕过。假设
FA
模块需要2个时钟周期来提供输出,但对于某些输入组合,输出是可预测的。因此,上述
assign
语句应立即提供输出,从而减少延迟(即使输入仍进入模块,r1仍将被计算)。其次,为了降低功耗,可以添加门控信号,这将屏蔽其他信号。时钟选通程序是很常见的事情。如
mod_clk=top_clk&clk_gate
。低压压水堆的缺点也有其他方式。
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