n 位数的 if-else 条件
If-else condition for n-bit number
我想设计一个纹波进位加法器,它将 n 位 A 和 B 数相加。在添加之前,我想检查是否有任何输入为零。如果任何值为零,我想 return 另一个输入作为输出。
我的脚本类似于以下内容-
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."
请帮我找出脚本中的错误。
谢谢
法哈娜
您以 错误的 方式使用了 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_comb
或 always @(*)
是一些替代方法。有关三元运算符和您的问题的更多信息,请参阅 this link. As always, SystemVerilog LRM 1800-2012 第 11 章和第 12 章 可能很有用。
我想设计一个纹波进位加法器,它将 n 位 A 和 B 数相加。在添加之前,我想检查是否有任何输入为零。如果任何值为零,我想 return 另一个输入作为输出。 我的脚本类似于以下内容-
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."
请帮我找出脚本中的错误。
谢谢 法哈娜
您以 错误的 方式使用了 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_comb
或 always @(*)
是一些替代方法。有关三元运算符和您的问题的更多信息,请参阅 this link. As always, SystemVerilog LRM 1800-2012 第 11 章和第 12 章 可能很有用。