《电子技术应用》
您所在的位置:首页 > 可编程逻辑 > 业界动态 > 用设计约束实现FPGA性能的最优化

用设计约束实现FPGA性能的最优化

2009-06-17
作者:Troy Scott

  摘  要: 除了硬件描述语言本身的功能之外,设计约束是影响FPGA性能的重要因素。合理的设计约束能帮助设计者在设计流程的各个相应阶段通过优化来满足设计目标。本文以莱迪思公司的FPGA设计工具为例,论述如何用设计约束实现FPGA性能最优化。
  关键词: FPGA;设计约束;综合约束;后端约束

 

  除了硬件描述语言本身的功能之外,设计约束是影响FPGA性能的第二大因素。许多设计者没有花费足够的时间进行约束设计,而是在设计流程中试图通过各种各样的布局布线工具选项和手工布局来实现时序要求。这些方法不仅费时,而且在设计的下一个版本中存在不能工作的可能。合理的设计约束能帮助设计者在设计流程的各个相应阶段通过优化来满足设计目标。
  FPGA设计约束表达了超越硬件描述语言的设计意图。最普通的是目标器件的时序特性,此外还包括针对设计优化的指示、I/O编程,或者物理布局。本文以莱迪思公司的FPGA为例进行说明,所论述的大多数技术同样适用于其他可编程集成电路设计工具。
数据流程的综合与实现
  图1为基于Synplicity公司的Synplify和莱迪思半导体公司的ispLEVER FPGA设计工具的约束数据流程,其中特别强调了约束流程。通过图形编辑器对SCOPE和 Design Planner进行约束,或者将VHDL属性和Verilog注释嵌入到硬件描述语言的源代码中,还可以将硬件描述语言与约束编辑器组合以指导综合与布局布线工具。

 


  第一个处理模块为Synplify编译器和综合算法。基于硬件描述语言的约束与Synplicity设计约束(SDC)文件直接用于Synplify优化与综合引擎。时序约束指导嵌入式时序分析、逻辑优化算法,同时映射出控制约束指示在目标网表中所使用的库类型。
  实现综合之后,得到后端工具所用的设计约束。ispLEVER Design Planner用来表达时序目标和许多物理实现细节,例如I/O与物理布局。在设计映射阶段使用Lattice LPF约束文档进行I/O编程与时序优化。将硬件描述语言中产生的ispLEVER的约束合并至基于LPF的约束,并写至PRF文档。对post-synthesis网表的任何逻辑引用都自动地翻译成物理单元,如FPGA的Slices、DSP或者EBR块。物理参考文件用于布局与布线,以及静态时序分析工具,这些都是FPGA实现工具的一部分。布局与布线之后,通常会将更加精确的时序反注至综合阶段。黑盒IP时序和布线延时改进了综合时序分析的精确性。
  Synplicity在指示与属性约束之间做出了区分。指示影响了映射优化,时序约束用来定义时钟、I/O时序、时钟或路径之间的多周期关系及例外的时序。为了使代码尽可能简洁,在SDC文件中保留了时序约束。嵌入在硬件描述语言中的时序约束通常为黑盒子的IP核所保留,综合时序分析器不能得到这些细节。在这些情况下,IP供应商经常会提供用于分析的时序细节。
  图形约束编辑器SCOPE提供了方便的初始化方法,以浏览设计信号、指定时序约束。编辑器输出以ASCII SDC格式存储。图2为Synplify SCOPE约束编辑器的界面。


  时序约束应该覆盖设计的基本特性,例如clock、I/O延时和异步路径的点对点延时。如果一个时钟域传递数据到另外一个域,则应该用多周期类型优先选择定义所需要的周期数。下面以Synplify SCOPE建立的SDC文档为例说明这一点。
Synplify SDC文档:
//Clock with specific duty cycle and
period goal
define_clock{CLK1}-period 10.0-clock-
group default_clkgroup
//I/O delays of top-level ports
define_input_delay{porta[7:0]}7.8-ref
clk1:r
define_output_delay{portb[7:0]}10-ref
clk1:r
//Point-to-point delay
define_path_delay-from {i:dmux.alua[5]}-
 to{i:regs.mem_regfile_15[0]}max 0.800
//Multi-clock cycle conditions
define_multicycle_path-from{i:regs.addr
  [4:0]}-to{i:special_regs.w[7:0]}2
  Synplify SDC提供了丰富的词表来定义并编译逻辑相关的设计单元,包括I/O端口、时钟网络以及同步RTL结构推出的寄存器单元。在编译期间,Synplify进行静态时序分析,包括针对所有时钟、时钟关系以及接口时序的性能报告。虽然结果没有后布局布线结果那么精确,但是作为性能的重要指示,它提供了针对时序逼近的重要检测点,是满足最终速度目标的一个好的指示器。Synplify报告文件如图3所示。


  对于Synplify,可通过数个编译器进行优化约束。流行的控制类型有状态机编码、分层保持以及存储器工艺目标。这里以状态机编码为例说明编译器约束。Synplify FSM编译器特性根据状态机的数目设定编码类型:如果状态机状态多达4个,针对非常紧凑的实现,可采用时序编码;如果状态机状态多达5~40个,将产生高性能的独热编码(OHE);超过40个状态将产生格雷码。如果有特殊的设计要求,则根据不同的情况来控制有限状态机编码,以状态寄存器声明中的syn_encoding为指示。
VHDL实例:
library synplify;
use synplify.attributes.all;
package my_states is
type state_type is(Xstate,st0,st1,st2,
st3,st4,st5,st6,st7,st8,st9,st10,st11,
st12,st13,st14,st15);
signal state:state_type;
attribute syn_encoding of state:signal is ″gray″;
end my_states;
  该包声明了自定义的数据类型“state_type”、state_type类型的信号,syn_encoding属性设置促成状态寄存器的格雷码。
  在输出的log文件中,Synplify给出了每个编码状态机FSM的报告:
Finished RTL optimizations(Time elapsed
0h:00m:00s;Memory used current:50MB
peak:51MB)
Encoding state machine work.fsm(rtl)-_work_my_states_state_1[0:16]
original code -> new code
 00000000000000001 -> 00000
 00000000000000010 -> 00001
 00000000000000100 -> 00011
 00000000000001000 -> 00010
 00000000000010000 -> 00110
 00000000000100000 -> 00111
 00000000001000000 -> 00101
 00000000010000000 -> 00100
 00000000100000000 -> 01100
 00000001000000000 -> 01101
 00000010000000000 -> 01111
 00000100000000000 -> 01110
 00001000000000000 -> 01010
 00010000000000000 -> 01011
 00100000000000000 -> 01001
 01000000000000000 -> 01000
 10000000000000000 -> 11000
  输出报告证实,基于SDC与HDL的约束改进了综合的结果。

FPGA布局布线后端约束
  ispLEVER实现工具的约束覆盖了时序性能与设计实现的许多方面。首先约束写到寄存器传输级,或者门、端口以及从RTL推出的网表;然后约束写到FPGA的物理单元,例如可编程功能单元、针对存储器的嵌入式ASIC块,或者DSP与可编程I/O单元。后端约束通常用来定义I/O编程、I/O布局与时序目标。它们可以定义可编程块的参数,如存储器或PLL/DLL电路。约束可以指导逻辑布局、器件布局,以及针对模块设计流进行设计分割。与综合约束相同,后端约束基于硬件描述语言或者ASCII文本文件。
  ispLEVER的Design Planner提供图形接口以浏览post-synthesis网表的内容,写约束根据端口、网表、寄存器和ASIC块设定。
  时序约束应该覆盖基本的约束特性,包括时钟、I/O延时以及点对点延时。约束时序目标通常作为一种手段来提高综合与布局布线的等级。实际上可以保留约束文件的多个版本,在约束文件中应该针对逻辑优化,其余的完全用于静态时序分析,使用“real”结束时序。下面以Design Planner建立的LPF文档为例说明普通的时序情况。ispLEVER报告文件如图4所示。

 

ispLEVER LPF 文档:
# Clock with specific duty cycle and
period goal PERIOD PORT “CLK1”
10.0 ns;
# I/O delays of top-level ports
INPUT_SETUP“porta[7:0]”7.8 ns CLKPORT“clk1”;
CLOCK_TO_OUT“portb[7:0]”10 ns CLKPORT“clk1”;
# Point-to-point delay
MAXDELAY FROM CELL“dmux”TO CELL“regs”0.800 ns;
# Multi-clock cycle conditions
MULTICYCLE“M1”FROM CELL“regs”TO CELL special_regs 2X;
# Ignore during timing analysis,lower
priority BLOCK NET FROM CELL“myInst1_reg”TO CELL “myInst3_reg”;
  硬件描述语言中的一些属性可用于指导FPGA实现。常用的控制类型有I/O位置、逻辑“don′t touch”类型指示与逻辑组合。为了说明基于硬件描述语言的后端约束,考虑逻辑组合属性-分层组合(HGROUP)指导布局算法,将组的成员在器件中接近放置,这种类型的属性有助于改进时序,使得并行运行的结果更加一致。
VHDL实例:
attribute HGROUP:  string;
attribute BBOX:    string;
attribute HGROUP of struct: architecture
is ″pgroup1″;
attribute BBOX   of struct: architecture
is ″5,15″;
  这个属性定义了一个与结构相关的标志“pgroup1”。结构体的所有逻辑约束行高为5,列宽为15的边界框,此区域用目标器件的行和列单元表示。
  进一步考虑LPF中的布局。例如:
  # Anchor pgroup1
  LOCATE HGROUP″pgroup1″
  SITE R11C2D;
  这个优选指示放置器锚定以5×15边界的NW角,位于目标器件的第11行、第2列。如何组合硬件描述语言与基于LPF的后端约束是指导布局的非常有效的办法。确保组的内容,根据源代码的内容自动地更新,使硬件描述语言更加简捷。
用设计约束起步
  为了在设计之初定义可实现的参数,综合与实现后端产生的分析报告显得尤为重要。下面的报告将帮助加速关键的后端约束定义。
时序约束
  根据Synplify综合报告,针对时钟与I/O时序的约束取决于布线拥堵情况。从综合估计中可以发现变化的程度,期望目标速度为综合报告的±20%。
I/O Plan
  初始状态下,为I/O定义信号标准,并尽可能对包作浮动指定。考虑信号标准支持,根据器件组的变化,采用自动布局法寻找合适的布局。引脚接口稳定时,反注指定LPF优选文件。
  图5展示了在Design Planner Floorplan View中如何实现时序和I/O约束。

Floor Plan
  用基于初始、low-effort的“flat”布局来指导floor plan。突出层次分支以决定使用的分支。基于数据流确定PIO的位置和区域的相对位置。图6展示了Design Planner Floorplan View中突出层次分支的情况。

 


  FPGA设计约束表达了超越硬件描述语言的设计目的,对优化器件的性能发挥了主要作用。约束规划应覆盖针对时钟与I/O的关键时序目标,以及多周期关系与设计的时序期望。约束可以以设计单元表示,通过提取改变级数,从RTL到post-synthesis块以及网表,使用混合的基于HDL与SDC、或者LPF的约束是最有效的约束设计方法。

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。