在FPGA设计中,许多设计人员都习惯于使用综合工具Synplify Pro。虽然ISE软件可以不依赖于任何第三方EDA软件完成整个设计,但Synplify Pro软件有综合性能高以及综合速度快等特点,无论在物理面积上还是工作频率都能达到较理想的效果。因此如何在ISE中调用Synplify Pro综合工具,并进行无缝的设计连接仍然是设计人员需要解决的一个设计流程问题。
1. Synplify Pro综合软件的安装
下面介绍Synplify Pro的安装步骤。运行安装程序,欢迎界面过后,将出现如图4-89所示的安装选择界面,可以根据自己的需要选择相应的组件。然后按照默认选项继续即可完成安装。
图4-89 Synplify的安装选择界面
在Synplify安装完后,还需要安装Identify。在开始 程序 Synplify菜单栏中会出现“Identify 211 Installation”,双击即开始安装,一般来讲,可以按照默认选项继续,直至安装完毕。安装完之后需要添加授权的License文件,才能正常使用。
2. 关联ISE和Synplify Pro
完成了Synplify Pro安装后,需要将其和ISE软件关联后才能使用Synplify Pro进行综合。运行ISE软件,在主界面中选择“Edit|Preference”菜单项,进行“Reference”设定如图4-90所示。在弹出的 Preference对话框中选择“Integrated Tools”选项卡。该选项卡用于设定与ISE集成的软件的路径,第三项的Synplify Pro就用于设定Synplify Pro仿真软件的路径,如图4-91所示。
图4-90 选择Preference菜单项 图4-91 ISE集成工具设定页面
单击Synplify Pro文本框后面的按钮,会弹出一个文件选择对话框,选择Synplify Pro安装路径下bin目录下的“synplify_pro.exe”文件即可。
注意:在“Integrated Tools”选项卡中还可以看到其他几个可以和ISE进行无缝链接的第三方软件,如ModelSim、synplifyLeonardoSpectrum、Chip Scope Analyzer等软件。
3. Synplify Pro的使用方法简介
Synthesis 简单地说就是将HDL代码转化为门级网表的过程,其对电路的综合包括以下3个步骤:首先,HDL compilation 把HDL的描述编译成已知的结构元素;其次,运用一些算法,对设计进行面积优化和减小时延。在没有目标库的情况下,Synplify只能执行一些最基本的优化措施;最后,将设计映射到指定厂家的特定器件上,并执行一些附加的优化措施,包括根据由器件供应商提供的专用约束进行优化。工程文件以*.prj 作为扩展名,以tcl 的格式保留了以下信息:设计文件、约束文件、综合时开关选项的设置情况等。
1)Synplify Pro用户界面介绍
Synplify Pro是标准的windows应用程序,所有功能均可以通过菜单选择来实现。下面按照图4-92中数字所标示的次序,对其界面作简要介绍。图中1表示 Synplify的主要工作窗口,在这个窗口中可以详细显示设计者所创建工程的详细信息,包括工程的源文件,综合后的各种结果文件。同时如果综合完成后,每个源文件有多少错误或者警告都会在这个窗口显示出来。图中2表示TCL窗口,在这个窗口中设计者可以通过TCL命令而不是菜单来完成相应的功能。图中3 表示观察窗口,在这里可以观察设计被综合后的一些特性,比如最高工作频率等。图中4是状态窗口,它表示现在Synplify所处的状态,比如下图表示 Synplify处于闲置状态,在综合过程中会显示编译状态、映射状态等等。图中5所示的一些复选框,可以对将要综合的设计的一些特性进行设置。 Synplify可以根据这些设置对设计进行相应的优化工作。图中6是运行按钮,当一个工程加入之后,按这个RUN 按钮,Synplify就会对工程进行综合。图中7所示的是Synplify的工具栏。
图4-92 Synplify Pro综合工具示意图
2) 建立工程、添加源文件
建立工程首先需要打开Synplicity Pro。点击“开始”菜单,依次选择“程序Synplicity Synplify Pro”,启动Synplify Pro。在工程窗口中包含了以下内容:源文件信息、结果文件信息和目标器件信息。
缺省情况下,当Synplify启动时将自动建立一个新工程。这时,可以选择将工程,以新名字保存。如果结束了一个工程的操作,想新建一个工程,则可以选择“FILE NEW”;然后选择工程文件,就可以建立一个新的工程。这项操作也可以通过工具条来进行,单击工具条的P图标,则在弹出对话框选择工程文件即可。
新建工程之后,需要将源文件添加进来。点击“ADD FILE”按钮。添加源文件和约束文件。Synplify Pro把最后编译的“module/entity and the architecture”作为顶层设计,所以需要把顶层设计文件用左键拖拉到源文件菜单的末尾处或者点击“Impl Options”按钮,在Verilog属性页中设置顶层模块的名称。
3)工程属性设置
添加完源文件后需要设置工程属性,点击“Impl option”按钮出现属性页对话框,如图4-51所示。下面介绍常用的芯片设置、综合选项、约束设置以及实现结果选项等参数的配置。
图4-93 设置器件属性页
1. 首先,设置FPGA芯片信息。打开 “Device”属性页,分别设置器件厂家器件型号、速度级别和封装信息。根据设计的速度和面积要求。可以设置最大扇出系数,缺省是10000。根据该工程所属模块是否和片外有信号联系,选中或者不选中“Disable I/O insert”,如果选中该选项,则Synplify Pro不会为输入输出信号加缓冲,缺省为不选。
2. 设置通用综合选项。点击“options”属性页,选中“Symbolic FSM Compiler”,Synplify Pro会在综合过程中启动有限状态机编译器,对设计中的状态机进行优化。选中“Resource Sharing”选项,则启动资源共享;设置了资源共享后,设计的最高工作频率会低于不选中的情况,但是资源会节约很多,因此在设计能够满足时钟频率要求的情况下,一般选中以节省资源。选中“Use FSM Explorer”选项,即可以用synplify内置的状态机浏览器观察状态机的各种属性。选中“Pipelining”选项,即启动流水,在高速时钟设计中,如果其他措施都不能达到目标频率则最好选中此项。
3. 设置约束选项。点击“Constraints”属性页,设置模块最高工作频率以及添加约束文件(.sdc)。过严或是过松的约束都达不到最佳的效果。一般可先尝试通用的约束,如时钟扇出限制等;如果没有达到要求,可加入一些严格的具体约束,同时注意放松一些可以放松的约束。需要注意的是,综合约束的结果是估计值,应该以布局布线的结果为准。
4. 设置实现结果。点击“Implementation Results”属性页,设置综合结果放置的目录,综合结果的文件名称。同时一定要将“Write Vendor Constraint File”和“Write Verification Interface Format”选项选中。
4)时序约束
定义时间约束是为了让综合结果满足预期的时序要求,时间约束通常分为两类:一是通用时间约束,用于目标结构的时序要求;二是黑盒时间约束,用于在设计中指定为黑盒的模块时间约束。在Synplify Pro中,可通过SCOPE、约束文件以及综合属性和指示等3种方法添加时序。本节主要介绍利用约束文件添加约束的方法。
约束文件采用Tcl语言,以*.sdc 保存,用来提供设计者定义的时序约束、综合属性以及FPGA生产商定义的属性等。约束文件既可以通过SCOPE创建编辑也可以使用正文编辑器创建编辑可被添加到在工程窗口的代码菜单中也可以被Tcl脚本文件调用。
5)综合属性和指示
(1)综合属性和指示简介
综合指示用于控制综合中编译阶段的设计分析,因而必须加入到源代码中。属性是在编译后读入的,因而既可以在源程序中说明,也可以在约束文件中说明。约束文件提供了较大的灵活性,使得可以仅修改约束而不用重新编译源程序,因而是强烈推荐采用的方法。
在Verilog源程序中,说明指示或属性采用注释的方法语法如下:
// synthesis directive|attribute = "value"
或 /* synthesis directive |attribute = "value" */
(2)综合指示
综合指示用于通知Synplify Pro软件某些用户定制的设置,常以注释的形式出现在源代码后面,Synplify软件会自动识别相应的说明,按照用户指令完成综合。常用的综合只是如下:
① black_box_pad_pin
声明用户定义的黑盒管脚作为外部环境可见的I/O pad。如果有不止一个端口列在双引号内,则以逗号分开。由于Synplify提供了预定义的I/Os,一般不需要这一属性。其语法如下:
object /* synthesis syn_black_box black_box_pad_pin = "port_list" */ ;
例如:
module BS(D,IN,PAD,Q) /*synthesis syn_black_box black_box_pad_pin="PAD" */;
② block_box_tri_pins
声明黑盒的一个输出端口是三态,如不止一个列在双引号内,则以逗号分开。其语法如下:
object /* synthesis syn_black_box black_box_tri_pins = "port_list" */ ;
例如:
module BBDLHS(D,E,GIN,GOUT,PAD,Q) /* synthesis syn_black_box
black_box_tri_pins="PAD" */ ;
③ full_case
仅用于Verilog中的case语句,表明所有可能的状态都已经给出,不需要其他逻辑保持信号的值,其语法如下:
object /* synthesis full_case */
其中object可以是case、casex、casez、statements和declaration。
④ parallel_case
仅用于Verilog中case语句,表明生成一个并行的多路选择结构而不是一个优先译码结构。其语法如下:
object /* synthesis parallel_case */
其中object可以是case、casex、casez、statements和declaration。
⑤ syn_block_box
说明一个模块或组件为黑盒,仅利用其界面进行综合,而不管内部是否为空,也不进行优化。一般应用于厂家原语或宏或IP等用户定义的宏。其语法如下:
object /* synthesis syn_black_box */ ;
其中object可以是module和declaration。
⑥ syn_encoding
强制选择自动机实现的方式,其可选值(value)如下:
default:综合根据状态的数量选择编码方式编码方式可以是onehot gray sequential;
onehot:采用onehot编码方式;
gray:采用格雷码;
sequential:采用自然码;
safe:如果不能到达任一个状态时让其回到复位态。
syn_encoding的语法如下:
object /* synthesis syn_encoding = "value" */ ;
其中object是状态寄存器定义。
⑦ syn_isclock
说明黑盒的一个输入是时钟信号。对名字为clk 、rclk 、wclk的黑盒输入信号,软件自动当作时钟,可以用这个属性说明任意输入信号为时钟信号。其语法如下:
object /* synthesis syn_isclock = 0|1 */ ;
其中object是黑盒的input port。
例如:
module ram4(myclk, out, opcode, a, b) /* synthesis syn_black_box*/;
output [7:0] out;
input myclk /* synthesis syn_isclock = 1 */;
input [2:0] opcode;
input [7:0] a, b;
/* Other coding */
⑧ syn_keep
保证被指定的wire在综合中保持不动,不会被优化掉,常用于用define_multicycle_path或define_false_path,用了-through 选项。如果你用了这一属性,将生成一个keepbuf,可对其定义时间约束,且这个Buffer只占用一个位置,不出现在门级网表里。其语法如下:
object /* synthesis syn_keep = 0|1 */ ;
其中object是wire或reg声明。
⑨ syn_noprune
用来保持一个或多个component的实例,而不管其输出能否完成映射。一般在没有该指示的情况下,未用输出端口的实例会从EDIF文件中删除。syn_noprune可被置于约束文件中,其语法如下:
.sdc文件中:
define_attribute {module|instance} syn_noprune {0|1}
Verilog中:
object /* synthesis syn_noprune = 0|1 */ ;
其中object可以是module、declaration,也可以是实例。
⑩ syn_preserve
用在某些独立的寄存器上或模块,使模块中的所有寄存器在优化时保持不动,也可用于保持某个自动机在优化时不动。其语法如下:
object /* synthesis syn_preserve = 0|1 */ ;
其中object可以是寄存器定义信号,也可以是Module。
· syn_sharing
确定综合时是否对运算符进行资源共享。缺省值是禁止,也可以在project视窗里设置这一选项。其语法如下:
object / * synthesis syn_sharing = " on|off " */ ;
其中object可以是module定义语句。
· syn_state_machine
对设计中的某组状态寄存器进行自动机优化,其语法如下:
object /* synthesis syn_state_machine = 0|1 */ ;
其中object是该组状态寄存器。
· syn_tco<n>
提供黑盒的输出延迟信息,其语法如下:
object /* syn_tcon = "[!]clock -> bundle = value" */ ;
其中bundle是总线或标量信号的集合。
· syn_tpd<n>
提供穿过黑盒的组合逻辑的传输延迟信息,其语法如下:
object /* syn_tpdn = "[!]clock -> bundle = value" */ ;
其中bundle是总线或标量信号的集合。
· syn_tristate
指定黑盒的一个输出端口为三态端口,其语法如下:
object /* synthesis syn_tristate = 0|1 */ ;
其中object可以是黑盒的output port。
· syn_tsu<n>
说明一个黑盒的输入要求的建立时间,其语法如下:
object /* syn_tsun = "[!]clock -> bundle = value" */ ;
· translate_on/translate_off
用于与其他综合软件的兼容,这两者经常配对使用。在这两个指示中间的所有代码将在综合时被忽略,也可以用于在源代码中插入一段仿真代码。其语法如下:
/* synthesis translate_off */
综合时忽略的代码
/* synthesis translate_on */
6)综合报告解读
综合报告主要由3部分组成:编译报告、映射优化报告以及时序报告,但是该报告是冗长的,不容易快速找出用户所关心的结果。因此,Synplify公司提供了综合报告观察窗,如图4-92中第3部分所示,可从综合报告文件中取出重要的信息。该窗口的使用非常简单,点击空白的参数显示栏,在下拉栏中选择要查看的项目,则会在同行的右侧显示出结果,如图4-94所示。
图4-93 Synplify综合结果示意图