如何在verilog代码中最小化路由时间

时间:2017-03-11 22:45:36

标签: verilog hdl

我写了verilog代码,当我合成它时,时序结果给出了高延迟和低频...我发现最大延迟来自一个模块中的路由时间

  

总计100.204ns(逻辑23.729ns,路线76.475ns)

下面显示延迟的模块,如何优化它以最小化延迟并提高性能

`timescale 1ns / 1ps

module ALU(aa,result,clk,ready,out,r1,r2,r3,start);


output reg [87:0] result;
output reg[9:0]out;

input [87:0] aa;
input clk,start;
output reg ready;  /// ready to load from alu to array ... from memory to array
input [87:0] r1,r2,r3;
reg [87:0] a;
//reg [87:0]a;



always@(start or aa or r1 or r2 or r3  )
begin
  if(start)
    ready=0;

  a=aa;


  if((r1[65:60]==a[83:78])&&(a[8:6]==0)) begin
    a[38:29]=r1[59:50];  // current result from other alu's
  end
  else if((r1[65:60]==a[77:72])&&(a[5:3]==0)) begin
    a[28:19]=r1[59:50];
  end
  else if((r1[65:60]==a[71:66])&&(a[2:0]==0)) begin
    a[18:9] =r1[59:50];
  end 

  if((r2[65:60]==a[83:78])&&(a[8:6]==0)) begin
    a[38:29]=r2[59:50];
  end
  else if((r2[65:60]==a[77:72])&&(a[5:3]==0)) begin
    a[28:19]=r2[59:50];
  end
  else if((r2[65:60]==a[71:66])&&(a[2:0]==0)) begin
    a[18:9] =r2[59:50];
  end 

  if((r3[65:60]==a[83:78])&&(a[8:6]==0)) begin
    a[38:29]=r3[59:50];
  end
  else if((r3[65:60]==a[77:72])&&(a[5:3]==0)) begin
    a[28:19]=r3[59:50];
  end
  else if((r3[65:60]==a[71:66])&&(a[2:0]==0)) begin
    a[18:9] =r3[59:50];
  end 

  //$display(a[38:29], a[28:19], a[18:9]);
  ready=1;
  result[87:0]=a[87:0];

  if (a[40:39]==0)                 // addition
    result[59:50]=a[38:29]+a[28:19];

  else if (a[40:39]==1)           // multiplication
    result[59:50]=a[38:29]*a[87:84];

  else if(a[40:39]==2)             // mul-add
    result[59:50]=(a[38:29]*a[87:84])+a[28:19]+a[18:9];
  else 
    result[59:50]=0;

  out=result[59:50];

end

endmodule

2 个答案:

答案 0 :(得分:0)

您需要查看合成后的静态时序报告以及后置和布线,以便正确分析设计中哪些部分花费最多时间并计算优化位置。但是,我将建议乘法器正在贡献大部分时间延迟(正如@Greg已经提到的那样)。

如果您的目标是基于FPGA的设计,那么您应该使用目前几乎所有FPGA设计中都内置的乘法器/ DSP宏之一。您可以通过直接实例化宏或通过编写代码来执行此操作,以便合成引擎将选择您想要推断其中一个块。您需要查阅特定合成引擎的文档,因为您尚未指定您在此处使用的内容。您的综合工具应该允许您检查输出网表,最好是作为原理图,以确保您实例化DSP块。

你也应该对你的设计进行计时,而不是将它全部组合起来并对其进行管道处理以分离乘法运算和加法运算。这对FPGA DSP宏非常有效。

如果您的目标是ASIC而非FPGA,您可能需要检查合成引擎如何处理乘数。可能存在编译指示(代码中嵌入的指令作为合成引擎识别的注释),它可以指导合成引擎关于您想要实现什么类型的乘法器。再一次,请至少管道乘法和加法运算。

您已将代码编写为完全组合逻辑,没有任何时钟元素。因此,合成引擎可能不会尝试优化时序,而是尝试优化面积(即使用的门数)而不关心时序,除非您在此模块之外设计了时钟。

最后,请务必留意@Karen Shaw关于准备就绪信号的评论。目前,它所产生的一切都是一个小故障,由于该信号的时序与乘法器/加法器的时序无关,因此它不会做你想做的事情。您需要为时钟逻辑设计时钟并实现就绪信号。请记住,Verilog不是一种编程语言,它是一种硬件描述语言。您正在使用代码来描述实际的逻辑门,这是您的综合引擎的输出。如果您无法想象您的合成引擎将会产生什么,您可能无法获得可用的设计。

答案 1 :(得分:0)

尝试将if-else更改为case语句。如果else语句合成到优先级编码器,则占用的路由逻辑和延迟比大小写更多,后者合成为n:1多路复用器。