【问题标题】:If-else condition for n-bit numbern 位数的 if-else 条件
【发布时间】:2015-11-10 01:31:14
【问题描述】:

我想设计一个波纹进位加法器,它将添加 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."

请帮我找出脚本中的错误。

谢谢 法哈纳

【问题讨论】:

    标签: verilog system-verilog


    【解决方案1】:

    您以错误的方式使用了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 章很有用。

    【讨论】:

    • 如果任何输入为零,我可以完全跳过加法吗?在三元运算符中,我首先计算加法,然后选择其中一个结果。我可以反过来做吗?这意味着三元赋值之一将包含整个生成块。
    • 在verilog中,当您实例化一个模块时,意味着您正在向您的电路板添加硬件。您可以有条件地添加该硬件(在 generate 中使用 ififdef),或者您可以为某些输入绕过它,但是一旦实例化,您可以不要删除。在这里,您可以绕过FA 模块,但它仍然会保留在您的板上。使用像 assign R = (A==0)? B : ((B==0)?A : r1) 这样的三元运算符将通过在您的设计中添加一些 MUX 来绕过 FA
    • 我只是为了确保当任何输入为零时开关功率会降低。如果 A=0,是绕过 FA 模块还是仍然计算 r1,然后选择其中一个答案?
    • 这里,模块FA延迟方面被绕过。假设FA 模块需要 2 个时钟周期来提供输出,但对于某些输入组合,您的输出是可预测的。所以上面的assign 语句应该立即提供输出,从而减少延迟(即使输入仍然进入模块并且仍然会计算 r1)。其次,为了降低功率,您可以添加 gating 信号来屏蔽其他信号。时钟门控程序是很常见的事情。喜欢mod_clk = top_clk &amp; clk_gate 。还有其他方法也可以降低 pwr 的缺点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2011-11-06
    • 2020-09-15
    • 1970-01-01
    相关资源
    最近更新 更多