tcl学习之路(五)(Vivado时序约束)

news2025/1/25 1:52:37

1.主时钟约束

  主时钟通常是FPGA器件外部的板机时钟或FPGA的高速收发器输出数据的同步恢复时钟信号等。下面这句语法大家一定不会陌生。该语句用于对主时钟的名称、周期、占空比以及对应物理引脚进行约束。

create_clock -name <clock_name> -periood <period> -waveform {<rise_time> <fall_time>} [get_ports <port_name>]

  在设计中,未约束的时钟可以通过时钟网络报告和时钟确认报告查看。在打开综合和实现设计后,输入如下指令:

report_clock_networks
check_timing

  对于将高速传输器(gt)的输出时钟网络作为主时钟约束,命令如下:

creat_clock -name rxclk -period 6.667 [get_nets gt0/RXOUTCLK]

  对于一些硬件原语的输出时钟引脚,若与其输入时钟之间没有很强的因果关联性,也可以将这个硬件原语的输出引脚作为时钟源进行主时钟约束。
  对于差分时钟,只需要对差分缓冲器的输入正端(sys_clk_p)进行主时钟约束即可。若同时对正负端进行约束,会导致不真实的CDC(clock domain crossing)路径产生。
  对于MMCM和PLL,系统会自动生成相应的约束文件,不需要手动约束。
  在一些时序路径中,如一些引脚上的数据信号,其同步时钟只存在于外部芯片,并不存在于FPGA器件内。这种情况下,为了时序分析的需要也必须定义一个时钟用于描述时序数据引脚的外部时钟信号,这个时钟就是虚拟时钟。虚拟时钟的约束不需要引脚。

create_clock -name clk_virt -period 10

2.时钟特性约束

  对于时钟抖动的约束有以下两条 ,其中set_input_jitter只能约束主时钟,set_system_jitter对系统抖动进行定义。

set_input_jitter [get_clocks <clock_name>] <jitter_in_ns>
set_system_jitter <clock_name> <jitter_in_ns>

  除时钟抖动以为的所有可能影响时钟周期性偏差的因素,都可以使用set_clock_uncertainty命令进行约束定义。也称用户不确定性。

set_clock_uncertainty -<setup/hold/空出来表示两者都有> -from [get_clocks <clock0_name>] -to [get_clocks <clock1_name>] <uncertainty_value> 

  对于时钟延时约束,有以下命令:

set_clock_latency [-clock <args>] [-rise] [-fall] [-min/max/空出来表示两者都有] [-source] <latency> <objects>

3.衍生时钟约束

  衍生时钟主要是指由已有的主时钟进行分频、倍频或者相移而产生出来的时钟信号,如由MMCM或一些设计逻辑所驱动产生的时钟信号。一般Vivado的时序工具能够自动产生正确的衍生时钟,若设计者认为自动产生的衍生时钟有误,也可以手动进行衍生时钟的约束。

create_generated_clock -name <generated_clock_name> -source <master_clock_source_pin_or_port> -multiply_by <mult_factor>\
                       -divide_by <div_factor> <pin_or_port>

4.IO接口约束

  IO接口的时序约束主要包括set_input_delay和set_output_delay,输入输出约束差不多,主要约束如下:

set_input_delay -clock<args> -reference_pin<args> -clock_fall -rise -max -add_delay <delay> <objects>
#下面对命令进行解释
-clock 用于指定约束引脚的同步时钟(源时钟),其后的<args>即需要指定的同步时钟名称,这个时钟可以是设计中事先定义的主时钟或虚拟时钟。
-reference_pin 用于指定延时值<delay>的参考时钟,其后的<args>即需要指定的参考时钟名称。该项是可选项,不指定该选项,则指定延时值的参考时钟就是-clock指定的同步时钟。
-clock_fall 指定输入延时约束取值相对于同步时钟的下降沿。若不指定,默认为-clock_rise
-rise 指定约束信号相对时钟的边沿关系是上升沿,也可以用-fall指定为下降沿
-max 设定最大延时值,也可以是-min最小值。若不指定,则是最大最小值都包括
-add_delay 用于多组参考组合的输入引脚约束
<delay> 设定延时值
<objects> 指定约束的目标输入引脚名称

  关于输入延时的计算如下:

set_input_delay(max)= -Tc2j_pcb(min) + Tco(max) + Td_pcb(max)
set_input_delay(min)= -Tc2j_pcb(min) + Tco(max) + Td_pcb(min)
其中c2j_pcb代表时钟源在pcb上的走线延时,d_pcb为数据在pcb上的走线延时,co为外部芯片数据引脚输出数据所经过的延时,查芯片手册可以获得。
set_output_delay(max)= Td_pcb(max) - Tc2j_pcb(min) + Tsu
set_output_delay(min)= Td_pcb(min) - Tc2j_pcb(min) - Th 

5.时钟例外约束

  进行时序例外约束的原因:时序分析工具默认的时序检查方式可能与工程实现的实际情况不符合(通常是约束过紧,可能导致时序失败)。因此,设计者需要额外增加一些约束命令,用于调整既有的时序检查方式,以保证时序工具的时序检查与实际情况一致。
  进行时序例外约束的典型例子:1.异步时钟域路径,通常可以使用时钟分组约束或虚假路径约束以及多周期约束。2.某些逻辑的时序单元并非每个时钟周期都及进行数据采样传输,此时可以使用多周期约束,适当放宽这些路径的约束 。3.有时设计中希望对时序路径施加更紧的约束,以获得更大的时序余量,此时可以使用最大/最小延时约束。4.某些组合路径是静态的(赋值不变)或不需要进行时序约束,此时可以使用虚假路径约束忽略这些路径。

5.1多周期约束

  多周期约束语法如下:

set_multicycle_path <path_multiplier> -setup/hold -start/end -from <startpoints> -to <endpoints> -through <pins/cells/nets>
#
-start和-end用于指定约束命令的周期参数是以源时钟还是以目标时钟作为参考时钟。

  对于源时钟和目标时钟同频同相的时序路径分析,是否使用-start和-end是没有头差异的。
  保持时间的时钟周期数=建立时间的<path_multiplier>参数-1-保持时间的<path_multiplier>参数。在一般情况下,若只对setup进行set_multicycle_path约束,则保持时间的<path_multiplier>参数默认为0,也就是保持时间的时钟周期数默认和建立时间的<path_multiplier>参数相差一个时钟周期。那么仅对setup进行约束,则建立时间和保持时间关系同时向右移动<path_multiplier>参数-1个时钟周期,若加上对hold的<path_multiplier>参数约束,则保持时间关系会向左移动hold的<path_multiplier>参数个时钟周期,从而达到多周期约束的效果。
  下面给出示意图。
  当约束仅为set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]时,图形如下:
在这里插入图片描述  当约束为set_multicycle_path 2 -setup -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]和set_multicycle_path 1 -hold -from [get_pins data0_reg/C] -to [get_pins data1_reg/D]时,图形如下:
在这里插入图片描述  对于同频异相的时钟,在默认情况下时序工具会寻找与clk1相邻最近的clk2时钟上升沿,并以clk1和clk2相对时间最短(时序要求最高,即最坏情况)的一组时钟沿的时序路径进行分析。此时,使用如下约束命令进行调整:

set_multicycle_path 2 -setup -from [get_clocks CLK1] -to [get_clocks CLK2]

  对于慢时钟域到快时钟域或者快时钟域到慢时钟域有异曲同工之妙,需要注意的是-start和-end的确认,下面给出这两种情况的通用约束方法。

#慢-快
set_multicycle_path N -setup -end -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path N-1 -hold -end -from [get_clocks CLK1] -to [get_clocks CLK2]
#快-慢
set_multicycle_path N -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2]
set_multicycle_path N-1 -hold -start -from [get_clocks CLK1] -to [get_clocks CLK2]

5.2虚假路径约束

  所谓虚假路径,是指该路径是设计中的非功能路径或没有任何时序要求的路径。做虚假路径约束的原因:可以减少编译时间,同时腾出有限的布局布线资源,用于提升整体的时序性能。常见的虚假路径包括:1.已经做过同步处理的跨时钟域路径。2.上电后只做一次初始化写入 寄存器路径。3.复位或测试逻辑路径。4.某些实际并不存在的时序路径。例如,设计中的两个异步是哦只能怪域之间的数据通信已经使用双寄存器锁存等方式进行同步了,就可以使用虚假路径约束关闭这两个时钟之间的数据路径检查。约束的基本语法如下:

set_false_path -setup/hold -from <node_list> -to <node_list> -through <node_list>
#对于两个或多个相斥时钟做约束推荐用法
set_clock_groups -group CLKA -group CLKB

5.3最大/最小延时约束

  最大延时约束将覆盖默认的建立时间分析的最大路径延时值。最小延时约束将覆盖默认的保持时间分析的最小路径延时值。基本约束语法如下:

set_max_delay <delay> -datapath_only -from <node_list> -to <node_list> -through <node_list>
set_min_delay <delay> -from <node_list> -to <node_list> -through <node_list>

  其中,-datapath_only只能用于含有-from选项的set_max_delay约束命令中。该选项会将时钟偏斜考虑移除,同时会将约束路径的保持时间检查设置为false路径,相当于同时对此路径自动生成了set_false_path -hold约束。也就是说,若对同一路径进行set_min_delay约束,将会被忽略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/903535.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

电影《孤注一掷》感触、计算机底层二进制与十进制的转换

今天&#xff0c;我与媳妇一同在商场吃完午餐&#xff0c;正值天空绵绵细雨。近期&#xff0c;听闻一部名为《孤注一掷》的电影&#xff0c;其主人公是一位程序员&#xff0c;故事情节围绕境外电信诈骗展开&#xff0c;引发了广泛的关注。身为一名程序员&#xff0c;我对与电信…

DSO 系列文章(2)——DSO点帧管理策略

文章目录 1.点所构成的残差Residual的管理1.1.前端残差的状态1.2.后端点的残差的状态1.3.点的某个残差的删除 2.点Point的管理2.1.如何删除点——点Point的删除2.2.边缘化时删除哪些点&#xff1f; 3.帧FrameHessian的管理 DSO代码注释&#xff1a;https://github.com/Cc19245/…

Vulnhub: DriftingBlues: 2靶机

kali&#xff1a;192.168.111.111 靶机&#xff1a;192.168.111.207 信息收集 端口扫描 nmap -A -sC -v -sV -T5 -p- --scripthttp-enum 192.168.111.207 80端口的/blog目录为wordpress wpscan收集wordpress用户和爆破密码 wpscan --url http://driftingblues.box/blog -e…

深入理解Linux内核--回收页框

页框回收算法 Linux中有一点很有意思&#xff0c;在为用户态进程与内核分配动态内存时&#xff0c;所作的检查是马马虎虎的。 比如&#xff0c;对单个用户所创建进程的RAM使用总量并不作严格检查(第三章的“进程资源限制”一节提到的限制只针对单个进程); 对内核使用的许多磁盘…

【数据结构】链表的回文结构

文章目录 &#x1f30f;引言&#x1f9ed;[链表的回文结构](https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking)&#x1f6a9;&#x1f6a9;题目描述&#xf…

学习网络编程No.3【socket理论实战】

引言&#xff1a; 北京时间&#xff1a;2023/8/12/15:32&#xff0c;自前天晚上更新完文章&#xff0c;看了一下鹅厂新出的《扫毒3》摆烂至现在&#xff0c;不知道是长大了&#xff0c;还是近年港片就那样&#xff0c;给我的感觉不是很好&#xff0c;也可能是国内市场对港片不…

XXL-JOB任务调度中心后台命令执行漏洞

漏洞描述 XXL-JOB任务调度中心后台存在命令执行漏洞,攻击者可在后台通过写入shell命令任务调度获取服务器控制权限 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权…

AndroidAGP8.1.0和JDK 17迁移之旅

AndroidAGP8.1.0和JDK 17迁移之旅 前言&#xff1a; 由于我最近写demo的直接把之前的项目从AGP4.2.2升级到8.1.0引发了一些列问题&#xff0c;这里记录一下&#xff0c;前面讲解过迁移DSL方式遇到的问题&#xff0c;这次升级8.1.0也比之前顺利多了&#xff0c;想看DSL迁移的可…

Edge浏览器免费使用GPT3.5

搜索sider,安装Sidebar插件 注册账号即可每天免费使用30次。 Sider: ChatGPT侧边栏,GPT-4, 联网, 绘图

Excel VBA 复制除指定工作表外所有的工作表的内容到一张工作表中

当我们有一张表里面有很多sheet 具有相同的表结构&#xff0c;如果需要汇总到一张表中&#xff0c;那么我们可以借助VBA 去实现汇总自动化 Sub 复制所有工作表内容()Dim ws As WorksheetDim targetSheet As WorksheetDim lastRow As Long 设置目标表格&#xff0c;即要将所有…

SpringMVC之@RequestMapping注解

文章目录 前言一、RequestMapping介绍二、详解&#xff08;末尾附源码&#xff0c;自行测试&#xff09;1.RequestMapping注解的位置2.RequestMapping注解的value属性3.RequestMapping注解的method属性4.RequestMapping注解的params属性&#xff08;了解&#xff09;5.RequestM…

课程项目设计--项目建立--宿舍管理系统--springboot后端

前要 项目设计–宿舍管理系统 文章目录 项目建立导入依赖配置文件配置目录结构config配置mybatis-plusswagger 生成实体、mapper和servicebaseEntity统一响应实例响应码接口响应码接口实现统一响应result统一分页响应 项目建立 太长了&#xff0c;修改一下 导入依赖 暂时先加…

Java 项目日志实例:Log4j2

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ Apache Log4j 2 是对 Log4j 的升级&#xff0c;与其前身 Log4j 1.x 相比有了显着的改进&#xff0c;并提供了许多 Logback 可用的改进&#xff0c;同时支持 JCL 以及 SLF4J…

Word中对象方法(Methods)的理解及示例(上)

【分享成果&#xff0c;随喜正能量】奋斗没有终点,任何时候都是一个起点&#xff0c;沉潜是为了蓄势待发&#xff0c;沉潜是为了等待因缘。鲸豚沉潜于大海&#xff0c;幽兰深藏于山谷&#xff0c;能够经得起沉潜的人&#xff0c;才会有更高的成就。正如一年的树木只能当柴烧&am…

C++入门:函数缺省参数与函数重载

目录 1.函数缺省参数 1.1 缺省参数概念 1.2 缺省参数分类 2.函数重载 2.1 函数重载概念 2.2 C支持函数重载的原理 1.函数缺省参数 1.1 缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实 参则采用该形参的…

Unity 之 RaycastHit(存储射线投射操作)

文章目录 总述具体使用场景 总述 RaycastHit 类是 Unity 中的一个结构&#xff0c;用于存储射线投射操作的结果。射线投射是一种常用的技术&#xff0c;用于检测场景中的碰撞、获取碰撞点、获取碰撞对象的信息等。RaycastHit 提供了关于射线与场景中对象的交互信息&#xff0c…

新型Windows内核池风水利用工具研究

引用 这篇文章的目的是介绍一种新型基于内核态分页内存和非分页内存的越界写入通用利用技术和相关工具复现. 文章目录 引用简介分页模式利用分析分页模式利用调试分析非分页模式利用分析非分页模式利用调试分析工具使用方法工具使用效果相关引用参与贡献 简介 笔者的在原作者利…

硕士研究生小论文写作方法

本人985硕博毕业-曾多次辅导本硕同学完成成毕设&#xff0c;下面分享一些经验 图为当年大论文外审结果&#xff01;&#xff01;&#xff01; 当撰写一篇硕士研究生的小论文时&#xff0c;以下是每个部分的写作方法的详细描述&#xff0c;&#xff1a; 摘要&#xff08;Abst…

零基础在家就可以做的副业,3个兼职项目推荐

做副业最需要注重的是什么&#xff1f;我觉得有收益&#xff0c;稳定&#xff0c;上手快&#xff0c;可以学到东西&#xff0c;下面3个副业适合新手快速变现的副业&#xff0c;大可以随便挑一两个尝试一下 第一个&#xff1a;在小红书的发手记 满5000粉丝们就可以申请品牌合作…

OMT画图的五种结构表达方式

实例化&#xff1a;A类依赖于B类。 class B {doSth () {} }class A {constructor () {}run () {const b new B()b.doSth()} }new A().run()委托&#xff1a;A对象依赖于B对象。 class B {doSth () {} } const b new B()class A {constructor () {}run () {b.doSth()} } new A…