我必须实现一个串行执行A + B + C + D的电路。
使用第一个加法器添加A和B,使用第二个加法器将结果添加到C,最后使用第三个加法器将结果添加到D中。
问题是,为了使设计低功耗。我必须关闭另外两个未使用的加法器。我能想到的只有启用和禁用信号,但这会导致延迟问题。
如何在verilog中以有效的方式合成?
A,B,C,D可能会在每个时钟周期发生变化。启动信号用于指示何时需要新的计算。
答案 0 :(得分:3)
我认为你的加法器是通过sum = A + B;
隐含的。对于区域优化,为什么不共享单个加法器单元。 CLK1中的A + B,CLK2中的SUM + C,CLK3中的SUM + D.然后你没有什么可以禁用或计时门。
当值发生变化时会使用大部分功率,因此在不使用时归零输入实际上可以通过创建不必要的切换来增加功率。由于加法器是组合逻辑,我们所能做的就是为给定架构节省功率保持值稳定,这可以通过使用控制/排序输入和输出触发器clks的时钟门控单元来完成。
<强>更新强>
利用每个时钟周期可能需要新计算的信息,并且存在称为start
的启用信号。这个问题提到了连续添加它们,即:
sum1 = A + B;
sum2 = sum1 + C;
sum3 = sum2 + D;
由于可能在每个时钟周期计算结果,因此它们全部开启或全部关闭。给定的序列化(全部并行执行)有3个加法器串在一起(3个加法器的纹波路径)。如果我们重构:
sum1 = A + B;
sum2 = C + D;
sum3 = sum1 + sum2;
纹波路径只有2个加法器,允许更快的建立时间,这意味着更少的纹波或瞬态消耗功率。
我很想在1行上完成所有操作,并允许综合工具对其进行优化。
sum3 = A + B + C + D;
为了省电,我会在合成时使用自动时钟门控,并使用一种效果很好的结构:
always @(posedge clk or negedge rst_n) begin
if (~rst_n) begin
sum3 <= 'b0;
end
else begin
if (start) begin //no else clause, means this signal can clk gate the flop
sum3 <= A + B + C + D;
end
end
end