vivado路径最大时钟约束_【Vivado使用误区与进阶】XDC约束技巧之时钟篇

2023-10-30

Xilinx 的新一代设计套件Vivado中引入了全新的约束文件XDC,在很多规则和技巧上都跟上一代产品ISE中支持的UCF大不相同,给使用者带来许多额外挑战。Xilinx工具专家告诉你,其实用好XDC很容易,只需掌握几点核心技巧,并且时刻牢记:XDC的语法其实就是Tcl语言。

XDC的优势

XDC是Xilinx Design Constraints的简写,但其基础语法来源于业界统一的约束规范SDC(最早由Synopsys公司提出,故名Synopsys Design Constraints)。所以SDC、XDC跟Vivado Tcl的关系如下图所示。

XDC的主要优势包括:● 统一了前后端约束格式,便于管理;

● 可以像命令一样实时录入并执行;

● 允许增量设置约束,加速调试效率;

● 覆盖率高,可扩展性好,效率高;

● 业界统一,兼容性好,可移植性强;

XDC在本质上就是Tcl语言,但其仅支持基本的Tcl语法如变量、列表和运算符等等,对其它复杂的循环以及文件I/O等语法可以通过在Vivado中source一个Tcl文件的方式来补充。(对Tcl话题感兴趣的读者可以参考作者的另一篇文章《Tcl在Vivado中的应用》)

XDC与UCF的最主要区别有两点:

1. XDC可以像UCF一样作为一个整体文件被工具读入,也可以在实现过程中被当作一个个单独的命令直接执行。这就决定了XDC也具有Tcl命令的特点,即后面输入的约束在有冲突的情况下会覆盖之前输入的约束(时序例外的优先级会在下节详述)。另外,不同于UCF是全部读入再处理的方式,在XDC中,约束是读一条执行一条,所以先后顺序很重要,例如要设置IO约束之前,相对应的clock一定要先创建好。

2. UCF是完全以FPGA的视角看问题,所以缺省认为所有的时钟之间除非预先声明是同步的,否则就视作异步而不做跨时钟域时序分析;XDC则恰恰相反,ASIC世界的血缘背景决定了在其中,所有的时钟缺省视作全同步,在没有时序例外的情况下,工具会主动分析每一条跨时钟域的路径。

XDC的基本语法

XDC的基本语法可以分为时钟约束、I/O约束以及时序例外约束三大类。根据Xilinx的UltraFast设计方法学中Baseline部分的建议(UG949中有详细介绍),对一个设计进行约束的先后顺序也可以依照这三类约束依次进行。本文对可以在帮助文档中查到的基本XDC语法不做详细解释,会将重点放在使用方法和技巧上。

时钟约束

时钟约束必须最早创建,对7系列FPGA来说,端口进来的主时钟以及GT的输出RXCLK/TXCLK都必须由用户使用create_clock自主创建。如果是差分输入的时钟,可以仅仅在差分对的P侧用get_ports获取端口,并使用create_clock创建。例如,

Vivado自动推导的衍生时钟

MMCM/PLL/BUFR的输出作为衍生时钟,可以由Vivado自动推导,无需用户创建。自动推导的好处在于当MMCM/PLL/BUFR的配置改变而影响到输出时钟的频率和相位时,用户无需改写约束,Vivado仍然可以自动推导出正确的频率/相位信息。劣势在于,用户并不清楚自动推导出的衍生钟的名字,当设计层次改变时,衍生钟的名字也有可能改变。这样就会带来一个问题:用户需要使用这些衍生钟的名字来创建I/O约束、时钟关系或是时序例外等约束时,要么不知道时钟名字,要么时钟名字是错的。

推荐的做法是,由用户来指定这类衍生时钟的名字,其余频率等都由Vivado 自动推导。这样就只需写明create_generated_clock 的三个option,其余不写即可。如下所示。

当然,此类情况下用户也可以选择完全由自己定义衍生时钟,只需补上其余表示频率/相位关系的option,包括-multiply_by 、-devide_by 等等。需要注意的是,一旦Vivado在MMCM/PLL/BUFR 的输出检测到用户自定义的衍生时钟,就会报告一个Warning,提醒用户这个约束会覆盖工具自动推导出的衍生时钟(例外的情况见文章下半段重叠时钟部分的描述),用户须保证自己创建的衍生钟的频率等属性正确。

用户自定义的衍生时钟

工具不能自动推导出衍生钟的情况,包括使用寄存器和组合逻辑搭建的分频器等,必须由用户使用create_generated_clock 来创建。举例如下,

I/O约束

在设计的初级阶段,可以不加I/O约束,让工具专注于满足FPGA内部的时序要求。当时序要求基本满足后,再加上I/O约束跑实现。XDC中的I/O约束有以下几点需要注意:

1. 不加任何I/O约束的端口时序要求被视作无穷大。

2. XDC中的set_input_delay / set_output_delay对应于UCF中OFFSET IN / OFFSET OUT,但视角相反。OFFSET IN / OFFSET OUT是从FPGA内部延时的角度来约束端口时序,set_input_delay / set_output_delay则是从系统角度来约束。

3. 典型的I/O时序,包括系统同步、源同步、SDR和DDR等等,在Vivado图形界面的XDC templates中都有示例。2014.1版后还有一个Timing Constraints Wizard可供使用。

时序例外约束

时序例外约束包括set_max_delay/set_min_delay,set_multicycle_path,set_false_path等,这类约束除了要满足XDC的先后顺序优先级外,还受到自身优先级的限制。一个总的原则就是针对同一条路径,对约束目标描述越具体的优先级越高。不同的时序例外约束以及同一约束中不同条件的优先级如下所示:

举例来说,依次执行如下两条XDC,尽管第二条最后执行,但工具仍然认定第一条约束设定的15为clk1到clk2之间路径的max delay值。

再比如,对图示路径依次进行如下四条时序例外约束,优胜者将是第二条。但如果再加入最后一条约束,false path的优先级最高,会取代之前所有的时序例外约束。

高级时钟约束

约束最终是为了设计服务,所以要用好XDC就需要深入理解电路结构和设计需求。接下来我们就以常见FPGA设计中的时钟结构来举例,详细阐述XDC的约束技巧。

时序的零起点

用create_clock定义的主时钟的起点即时序的"零起点",在这之前的上游路径延时都被工具自动忽略。所以主时钟创建在哪个"点"很重要,以下图所示结构来举例,分别于FPGA输入端口和BUFG输出端口创建一个主时钟,在时序报告中体现出的路径延时完全不同,很明显sysclk_bad的报告中缺少了之前一段的延时,时序报告不可信。

时钟定义的先后顺序

时钟的定义也遵从XDC/Tcl的一般优先级,即:在同一个点上,由用户定义的时钟会覆盖工具自动推导的时钟,且后定义的时钟会覆盖先定义的时钟。若要二者并存,必须使用 -add 选项。

上述例子中BUFG的输出端由用户自定义了一个衍生钟clkbufg,这个衍生钟便会覆盖此处原有的sysclk。此外,图示BUFR工作在bypass模式,其输出不会自动创建衍生钟,但在BUFR的输出端定义一个衍生钟clkbufr,并使用-add 和 -master_clock 选项后,这一点上会存在sysclk和clkbufg两个重叠的时钟。如下的Tcl命令验证了我们的推论。

同步时钟和异步时钟

不同于UCF约束,在XDC中,所有的时钟都会被缺省认为是相关的,也就是说,网表中所有存在的时序路径都会被Vivado分析。这也意味着FPGA设计人员必须通过约束告诉工具,哪些路径是无需分析的,哪些时钟域之间是异步的。

如上图所示,两个主时钟ssclkin和sysclk由不同的端口进入FPGA,再经由不同的时钟网络传递,要将它们设成异步时钟,可以使用如下约束:

其中,-include_generated_clocks 表示所有衍生钟自动跟其主时钟一组,从而与其它组的时钟之间为异步关系。不加这个选项则仅仅将时钟关系的约束应用在主时钟层面。

重叠(单点多个)时钟

重叠时钟是指多个时钟共享完全相同的时钟传输网络,例如两个时钟经过一个MUX选择后输出的时钟,在有多种运行模式的设计中很常见。

如下图所示,clk125和clk250是clkcore_buf的两个输入时钟,不约束时钟关系的情况下,Vivado会对图示路径做跨时钟域(重叠时钟之间)分析。这样的时序报告即便没有违例,也是不可信的,因为clk125和clk250不可能同时驱动这条路径上的时序元件。这么做也会增加运行时间,并影响最终的实现效果。

如果clk125和clk250除了通过clkcore_buf后一模一样的扇出外没有驱动其它时序元件,我们要做的仅仅是补齐时钟关系的约束。

在很多情况下,除了共同的扇出,其中一个时钟或两个都还驱动其它的时序元件,此时建议的做法是在clkcore_buf的输出端上创建两个重叠的衍生钟,并将其时钟关系约束为-physically_exclusive 表示不可能同时通过。这样做可以最大化约束覆盖率,也是ISE和UCF中无法做到的。

其它高级约束

时钟的约束是XDC的基础,熟练掌握时钟约束,也是XDC约束技巧的基础。其它高级约束技巧,包括复杂的CDC(Clock Domain Crossing)约束和接口时序(SDR、DDR、系统同步接口和源同步接口)约束等方面还有很多值得注意的地方。

这一系列《XDC约束技巧》文章还会继续就上述所列方向分篇详述,敬请关注作者的后续更新,以及Xilinx 官方网站和中文论坛上的更多技术文章。

Ally Zhou 2014-9-25 于Xilinx上海Office

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vivado路径最大时钟约束_【Vivado使用误区与进阶】XDC约束技巧之时钟篇 的相关文章

  • c语言从文件中读取数据到链表_C语言

    点击上方 C语言中文社区 选择 设为星标 技术干货第一时间送达 作者 ancientear 原文 https www jianshu com p e43e795808aa 要求设计的管理系统能够实现以下功能 1 每一条记录包括一个学生的学号
  • 【Linux】解决运行sudo时提示sudo: unable to resolve host

    因为开发需要 把主机名从oldname修改成newname后 再运行sudo时会报一行错误 sudo unable to resolve host newname 解决方法 sudo gedit etc hosts打开 etc hosts
  • Linux LDAP搭建与使用

    Linux LDAP搭建与使用 标签 空格分隔 LDAP ubuntu ldap安装 执行以下命令安装ldap apt get install slapd ldap utils migrationtools dpkg reconfigure
  • 用keras进行猫狗识别(一)

    Keras是一个高层神经网络API Keras由纯Python编写而成并基Tensorflow Theano以及CNTK后端 Keras 为支持快速实验而生 能够把你的idea迅速转换为结果 如果你有如下需求 请选择Keras 简易和快速的
  • VMA与page fault

    一 红黑树与VMA 红黑树的应用 广泛用于 C 的 STL 中 set 和 map 是用红黑树实现的 Linux 的的进程调度 用红黑树管理进程控制块 进程的虚拟内存空间都存储在一颗红黑树上 每个虚拟内存空间都对应红黑树的一个节点 左指针指
  • 05 神经网络语言模型(独热编码+词向量的起源)

    博客配套视频链接 https space bilibili com 383551518 spm id from 333 1007 0 0 b 站直接看 配套 github 链接 https github com nickchen121 Pr
  • C# 获取qq邮箱的未读邮件

    第一步 先在QQ邮箱进行设置 获取授权码 第一步 打开QQ邮箱并点击设置 第二步 点击账户 并滑到下面 第三步 开启POP3 IMAP SMTP Exchange CardDAV服务并生成授权码 在这个页面找到下图这个位置 在IMAP SM
  • 2PC 两阶段提交

    这是使用Java实现两阶段提交的简单代码示例 public abstract class BaseTwoPhaseCommit public abstract void commit public abstract void rollbac
  • 华为 进入和退出Fastboot、eRecovery和Recovery升级模式

    手机关机状态下 可以进入Fastboot eRecovery Recovery 升级这几种模式 需要连接电脑 Fastboot模式 长按音量下键 电源键 eRecovery 模式 长按音量上键 电源键 不需要连接电脑 Recovery 模式
  • java bufferedimage颜色_java – 如何在BufferedImage中使颜色透明并保存为PNG

    我最近这样做 是为了回答我的项目经理的一个问题 将灰色变为透明度的功能是 private Image TransformGrayToTransparency BufferedImage image ImageFilter filter ne
  • 用Python开发了一个进销存管理的小软件

    研究生毕业之后 就进入国企工作 工作内容偏产品和售前 几乎没写过代码了 有个朋友是开游泳馆的 也会有少量商品的售卖 问我能不能给她开发一个小软件 记录商品的入库出库 统计下金额 恰好工作中今年也用到了python写一个小工具 觉得非常好用
  • 因为一个函数strlen的陷阱,我懂得了看源码的重要性

    因为一个函数strlen的陷阱 我懂得了看源码的重要性 在程序开发中 我们经常会使用各种函数库来提高效率 其中字符串处理函数是开发中最常用的函数之一 在这些函数中 strlen是一个很重要的函数 它用来计算字符串的长度 然而 有时候使用st
  • 吴恩达深度学习第一课第四周课后作业2参考

    Deep Neural Network for Image Classification Application 深度神经网络应用 When you finish this you will have finished the last p
  • 队列(Queue)——class Stack 和 class Stack T 实现

    这是对于Queue类的实现 PS 这是队列链式存储 带头节点 的类和模板实现 静态循环序列本质也只是封装类和套模板 class Stack实现代码如下 myqueue h include
  • VMware虚拟机从一台电脑复制到另一台电脑【亲测,成功】

    在一台电脑上利用虚拟机创建了centos 如果想在家里的电脑虚拟机上也运行centos 不用再重新安装以及漫长的安装等待了 可以利用先前在虚拟机上安装centos生成的 vmx文件和 vmdk文件 拷贝到U盘 再重新导入到新电脑就可以了 省
  • 孤立森林(isolation forest)

    1 简介 孤立森林 Isolation Forest 是另外一种高效的异常检测算法 它和随机森林类似 但每次选择划分属性和划分点 值 时都是随机的 而不是根据信息增益或者基尼指数来选择 在建树过程中 如果一些样本很快就到达了叶子节点 即叶子
  • synchronized关键字在同步方法中的应用

    synchronized 同步方法 synchronized关键字可用来保障原子性 可见性和有序性 非线程安全问题会在多个线程对同一个对象中的实例变量进行并发访问时发生 产生的后果就是 脏读 也就是读取到的数据其实是被更改过的 线程安全是指
  • pmap 命令

    NAME pmap report memory map of a process SYNOPSIS pmap x d q pids pmap V 常用参数 x 显示扩展格式 d 显示设备格式 q 不显示header footer行 V 显示

随机推荐

  • 一文搞定:SpringBoot 集成 Apollo 配置中心

    公众号后台回复 面试 获取精品学习资料 扫描下方海报了解专栏详情 本文来源 http www mydlq club article 42 Java工程师面试突击 第3季 重磅升级 由原来的70讲增至160讲 内容扩充一倍多 升级部分内容请参
  • 浅谈java中的锁

    JAVA中的锁 自旋锁 当一个线程要获取锁的时候 该锁被其他线程获取 那么该线程将循环等待 不判断该锁是否能够被成功获取 直到获取到该锁才会退出循环 自旋锁实现例子 通过CAS操作实现加锁与解锁逻辑 循环等待占用锁的线程解锁 自旋锁代码实现
  • Ubuntu 16.04系统安装jdk1.8

    笔者环境 主系统Win7 VMware Workstation 12 Player虚拟机 虚拟机系统ubuntu 16 04 desktop amd64 安装jdk jdk 8u102 linux 一 在Oracle官方网站下载JDK 1
  • 跨域问题之手机号码登录验证

    1 构建登录组件 router js 设置路由 import Vue from vue import Router from vue router Vue use Router const router new Router mode hi
  • javaweb jsp的认识

    1 java 程序片 1 在jsp中 之间的书写叫做java 程序片 一个jsp中页面中可以有多个java 程序片 在java 程序片声明的变量 在它们所在的jsp中的所有java 程序片及表达式中都有效 java 程序片中声明的变量 只在
  • 测试用例设计白皮书--判定表驱动分析方法

    测试用例设计白皮书 判定表驱动分析方法 Author Vince 来源 http blog csdn net vincetest 一 方法简介 1 定义 判定表是分析和表达多逻辑条件下执行不同操作的情况的工具 2 判定表的优点 能够将复杂的
  • 基于Java的飞机大战游戏的设计与实现论文

    源码下载 http www byamd xyz hui zong 1 摘 要 现如今 随着智能手机的兴起与普及 加上4G the 4th Generation mobile communication 第四代移动通信技术 网络的深入 越来越
  • 【华为OD机试真题 python】任务总执行时长【2022 Q4

    题目描述 任务总执行时长 任务编排服务负责对任务进行组合调度 参与编排的任务有两种类型 其中一种执行时长为taskA 另一种执行时长为taskB 任务一旦开始执行不能被打断 且任务可连续执行 服务每次可以编排num个任务 请编写一个方法 生
  • idea 没有java文件夹_IntelliJ IDEA右键文件夹没有Java Class文件的原因及解决方法

    问题 在项目里创建文件夹后 发现竟然不能新建class文件 问题详细如下图 原因分析 这里涉及到Sources的作用 Sources 一般用于标注类似 src 这种可编译目录 有时候我们项目当中 可能不单单是 src 目录为可编译的 很可能
  • 讨论scrapy-splash渲染不成功问题?

    url https wenshu court gov cn website wenshu 181107ANFZ0BXSK4 index html docId 75461a02d9714cec9322ab4500147439 由于scrapy
  • java基础类型知识

    原生类 基本数据类型 和强类型 引用类型 1 除了八个基本数据类型都是引用类型 但是八个基本数据类型可转换为包装类 基本数据类型没有方法 强类型有方法 装箱 基本数据类型转换为包装类 拆箱 包装类转换为基本数据类型 byte Byte sh
  • element-ui菜单栏切换页面高亮刷新后不显示问题

    最近做的一个vue的小项目 在点击菜单栏其他页面之后高亮会跟着过去 但是刷新后高亮又会重新跳到最初进入的页面 原因是这样的 element ui官网示例 default active activeIndex 这个控制高亮 然后在data中一
  • qt 比较两个字符串是否相等

    QString str QString fromLocal8Bit 球形 if str compare QString fromLocal8Bit 球形 0 或者 if str QString fromLocal8Bit 球形
  • GMAC接口(4)——编程指南

    Note 基于DWC ether qos控制器 RTL8211F PHY 1 硬件复位PHY 可选 通过GPIO接口 将复位信号 持续至少10ms的低电平脉冲 发送到PHY 2 初始化控制器 a 软复位 软件复位 gmac DMA Mode
  • Emacs 之查看帮助

    Emacs 之查看帮助 Table of Contents 1 Emacs 入门 1 1 查看简单的帮助 1 2 执行elisp代码 1 Emacs 入门 1 1 查看简单的帮助 C h f 查看函数的文档 describe functio
  • [人工智能-深度学习-81]:视觉 - 视频换脸软件大全

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122504846 目录 第1名 ZAO
  • 腾讯云轻量2核4G5M服务器_CPU内存_流量_带宽_系统盘

    腾讯云轻量2核4G5M服务器 CPU内存流量带宽系统盘性能测评 轻量应用服务器2核4G5M带宽 免费500GB月流量 60GB系统盘SSD盘 5M带宽下载速度可达640KB 秒 流量超额按照0 8元每GB支付流量费 轻量2核4G5M服务器一
  • 华为ensp配置实验大全(免费&持续更新)

    点开一篇文章 分享 要收费 点开一篇文章 大全 但就两个实验 点开一篇文章 详细 但全截图 我忽略了最重要的东西 产品说明书 产品说明书优势 规范 详细 此文寻找官方手册中的配置实验 博客好文 基础实验为主 你知道的答案 不是下一次作业的答
  • OV7670循迹算法整理

    资源在这 http download csdn net download hello world12138 9910603 2016 7 3 1 今天发现一个比较尴尬的问题 之前摄像头采集到的图像和现实中我显示的图像的旋转方向根本就是反的
  • vivado路径最大时钟约束_【Vivado使用误区与进阶】XDC约束技巧之时钟篇

    Xilinx 的新一代设计套件Vivado中引入了全新的约束文件XDC 在很多规则和技巧上都跟上一代产品ISE中支持的UCF大不相同 给使用者带来许多额外挑战 Xilinx工具专家告诉你 其实用好XDC很容易 只需掌握几点核心技巧 并且时刻