ISE—UCF文件时序约束粗浅学习

一、环境搭建

1.1 软件、芯片选型、背景说明

笔者安装的是ISE 14.7,理论上高版本可以兼容低版本。创建好工程后,芯片系列选择的是Spartan6—XC6SLX16,芯片运行速度等级为2,VHDL源分析标准为VHDL—93。
由于在生成的时序约束报告当中,精确到某条具体的电路约束这些(比如时钟驱动的同步器),未进行深入分析,是否约束成功,如何验证等问题,同时也局限于练手项目无具体时序要求等原因,全靠个人进行随意约束,本文仅限于入门了解学习,为之后可能进行板级验证的需要而提前学习。

1.2 开发板原理图

开发板原理图

工程建立好后可以在左侧工具栏新建立源文件——Implementtation Constraints Files,或者将建好的ucf文件添加进工程当中。在左侧偏上方Hierarchy里面可以看到自己的芯片选型及工程所有文件。
找到自己新建的ucf文件,双击进入编辑,或者在Tools工具栏里面,选择第一个Constrains Editor进入(新手推荐前一种)。

二、简单试验

2.1 相关知识

>#Created by Constraints Editor (xc6slx16-csg324-2) - 2022/12/29
#用户在设计输入阶段编写.ucf文件,之后设计综合生成.NCF文件,最后经过实现生成.PCF文件
#UCF文件,对信号的大小写敏感
#UCFXDC 两种约束的区别————UCF以捕获沿为基准点,观测数据在目的点的前后时延
#XDC以上游时钟发送沿为基准点,观测数据在到达目的点的过程时延
#XDC实际上为Tcl语言编写的,按顺序执行
#区域约束还可以通过 FloorPlanner 的GUI界面进行设置

ucf文件可以用#和//作为注释符,上述第一行是使用了Tools工具栏的约束编辑器,保存后自动生成的。并且该功能会自动剔除无用代码、自动排版(我遇到的是用通配符实现遍历,编译不报错,但用了该功能后自动删除掉该代码)。

2.2 工况约束

#(一)工况
//VOLTAGE = 2 V ;   
TEMPERATURE = 85 C;
CONFIG VCCAUX = 3.3; //辅助电压

NET "clk" IOSTANDARD = "LVCMOS33" ;  //输入输出引脚电平约束————MOS电压 3.3 V
NET "reset" IOSTANDARD = "LVCMOS33" ; 
NET "txflag" IOSTANDARD = "LVCMOS33" ; 
NET "RxD" IOSTANDARD = "LVCMOS33" ; 
NET "TxD" IOSTANDARD = "LVCMOS33" ; 

工况的话,某文件一般会直接指定固定温度值,但具体指什么,暂不清楚,可能是芯片整体运行的环境温度值。(暂未接触项目中的实物,即板级验证
这里用引脚电平代替。温度的话,只能选85℃,其余的均会报错(只试验了少量数据)。电压类型也分为许多,这里只用了辅助电压和管脚电平。

2.3 周期约束

#(二)周期约束——同步时序电路所有路径的延迟——除PAD到寄存器路径
NET "clk" TNM_NET = "clk_i" ;  //源码中的clk驱动的所有同步器件为一个分组 clk_i 
NET "clk" LOC = V10 |TNM_NET = clk_i; //管脚分配与分组同时完成
NET "reset" LOC = A2 |SLEW = FAST   ; //管脚分配与输出斜率(电平变化速率)控制同时完成
TIMESPEC"TS_clk_i"=PERIOD "clk_i" 20ns HIGH 50%;//时钟说明:周期为20ns,缺省默认为ns

上述第二行比第一行多了一个功能,就是在第一行分组的同时,进行管脚的分配,两行代码并不冲突,因此猜测,ucf文件可能也是顺序执行?但能力所限(没搜到),无法验证仅有这两行代码的约束结果是什么,因此只能猜测。

2.4 全局约束

#(三)全局约束
OFFSET = IN 20ns VALID 20 ns BEFORE "clk"; //定义了基于时钟 clk 的全局 OFFSET IN 的属性 
OFFSET = OUT 20ns VALID 20 ns AFTER "clk"; //在时钟沿之后20ns开始有效数据的输出

全局约束是设计整体的约束,目前猜测是顺序执行,局部约束设计后会覆盖之前的全局约束。

2.5 输入输出约束

#(四)I/O约束——不能用于内部信号,只能是顶层端口信号
#有无 RISING 的区别暂时不明、 HIGHRISING 的区别暂时不明
#关键词 VALID ————理论上数据输入(开始)时钟沿和数据接收(结束)时钟沿之间的时间间隔等于数据有效时长,
#即 VALID 后面的时间等于 INOUT 后面的时间
#TNM_NETTNM(Timing name) 在作用于网上时效果相同————该网线所在路径所有有效同步元件作为一个组GRP
#作用于 PAD NET 时效果不同————TNM 约束不能穿过IBUF,即不包括路径上的所有同步元件
INST "txflag" TNM_NET = TS_txflag;  // TNM_NET 比 TNM 更优
NET "txflag" OFFSET = IN 20ns VALID 20 ns BEFORE "clk" RISING; //虽然约束了组GRP但是没有用到

INST "RxD" TNM_NET = TS_RxD ;
//TIMEGRP "TS_RxD" OFFSET = IN 2ns VALID 5ns AFTER "clk"; //输入数据在有效时钟到达之后 ns可到达输入引脚
TIMEGRP "TS_RxD" OFFSET = IN 2ns VALID 20ns BEFORE "clk"; //数据比捕获时钟沿提前 ns到来(建立时间)

INST "TxD" TNM_NET = TS_TxD ;
#有无 HIGH 的区别暂时不明  
//TIMEGRP "TS_TxD" OFFSET = OUT 20ns AFTER "clk"; // 数据在有效时钟沿后20ns保持稳定/开始输出(保持时间)
TIMEGRP "TS_TxD" OFFSET = OUT 5ns BEFORE "clk" HIGH; // 下个时钟沿到来之前的5ns必须输出

猜测:不写的话,默认是上升沿,RISING 和 HIGH 作用相同。
ISE的时序约束编辑器,只给了HIGH的选择,无RSING。不清楚建立时间和保持时间可参考往期文章,面试准备。

2.6 组间约束

#(五)组间约束
#两个同步模块之间的时序约束
//TIMESPEC "TS_name"= FROM "TS_txflag" TO "TS_RxD" 1000ns; //可以是具体值或者表达式

组间约束很少用到。是两条时序路径之间的数据前后出发的时间间隔,先后顺序。

2.7 特定路径最大延时约束

#(六)特定路径最大延迟约束
NET "clk" MAXDELAY = 5ns ; //以时钟驱动的路径上的最大延迟为5ns

有时候因为某种原因(暂不明),导致同一个复位信号,在不同的时间节点上开始复位,造成延迟(竞争冒险?——不上板,不添加约束文件也会出现这个问题吗?),此时需要用到。

2.8 管脚约束

#(七)管脚约束
#使用LOC完成端口定义时,NET(不区分大小写)其后的信号名称为用户设计中顶层模块的信号端口
NET "txflag" LOC = P7  ;
NET "RxD"    LOC = B2  ;
NET "TxD"    LOC = C4  ;
NET "clk"    LOC = V10 ;
NET "reset"  LOC = A2  ;

管脚具体是那些,需要参考原理图(本文开头有链接)。

2.9 位置约束

#(八)位置约束————暂时用不上—————区域约束可以通过 FloorPlanner 的GUI界面进行设置
#多位置约束并非将设计定位到所有的位置上,而是在布局布线过程中,布局器任意挑选其中一个作为最终的布局位置
#LOC 可通过加载不同属性约束管脚、CLB、块RAM、全局时钟、锁相环、DCM模块等,基本涵盖FPGA中所有类型的资源
//INST "XX" RLOC_ORIGIN=location ;
//INST "XX" RLOC = location ;
//INST "XX" LOC = CLEXL_X17Y9,location2 ; //位置可为任一或多个合法位置

//INST "X" AREA_GROUP = reg;
//INST "Y" AREA_GROUP = reg;
//INST "Z" AREA_GROUP = reg;
//AREA_GROUP reg RANGE = CLEXL_X1Y1 : CLEXL_X1Y6 ; //将寄存器 X、Y、Z 放在指定区域中
//INST "XX" LOC = location1:location2 ; //范围定位 

芯片的不同导致FloorPlanner 的GUI界面里面的名称不同,本文所用芯片为
CLEXL_XxYy。

2.10 其他约束

#(九)其他约束
NET "txflag" PULLDOWN ; //下拉约束,让该信号输出低电平,避免在无驱动时三态门输出悬空
//NET "XX" PULLUP ; //上拉约束,让该信号输出高电平,避免在无驱动时三态门输出悬空
INST "reset" DRIVE = 4 ; //
NET "reset" SLEW= "FAST" ; //输出斜率控制约束,提高设计信号完整性
//NET "reset" SLEW= "SLOW" ; 
//NET "reset" SLEW= "QUIETIO" ; //仅用在 Spartan—3A 

暂不清楚输出斜率控制的作用,根据字面意思也不方便推测。

2.11 通配符

#(十)通配符————"*""?""*"可表示任意字符串及空,"?"表示某个字符
NET "*rese?" FAST ; //对所有包含 "rese" 并且以任意一个字符结尾的信号,提高其速率
//NET "*rese?" SLEW= "FAST" ;
//INST "/UART/*" LOC = CLB_r*c7 ; //把 UART 层次中的所有实例放在第七列的CLB中
//通配符的遍历功能疑似语法错误

使用通配符实现遍历功能,貌似不可行,不知问题出在哪里。ISE自带的约束编辑器会自动删除掉这些代码。

参考

不足之处欢迎补充讨论。

  1. ise 时钟约束_在ISE下分析和约束时序
  2. 关于SDC时钟约束的事
  3. XDC约束技巧–时钟
  4. Xilinx UCF约束语法一
  5. ISE约束–UCF编辑的入门介绍[zz]
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值