|
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_true_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-94 Synplify综合结果示意图
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?我要注册
x
|