【Vivado使用误区与进阶】XDC约束技巧——时钟篇

2023-11-06

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

 

XDC的优势

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

 11.png  

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自主创建。而衍生时钟则分为以下两类:

  1. MMCM/PLL/BUFR的输出时钟都可以由Vivado自动推导,无需用户创建。若用户仅希望改变衍生钟的名字,其余频率等都由工具自动推导,则只需写明三个option,其余不写即可:create_generated_clock [-name arg] [-source args] [-master_clock arg] 
  2. 工具不能自动推导出衍生钟的情况,包括使用寄存器和组合逻辑搭建的分频器等,必须由用户使用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的先后顺序优先级外,还受到自身优先级的限制。一个总的原则就是针对同一条路径,对约束目标描述越具体的优先级越高。不同的时序例外约束以及同一约束中不同条件的优先级如下所示:

22.png

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

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

44.png

 

高效的时钟约束

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

时序的零起点

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

55.png

66.png

时钟定义的先后顺序

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

77.png

88.png

 

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

同步时钟和异步时钟

1010.png

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

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

1111.png

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

重叠(单点多个)时钟

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

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

1212.png

1313.png

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

1414.png

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

1515.png

其它高级约束

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

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

【Vivado使用误区与进阶】XDC约束技巧——时钟篇 的相关文章

  • 2022芯原芯片设计 笔试题分析和讨论

    2022芯原设计笔试题分析和讨论 以下仅为个人理解和分析 不保证正确 欢迎大家发表自己的想法 讨论出正确答案 企业知识题 1 1 D 芯原的主要经营模式为芯片设计平台即服务 Silicon Platform as a Service SiP
  • 【FPGA】Xilinx vivado IP核许可申请——以MIPI CSI-2为例

    1 先进入xilinx官网 复制这个链接直接进入ip申请的地址 http www xilinx com getlicense 打开链接后需要登录 没账户的那就需要注册 点击红色方框内的蓝色字体即可注册 2 注册完成后 可以选择相应的IP核进
  • FPGA实战--等精度频率测量

    首先放置效果图 本次试验中采用的是等精度测频率 等精度测频的原理是产生一个1s的高电平 在高电平中对被测方波进行计数 所测得数字即该波形频率 具体等精度测量原理请参考 http www elecfans com d 591858 html
  • 【Xilinx DDR3 MIG】Xilinx FPGA DDR3读写实验相关用户接口引脚解释

    目录 DDR3读写实验 实验框图 时钟模块 DDR3读写及LED指示模块 MIG IP核 用户接口解释
  • FPGA(3)验证数字逻辑(与门、与非门、二选一数据选择器、2-4译码器、半加器、全加器)

    目录 一 验证与门 二 验证与非门 三 验证二选一数据选择器 四 验证2 4译码器 五 验证半加器 六 验证全加器 0 初始化定义 1 第一个半加器 2 第二个半加器 3 得到最终进位Co 代码 0决定与 1决定或 一 验证与门 只要有一个
  • HDLBits刷题_Verilog Language_Procedures_Alwaysblock1

    学习内容 Since digital circuits are composed of logic gates connected with wires any circuit can be expressed as some combin
  • win10下安装vivado 2018.3之后ise14.7 的impact 无法使用

    软件版本号 操作系统win10 ise14 7 vivado 2018 3 ise14 7 在win10里面问题总结 1 ise14 7 闪退问题 比较好解决 论坛上比较多的解决方法 2 ise 14 7 windows 10 版本的ise
  • xilinx xdma PCIe中断bug

    xilinx xdma PCIe中断存在bug bug1 此中断虽然是msi或者msx中断 但是不中断cpu bug2 此中断不是边沿中断 而是电平中断 在驱动层需要不断地轮训查询中断事件 bug3 此中断持续时间必须长 而且在收到中断应答
  • 从零开始zynq linux AXI DMA传输

    本文从0开始叙述过程 使用的工具为vivado2016 4 sdk也是2016 4 准备工作 首先下载如下的目标文件 1 下载xilinx官方的bootloader文件 git clone https github com Xilinx u
  • 【PIPE】流水线设计中的基本模块

    大概分成以下几节 1 概述及协议 2 valid forward valid超前 3 bubble collapse 消除气爆 4 input output skid 不知中文怎么说 5 pipe halt 流水停顿 6 idle pres
  • VHDL:正式端口“portName”没有实际值或默认值

    我在实例化 VHDL 模块 PWM 的 VHDL 测试平台上收到编译错误 正式端口 Duty Cycle 没有实际或默认值 当站在 dev to test PWM 代码行时会看到该错误 在实例化的 PWM 模块中 Duty Cycle st
  • Verilog、FPGA、统一寄存器的使用

    我有一个问题 关于我正在开发的 AGC SPI 控制器在我看来奇怪的行为 它是用 Verilog 完成的 针对的是 Xilinx Spartan 3e FPGA 该控制器是一个依赖外部输入来启动的 FSM FSM的状态存储在状态寄存器它没有
  • 异步FIFO设计之格雷码

    目录 二进制转格雷码 格雷码转二进制 相邻的格雷码只有1bit的差异 因此格雷码常常用于异步fifo设计中 保证afifo的读地址 或写地址 被写时钟 或读时钟 采样时最多只有1bit发生跳变 在不考虑路径延时的情况下 因为源数据 读写地址
  • if 语句导致 Verilog 中的锁存推断?

    我正在编写用于合成算法的 Verilog 代码 我对哪些情况可能导致推断锁存器有点困惑 下面是这样的一段代码 虽然它在模拟中工作得很好 但我担心它可能会导致硬件问题 always b1 or b2 b1 map b2 map m1 map
  • 将库添加到 Vivado 2014.4

    我对 Vivado 和 VHDL 还很陌生 我想要一些关于基本问题的指导 我猜我可以创建自己的库并在我的项目中使用它们 就像使用默认库和基本库一样 eg library IEEE use IEEE std logic 1164 ALL us
  • 如何使用 Verilog 和 FPGA 计算一系列组合电路的传播延迟?

    我是 FPGA 和 HDL 的新手 但我正在尝试学习 但无法弄清楚这一点 如何通过多个级别的组合逻辑来计算或估计传播延迟 我可以仅凭经验确定这一点 还是可以在设计时弄清楚 在这种情况下 我使用 FPGA 来实现奇偶校验设置和检查电路 该电路
  • FPGA 有哪些实际应用?

    我对我的程序为一个小型七段显示器提供动力感到非常兴奋 但是当我向不在现场的人展示它时 他们总是说 那么你能用它做什么 我永远无法给他们一个简洁的答案 谁能帮我吗 第一 它们不需要具有易失性存储器 事实上 大厂商 Xilinx Altera
  • 从 OpenCV 代码到 FPGA 代码的转换是否比 Matlab 代码更容易? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想做一个关于图像处理的项目 我想知道如果我想在FPGA上实现这个项目 我应该在第一阶段选择Matla
  • 如何从 Spartan 6 写入 Nexys 3 FPGA 板上的 Micron 外部蜂窝 RAM?

    我到处都查过了 数据表 Xilinx 网站 digilent 等等 但什么也没找到 我能够使用 Adept 工具来验证我的蜂窝 RAM 是否正常运行 但我找不到任何库存 VHDL 代码作为控制器来写入数据和从中读取数据 帮助 找到了此链接
  • 在 Verilog 程序中使用连续分配?

    在 Verilog 程序中使用连续赋值是否可能和 或有用 例如 是否有任何理由将assign里面一个always堵塞 例如这段代码 always begin assign data in Data end 此外 是否可以用这种方法生成顺序逻

随机推荐

  • [管理与领导-61]:IT基层管理者 - 潜技能 - 1 - 职场中的陷阱- 职场中常见的陷阱与应对措施

    目录 一 常见陷阱 二 应对措施 一 常见陷阱 在职场中 有许多常见的陷阱 下面是一些例子 过度承诺和无法有效管理时间 在职场中 很容易迫于压力而承诺过多的事情 导致时间管理困难和任务完成的延误 这可能导致质量下降 工作生活平衡失衡 甚至疲
  • spring cache设置指定Key过期时间

    今天是2019年最后一天 回想年初立下的小目标 貌似都完成的不理想 还得继续努力啊 生活还在继续 加油 最近刚好在使用spring cache做缓存的时候 有需要针对不同的key设置过期时间的场景 找了下资料 实现这个功能 做个总结 spr
  • Ubuntu中报错:failed to create hard link

    1 完整报错打印 上面是我在编译jpg图片的解码库时遇到的报错 报错原因显示创建硬链接失败 不允许创建硬链接 2 报错原因分析 1 我是在Ubuntu和Windows的共享文件夹目录中编译程序 共享目录是Ubuntu和Windows共享的
  • 使用gpg密钥验证github提交

    git是现在最流行的版本控制工具 而且它确实功能很强大 在使用git之前 首先要设置用户名和电子邮箱两个参数 可能有人会有疑问 假如两个不同的人使用相同的用户名和电子邮箱进行提交 会怎么样呢 答案是可以的 git本身无法判断 所以会把这两个
  • C++ 单元测试与代码覆盖率测试方法

    前言 测试是软件开发过程中一个必须的环节 测试确保软件的质量符合预期 对于工程师自己来说 单元测试也是提升自信心的一种方式 直接交付没有经过测试的代码是不太好的 因为这很可能会浪费整个团队的时间 在一些原本早期就可以发现的问题上 而单元测试
  • Shell脚本攻略:文本三剑客之awk

    目录 一 理论 1 awk原理 2 awk打印 3 awk条件判断 4 awk数组与循环 5 awk函数 6 常用命令 二 实验 1 统计磁盘可用容量 2 统计 etc下文件总大小 3 CPU使用率 4 统计内存 5 监控硬盘 一 理论 1
  • 异步赠书:AI专栏(AI圣经!《深度学习》中文版)

    最新活动 邀请10名好友关注微信公众号 异步图书 10天 即可获得异步图书一本 点击立即参与活动 今天小编开启了大咖重磅新书赠送活动 如果你热爱读书 热爱技术 参与到异步赠书活动中来 都有机会得到新书中的一本哦 本次活动已结束 没有抢到 深
  • poj 1852 Ants

    题意 在一个管子里面有一些蚂蚁 他们按照初始的方向走 遇到蚂蚁后就掉头 问最少经过多长的时间 他们都已经走出了管子 这道题目想到了会很简单没想到会很纠结 提示 他们相遇的时候假设他们穿过了对方的身体 代码 include
  • AD利用嘉立创的封装

    1 首先 打开元件库 搜索元器件 2 点开它的封装 符号 3 文件 gt 导出 gt Altium Designer 4 然后在AD上面打开这个文件 5 将其复制 粘贴放到PCB库中 6 然后在原理图中的封装管理器中 添加封装 管脚映射修改
  • BAT紧盯,汽车后市场的优质资产还有谁?

    巨头的一举一动 都是各方焦点 最近阿里与汽车超人 康众汽配的联手 一方面说明汽车后市场这块肥肉巨头紧盯 潜力仍待挖掘 另一方面也说明 仅拥有资本 用户 供应链在这个行业并不一定能走下去 加码行业垂直资源 合纵连横 资源互补或许才是出路 01
  • React多页面应用5(webpack4 多页面自动化生成多入口文件)

    本教程总共9篇 每日更新一篇 请关注我们 你可以进入历史消息查看以往文章 也敬请期待我们的新文章 1 React多页面应用1 webpack4 开发环境搭建 包括热更新 api转发等 2018 04 04 2 React多页面应用2 web
  • 基于Springboot+SpringCloud 的微服务架构脚手架,接私活很丝滑(附源码)

    点击关注 武哥聊编程 2022 02 24 08 50 收录于话题 项目开发26个 大家好 我是武哥 今天给大家推荐一个牛逼的接私活项目 SpringCloud微服务架构项目 一个由商业级项目升级优化而来的微服务架构 采用SpringBoo
  • ctfshow web4

    本次解法使用工具 burpsuite和中国蚁剑 这是web3的进化版 老的方法已经行不通 了 只能通过日志注入得到shell 这里我们输入默认目录获取日志 url var log nginx access log 之后就得到了日志文件 接下
  • 【Python 3.7】将点数相乘:同时掷两个骰子时,通常将它们的点数相加。请通过可视化展 示将两个骰子的点数相乘的结果。

    Python 3 7 将点数相乘 同时掷两个骰子时 通常将它们的点数相加 请通过可视化展 示将两个骰子的点数相乘的结果 其中die py文件中的程序为 from random import randint class Die 表示一个骰子的
  • 在unicode环境下将CString类型转换成char

    原帖地址 http hi baidu com sqhily2008 blog item e38834fcaf105d0d09244d83 html 在Visual C NET2005中 默认的字符集形式是Unicode 但在VC6 0等工程
  • 自己动手绕线圈电感详细计算公式

    加载其电感量按下式计算 线圈公式 阻抗 ohm 23 14159F 工作频率 电感量 mH 设定需用360ohm阻抗 因此 电感量 mH 阻抗 ohm 23 14159 F 工作频率 360 23 14159 7 06 8 116mH 据此
  • element-table中当点击row的时候背景色发生

    效果图 当点击行的时候 则背景添加颜色 再次点击则颜色去掉 1 在el table标签中添加 row click和row style事件 row click tableClick row style isActive tableClick
  • Pyinstaller PyQt5 QFontDatabase: Cannot find font directory

    在解决了上一篇的 no module named pyqt5 sip问题以后 这是打包以后的第二个问题 在ubuntu 执行源码的时候字体可以正常显示 python3 main py 但是通过pyinstaller打包以后就找不到字体了 大
  • 根据数字二进制下1的数目排序

    LeetCode 根据数字二进制下1的数目排序 给你一个整数数组 arr 请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序 如果存在多个数字二进制中 1 的数目相同 则必须将它们按照数值大小升序排列 请你返回排序后的数组 示例
  • 【Vivado使用误区与进阶】XDC约束技巧——时钟篇

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