Xillinx的设计约束阅读整理

news2025/4/4 1:20:29

《适用于FPGA和SOC的UlteraFast设计方法指南》(UG949)
《Vivado Design Suite 用户指南:设计分析与收敛技巧》(UG906)
《Vivado Design Suite 用户指南:使用约束》(UG903)
《Vivado Design Suite Tcl 命令参考指南》(UG835)
约束文件读取顺序,工程模式下,使用reorder_files的TCL命令来修改约束文件的顺序

时序约束总体应该遵循的顺序:
## Timing Assertions Section
# Primary clocks
# Virtual clocks
# Generated clocks
# Delay for external MMCM/PLL feedback loop
# Clock Uncertainty and Jitter
# Input and output delay constraints
# Clock Groups and Clock False Paths
## Timing Exceptions Section
# False Paths
# Max Delay / Min Delay
# Multicycle Paths
# Case Analysis
# Disable Timing
使用多个XDC文件时,必须特别留意时钟定义,并确认从属关系排序是否正确

综合约束使用的名称必须来自细化的网表(最好是端口和时序单元)。某些 RTL 信号会在细化过程中消失,并且无法为其赋予 XDC 约束。此外,由于细化后执行的各种最优化,信号线或逻辑单元将合并到各种技术原语(例如,LUT 或 DSP 块)中。要了解详细设计对象的名称,单击 Flow Navigator 中的Open Elaborated Design,然后浏览您感兴趣的层级。
所有经细化的网表对象或层级均可通过使用 DONT_TOUCH、KEEP、KEEP_HIERARCHY 或 MARK_DEBUG 约束来保留,但存在时序或面积 QoR 劣化的风险。
最后,某些约束可能存在冲突而不被综合所认可。例如,如果在跨多个层级的网表上设置 MAX_FANOUT 属性,并且使用 DONT_TOUCH 保留部分层级,那么将限制或完全阻止扇出最优化。

定义时序约束四个步骤:
在这里插入图片描述

前 2 个步骤与时序断言有效有关,期间将从时钟波形和 I/O 延迟约束中衍生出默认时序路径要求。
在第 3 个步骤中,将对至少共享 1 条逻辑路径的异步或专属时钟域之间的关系进行审核。根据关系的性质,可输入时钟组或伪路径约束以忽略这些路径上的时序分析。
最后一个步骤对应于时序例外,设计人员可在此判定如何更改默认时序路径要求,包括利用特定约束来忽略、放宽或收紧时序要求。

定义时钟约束

时钟必须首先完成定义,方可供其它约束使用。时序约束创建流程的第一步是明确必须定义哪些时钟,以及这些时钟必须定义为“primary clock”(基准时钟)还是“generated clock”(生成时钟)。使用特定名称定义时钟(-name 选项)时,必须验证该时钟名称未被任何其它时钟约束或现有自动生成时钟占用。赛灵思建议避免覆盖时钟定义。

在设计中可通过“Clock Networks”(时钟网络)报告和“Check Timing”(检查时序)报告来识别未约束的时钟源

检查设计是否正确约束
在查看时序结果是否存在违例之前,应确保设计中的每个同步端点都已正确约束。
运行 check_timing 可识别未约束的路径。此命令可单独运行,但也可随 report_timing_summary 一起运行。此外,report_timing_summary 还包含“Unconstrained Paths”(未约束的路径)部分,其中已定义的源或目标时序时钟会列出不含时序要求的 N 条逻辑路径。N 由 -max_path 选项控制。
对设计实现完全约束后,请运行 report_methodology 命令并复查 TIMING 和 XDC 检查,以识别非最优化约束,此类约束可能导致时序分析不完全准确,并导致硬件中时序裕度 (timing margin) 发生变化。要识别并纠正不现实的目标时钟频率或者建立路径要求,请使用 report_qor_assessment 命令。

创建基准时钟(主时钟)

基准时钟是指用于为设计定义时序参考的时钟,而时序引擎可利用基准时钟衍生出时序路径要求以及与其它时钟的相位关系。主时钟插入延迟的计算范围是从时钟源点(用于定义时钟的驱动管脚/端口)到时序单元(作为时钟扇出目标)的时钟管脚。
因此,重要的是在对应于设计边界的对象上定义基准时钟,以便准确计算其延迟并间接计算其偏差。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意,不要用某些硬件原语的输出管脚创建基准时钟或者在一个时钟的扇出中使用create_clock。
在这里插入图片描述
在基准时钟传递扇出中不应定义另外 1 个基准时钟,因为这种情况不但不符合任何硬件现实,还会妨碍完整的时钟插入延迟计算,从而阻碍正确的时序分析。如果发生任何这种情况,必须重新修改并修正约束。

下图显示的示例中,时钟 clk1 是在时钟 clk0 的传递扇出中定义的。时钟 clk1 会从 BUFG1 输出开始覆盖此输出处所定义的 clk0。因此,由于 clk0 与 clk1 之间歪斜突变无效导致 REGA 与 REGB 之间的时序分析并不准确。
在这里插入图片描述

创建生成时钟

生成时钟 (generated clock) 是从称为主时钟 (master clock) 的另一个现有时钟衍生的。它通常用于描述逻辑块对主时钟执行的波形变换。由于生成时钟定义取决于主时钟特性,因此必须首先定义主时钟。为显式定义生成时钟,必须使用 create_generated_clock 命令。

自动衍生时钟

大部分生成时钟都是由 Vivado 时序引擎自动衍生的,该引擎可识别时钟修改块 (CMB) 及其对主时钟执行的变换。
在赛灵思 7 系列器件中,CMB 包括:

  • MMCM*/PLL*
  • BUFR
  • PHASER*

在赛灵思 UltraScale 系列器件中,CMB 包括:

  • MMCM*/PLL*
  • BUFG_GT/BUFGCE_DIV
  • GT*_COMMON/GT*_CHANNEL/IBUFDS_GTE3
  • BITSLICE_CONTROL/RX*_BITSLICE
  • ISERDESE3

对于时钟树上的任何其它组合单元而言,时序时钟可通过这些单元进行传输,且无需在输出端重新定义,除非此类单元已进行波形变换。通常应尽可能依靠自动衍生机制,因为就定义可对应于实际硬件行为的生成时钟来说,这是最安全的方法。
如果您认为 Vivado Design Suite 时序引擎所选的自动衍生时钟名称不合适,那么可以使用
create_generated_clock 命令(不指定波形变换)强制输入自己选择的名称。该约束应刚好位于约束文件中定义
主时钟的约束之后。例如,如果由 MMCM 实例生成的时钟默认名称为 net0,那么您可添加以下约束来强制输入自己的名称(在给定示例中,此名称为 fftClk)。

create_generated_clock -name fftClk [get_pins mmcm_i/CLKOUT0]

用户定义的生成时钟

定义所有主时钟后,可使用“时钟网络 (Clock Networks)”或“检查时序 (Check Timing)”(no_clock) 报告来识别时
钟树中不含时序时钟的部分,并定义相应的生成时钟。
有时要理解逻辑椎对主时钟所执行的变换并不容易。在此情况下,必须采用最保守的约束。例如,源管脚是时序单元输出。主时钟至少除以 2,因此,正确的约束应如下示例所示:

create_generated_clock -name clkDiv2 -divide_by 2
-source [get_pins fd/C] [get_pins fd/Q]

最后,如果设计包含锁存器,那么时序时钟还需要连接到锁存器门控管脚,并且如果缺少约束,则将由“检查时序
(Check Timing)”(no_clock) 来报告锁存器门控管脚。您可遵循上述示例来定义这些时钟。

主时钟与生成时钟间的路径

与主时钟不同,生成时钟必须在其主时钟的传递扇出中进行定义,这样时序引擎才能精确计算其插入延迟。不遵守此原则将导致时序分析错误,而且很有可能导致时序裕量计算无效。例如,在下图中,gen_clk_reg/Q 用作为下一个触发器 (q_reg) 的时钟,并且它还位于主时钟 c1 的扇出椎中。因此,gen_clk_reg/Q 应包含
create_generated_clock 而不是 create_clock。
在这里插入图片描述
create_generated_clock -name GC1 -source [get_pins gen_clk_reg/C] -divide_by 2
[get_pins gen_clk_reg/Q]

验证时钟定义和覆盖范围

在定义并应用所有设计时钟后,即可使用 report_clocks 命令验证每个时钟的波形以及主时钟和生成时钟
之间的关系:
在这里插入图片描述
此外,您还可验证所有内部时序路径都被至少 1 个时钟所覆盖。“检查时序 (Check Timing)”报告为此提供了两项检
查:

  • no_clock:报告已定义的时钟无法连接到的任何活动时钟管脚。
  • unconstrained_internal_endpoint:如果某些时序单元具有与时钟相关的时序检查但尚未定义时钟,则报告此类时序单元的所有数据输入管脚。
    如果两项检查都返回 0,说明时序分析覆盖范围广。

或者,还可运行 XDC 和“时序方法 (Timing Methodology)”检查来验证在建议的网表对象上是否已定义所有时钟,同
时避免造成任何约束冲突或不准确的时序分析情境。
请使用以下命令来运行这些检查:

report_methodology -checks [get_methodology_checks {TIMING-* XDC*}]

调整时钟特性

定义时钟及其波形后,下一步是输入与噪声或不确定性建模相关的所有信息。XDC 语言用于将抖动和相位误差相关的不确定性与偏差和延迟建模相关的不确定性加以区分。

抖动

对于抖动,最好使用 Vivado Design Suite 所使用的默认值。您可按如下方式修改默认计算:

  • 如果主时钟进入器件时随机抖动大于 0,请使用 set_input_jitter 命令指定峰值间抖动值(以纳秒 (ns) 为单
    位)。
  • 如果器件电源有噪声,请使用 set_system_jitter 调整全局抖动。赛灵思不建议增大默认系统抖动值。

对于生成时钟,抖动源自主时钟和时钟修改块的特性。用户不需要调整这些数字。

其他不确定性问题

如果需要在某个时钟的时序路径上或 2 个时钟之间的时序路径上添加额外裕度,必须使用
set_clock_uncertainty 命令。这也是对部分设计进行过度优化而不必修改实际时钟沿和总体时钟关系的最佳且最
安全的途径。用户定义的时钟不确定性是在 Vivado 工具计算所得抖动的基础上附加的,可为建立时间和保持时间分析单独指定此不确定性。

例如,设计时钟 clk0 的所有时钟间路径上的裕度需收紧,幅度为 500 ps,以使设计承受建立时间和保持时间的噪声
能力更强:
set_clock_uncertainty -from clk0 -to clk0 0.500

如果您在 2 个时钟之间指定额外的不确定性,那么必须应用双向约束(假定数据流为双向)。以下示例演示了如何在clk0 和 clk1 之间仅针对建立时间将不确定性增加 250 ps。

set_clock_uncertainty -from clk0 -to clk1 0.250 -setup
set_clock_uncertainty -from clk1 -to clk0 0.250 -setup

时钟源位置的时钟时延

可使用含 -source 选项的 set_clock_latency 命令在时钟源处对时钟时延进行建模。该方法在两种情况下有用:

  • 用于在器件外部指定与输入和输出延迟约束无关时钟延迟传输。
  • 用于对非关联 (OOC) 编译器件块所使用的时钟内部传输时延进行建模。在此类编译流程中,不含完整时钟树的描述,因此块外部的最小和最大工作条件之间的差异无法自动进行计算,必须手动建模。

此约束仅限高级用户使用,因为它通常难以提供有效的时延值。

MMCM 或 PLL 外部反馈回路延迟

当连接 MMCM 或 PLL 反馈回路以便补偿开发板延迟(而非内部时钟插入延迟)时,必须使用
set_external_delay 命令指定最佳和最差延迟情况下器件外部的延迟。不指定此延迟会导致与 MMCM 或 PLL 关
联的 I/O 时序分析变得无关紧要,并且可能导致无法实现时序收敛。此外,使用外部补偿时,必须相应调整输入和输
出延迟约束,而不只是考量正常情况下开发板上的时钟走线延迟。

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

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

相关文章

【java基础】关于线程的一些基础知识点

1.线程的概念: 在java的应用中,线程更多情况下指的是Thread,更精细一点,执行线程就是执行Thread实体下面的run方法,java通过cpu调试,交替进行这些thread,就达到了共同进行这种效果;…

【尚硅谷】SpringBoot2核心技术-1-基础入门

【尚硅谷】SpringBoot2核心技术-1-基础入门一、Spring与SpringBoot1、Spring能做什么1.1、Spring的能力1.2、Spring的生态【没写完】二、SpringBoot2入门1、系统要求1.1、maven设置2、HelloWorld2.1、创建maven工程2.2、引入依赖2.3、创建主程序2.4、编写业务2.5、测试2.6、简化…

DM8开发技能

DM8开发技能 基础学习笔记005 文章目录DM8开发技能1、DMSQL程序设计1.1 概念1.2 数据类型1.3 程序定义1.3.1 存储过程1.3.2 存储函数1.3.3 客户端DMSQL程序1.3.4 参数1.3.5 控制结构(1)顺序结构(2)分支结构(3&#xf…

Doo Prime 德璞资本:道琼斯期货投资前必看的入门知识

美国道琼工业指数是全球最受关注的股指之一,而道琼斯期货则是典型的衍生性金融商品,交易的标的是道琼指数本身,属于期货投资的范畴,适合短线进出、波段交易。想要参与美国的期货投资市场,却不知道期货该如何开始吗&…

C# XPath的概念

一 XPath的概念 1 XPath是对XML进行查询的表达式 ① Axes(路径) / 及 //; ② 第几个子节点[1] 等; ③ 属性 ④ 条件 [] ⑤ 例如 /books/book/title //price para[type“warning”][5] 2 使用XPath ① XmlDocument docnew XmlDocument(); ② doc.LoadXml(strXml)…

通过idea打包java Maven项目 架包与全包

1 仅架包 架包定义:指仅将代码打包到jar中,在运行的平台必须保证依赖。 方法:maven —> Lifecyle —> Clean —> Package 2 架包与全包(推荐) 全包定义:将maven项目中的依赖于代码都打为一个包。 方法:mave…

RK3568平台开发系列讲解(Linux系统篇)Linux 管道的使用

🚀返回专栏总目录 文章目录 一、 管道1.1、单向管道1.2、双向管道沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍管道的使用。 一、 管道 在 fork() 成功创建子进程之后,已经打开的文件描述符在父子进程间是共享的,管道就是利用这一特性来工作的。 创建…

C++:设计一个文本行编辑程序,先从输入文件中读取数据,然后根据行编辑命令处理,将结果写到输出文件中。

3.1题目: 设计一个文本行编辑程序 对文本文件按行进行编辑:先从输入文件中读取数据,然后根据行编辑命令处理,将结果写到输出文件中。行编辑命令包括:序号 行编辑命令格式 功能 1 *L m,n …

ts概述、ts环境准备和编译、ts类型声明

文章目录1. ts概述2. ts环境准备和编译3. ts类型声明3.1 布尔值3.2 数字类型3.3 字符串类型3.4 any和unknown3.5 void、null、undefined3.6 never类型3.7 字面量类型3.8 枚举类型3.9 object对象类型3.10 数组3.11 元组3.12 自定义类型type3.13 联合类型3.14 交叉类型3.15 类型断…

《深入理解计算机系统》学习笔记 —— 虚拟内存详解

文章目录虚拟内存物理内存、物理地址、虚拟地址虚拟地址空间虚拟内存缓存页表分配页面页命中缺页虚拟内存的好处简化链接mmap虚拟内存的私有性地址翻译我们先看一下使用页表进行地址翻译有哪些东西:虚拟地址到物理地址处理过程页面大小和虚拟地址物理地址关系TLB翻译…

2022年,我45岁,一息尚存不落征帆,静稳前行未来可期

2022年,我45岁,一息尚存不落征帆,静稳前行未来可期, 关键词:模式固定,回顾与审视,不间断地阅读 模式固定 本年的52周,每逢周五我会把还在更新的15册讲书各讲一期。每期讲20分钟左…

nodejs mp2 姿势启动

以前运行 nodejs 代码都是 node xxx.js; 但是很容易就关掉了, 或者你想看跟详细的数据 是看不到的。 可以试试 pm2的方式 运行你的代码;学习新的姿势! pm2的安装: 1: npm install pm2 -g C:\Users\Admini…

数据治理:数据治理框架和标准

参考《一本书讲透数据治理》、《数据治理》等 数据治理并不是新概念,在国内外都有实践,这里重点介绍下国内外对数据治理的主流框架和标准 国际数据治理框架 国际上,主流的数据治理框架主要有:ISO数据治理标准、GDI数据治理框架、…

深入浅出scala之函数(匿名函数)(P41-45)

文章目录1.函数的定义2.匿名函数3.递归函数4.无参函数5.方法和函数的区别联系1.函数的定义 package MethodDemoobject FunctionDefinition {// 实现加法的功能,省略写法,把函数体写在返回值的位置val f1 ((a: Int, b: Int) > { a b })val f2 (a: …

Charles - 配置抓Chrome、iOS、Android包环境

官网下载地址:https://www.charlesproxy.com/。 1、设置代理http端口 路径:Proxy > Proxy Settings > Proxies > HTTP proxy > Prot 2、设置代理https端口 路径:SSL Proxying Settings > SSL Proxyin 3、Mac证书配置 …

谷粒商城-基础篇-Day06-属性分组

属性分组 抽取出一个tree组件放到modules下的common下的category.vue <template><el-tree :data"menus" :props"defaultProps" node-key"catId"ref"menu"></el-tree> </template><script> //这里可以…

LVGL学习笔记6 - 输入设备

目录 1. 移植文件 2. 移除多余代码 3. 输入设备初始化 4. 输入设备读回调函数 4.1 LV_INDEV_TYPE_POINTER 4.2 LV_INDEV_TYPE_KEYPAD 4.3 LV_INDEV_TYPE_ENCODER 4.4 LV_INDEV_TYPE_BUTTON 5. 事件 6. 实例 7 Group 7.1 创建Group 7.2 与输入设备关联 7.3 添加对…

低频功率放大器参考电路图解大全

功率放大器一般也被我们称为电压放大器&#xff0c;主要是把微弱信号进行电压放大&#xff0c;其输入输出的电压电流一般很小&#xff0c;不能够直接驱动功率较大的仪器。为了满足使用需求&#xff0c;需要在放大器末级增加功率放大器。而功率放大器主要就是放大信号功率&#…

供应商绩效管理对企业采购组织的重要价值

供应商绩效管理是供应商管理中的重要组成部分&#xff0c;它在企业整个采购管理生命周期中起到重要的作用&#xff0c;作为管理好供应商的一个重要手段&#xff0c;现代企业几乎都会对供应商实施绩效考核。供应商绩效管理是对公司供应商的可靠性、质量和性能的监视和分析。它能…

sec2-GObject

1 类和实例 GObject实例用函数g_object_new创建。GObject不仅仅有实例&#xff0c;也有类。 一个GObject类在第一次访问g_object_new时候创建&#xff0c;只有有一个GObject类存在。GObject实例在任何时候访问g_object_new都会被创建&#xff0c;所以就会创建更多GObject实例…