我必须实现一个串行执行 A+B+C+D 的电路。
A 和 B 使用第一个加法器相加,结果使用第二个加法器添加到 C,最后使用第三个加法器将结果一个接一个地添加到 D。
问题是,为了使设计低功耗。我必须关闭其他两个未使用的加法器。我能想到的只是启用和禁用信号,但这会导致延迟问题。
我如何在verilog中以有效的方式综合它?
A、B、C、D 可能会在每个时钟周期发生变化。开始信号用于指示何时需要进行新计算。
我必须实现一个串行执行 A+B+C+D 的电路。
A 和 B 使用第一个加法器相加,结果使用第二个加法器添加到 C,最后使用第三个加法器将结果一个接一个地添加到 D。
问题是,为了使设计低功耗。我必须关闭其他两个未使用的加法器。我能想到的只是启用和禁用信号,但这会导致延迟问题。
我如何在verilog中以有效的方式综合它?
A、B、C、D 可能会在每个时钟周期发生变化。开始信号用于指示何时需要进行新计算。
我假设您的加法器已通过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