Verilog关键路径

时间:2015-03-08 08:39:27

标签: performance verilog system-verilog

我已经确定以下是我的关键路径(SHA1算法)

h0 <= h0 + A;
h1 <= h1 + B;
h2 <= h2 + C;
h3 <= h3 + D;
h4 <= h4 + E;

当我评论这部分代码时,我的Fmax大约是300Mhz,但有了它,它大约是100Mhz。我是否正确假设反馈回路导致Fmax下降?或许还有其他一些原因?有哪些策略可以缓解这个问题,我该如何实现它们呢?

2 个答案:

答案 0 :(得分:2)

需要更多代码以及您要合成的架构的特定信息才能获得更准确的答案。

至于你的上一个问题,标准策略是最小化寄存器之间的组合逻辑数量。也就是说,应用管道。对于您的代码,这将用作:

t0 <= h0 + A;
t1 <= h1 + B;
t2 <= h2 + C;
t3 <= h3 + D;
t4 <= h4 + E;
h0 <= t0;
h1 <= t1;
h2 <= t2;
h3 <= t3;
h4 <= t4;

但是,仅仅补充一点,我怀疑这里有一个改进。回想一下,组合块(即加法器)仍在那里。

假设您的目标架构无法实现快速大型加法器,只需快速小型加法器,并且您的寄存器非常广泛。然后你可以将每个大的加法分成可以使用可用资源执行的小的并行加法,但我怀疑编译器本身不会这样做。

reg [127:0] a,b,c;

always @(posedge clk)
  a <= b + c

变为:

reg [63:0] ah,al;
reg cy;
reg [127:0] a,b,c;

always @(posedge clk) begin
  {cy,al} <= b[63:0] + c[63:0];
  ah <= b[127:64] + c[127:64];
  a <= {ah+cy, al};
end

答案 1 :(得分:0)

看起来您正在实施this algorithm,在循环中生成a, b, c, d, and e,迭代80次。如果是这样,您需要注意综合工具展开循环。这意味着如果您尝试在组合块中创建a, ..., e,则将展开循环的整个80次迭代以在单个时钟中合成,这将创建大量加法器并创建非常长的数据路径作为一个非常高的领域。我怀疑这是你的频率降低的原因。

这可以通过管道衬里解决,mcleod_ideafix提到,但作为一个更简单的解决方案,没有流水线,你可以创建一个状态机,在多个循环中部分执行循环。例如,只需引入一个状态位,就可以在一个时钟内计算从0到39的循环,存储部分结果,然后在下一个时钟中计算40到79。这样整个算法将花费2个时钟周期,您将使用加法器区域的一半。

您可以通过在单个时钟周期内计算循环的每次迭代来扩展它。使用计数器变量计算迭代次数并计算部分a, ..., e。当计数器达到80时,计算h0 to h4。这样整个算法将需要80个时钟周期:延迟,面积和频率之间的经典权衡。