首页 > 其他分享 >【Xilinx约束】使用set_clock_groups 约束语法处理异步时钟域

【Xilinx约束】使用set_clock_groups 约束语法处理异步时钟域

时间:2024-05-31 15:30:18浏览次数:12  
标签:set group clock 约束 groups clk1 时钟

        在 Xilinx Vivado 环境中,set_clock_groups 约束用于定义时钟组,以确保工具在布局和布线时考虑时钟之间的关联性。这对于跨时钟域的设计和时序优化非常重要。        

        使用set_clock_groups 约束语法处理异步时钟域有不同的方式,适用于不同的约束场景。

不同方法 

命名时钟组

set_clock_groups -name <group_name>
                   -group <clock_list>
                   [-tag <tag_name>]
                   [-exclusion]
                   [-quiet]

        这种写法用于定义具有特定名称的时钟组,并且可以指定一个标签(-tag),表示时钟组之间的排斥关系(-exclusion),以及在执行操作时不显示消息(-quiet)。这种写法适用于将一组时钟定义为一个逻辑整体,并且可以对它们应用特定的时序约束。

参数说明

  • -name <group_name>: 指定时钟组的名称,用于在约束文件中唯一标识这个时钟组。
  • -group <clock_list>: 定义时钟组中包含的时钟列表,时钟名称之间用空格分隔。
  • -tag <tag_name>: 指定一个标签,用于在时序报告中标识特定的时钟组。
  • -exclusion: 如果指定,表示组内的时钟不应该相互影响。
  • -quiet: 执行操作时不显示消息。

示例

 假设你有三个时钟 clk1clk2clk3,你想要将它们约束为同一个时钟组,可以这样写:

set_clock_groups -name "clk_group1" -group "clk1 clk2 clk3"

 在这个示例中,clk_group1 是时钟组的名称,clk1 clk2 clk3 是时钟组中包含的时钟列表。

如果你想要创建两个时钟组,并且指定它们之间是相互排斥的,可以添加 -exclusion 选项

set_clock_groups -name "clk_group1" -group "clk1 clk2" -exclusion
set_clock_groups -name "clk_group2" -group "clk3"

 这将创建两个时钟组,clk_group1 包含 clk1clk2clk_group2 仅包含 clk3,并且 clk_group1clk_group2 是相互排斥的。

 以下是如何使用 set_clock_groups 约束来表示三个互相排斥的时钟

set_clock_groups -name "clk_group1" -group {clk1} -exclusion
set_clock_groups -name "clk_group2" -group {clk2} -exclusion
set_clock_groups -name "clk_group3" -group {clk3} -exclusion

在这个示例中,每个时钟都被放在了自己的时钟组中,并且每个组都使用了 -exclusion 选项,表示这些时钟是互相排斥的。

另一种方法是将所有三个时钟放在同一个组内,并使用 -exclusion 选项,但这种方法通常用于表示组内时钟之间的互相排斥,而不是跨组的排斥。如果你确实想要将所有三个时钟放在同一个组内并表示它们互相排斥,可以这样写:

set_clock_groups -name "exclusion_group" -group {clk1 clk2 clk3} -exclusion

 然而,这种方法在逻辑上可能会有些混淆,因为它创建了一个包含所有三个时钟的单一组,但指出组内的时钟是互相排斥的。通常,我们期望互相排斥的时钟属于不同的组。

在大多数情况下,如果你有三个互相排斥的时钟,最好是将它们分别放在不同的组中,如第一个示例所示,这样可以清晰地表达它们之间的排斥关系。这样做也有助于工具更有效地进行时序分析和优化。

 异步时钟组

set_clock_groups -asynchronous -group {clk1} -group {clk2}

         这里的 {clk1}, {clk2}, ... 是时钟或时钟组的列表,它们之间用空格分隔。

        这种写法专门用于定义异步时钟组,即明确指出这些时钟组之间没有固定的时序关联。使用 -asynchronous 选项可以确保时序分析工具知道这些时钟组是独立操作的,不会相互影响。

示例

假设你有两个时钟 clk1clk2,它们属于不同的时钟域并且是异步的,可以这样写约束:

set_clock_groups -asynchronous -group {clk1} -group {clk2}

在这个示例中,clk1clk2 被定义为异步时钟组,意味着它们之间没有时序关联。

如果你有多个时钟并且它们都与其他时钟异步,你可以继续添加更多的 --group 参数

set_clock_groups -asynchronous -group {clk1} -group {clk2} -group {clk3}

这表示 clk1clk2clk3 都属于不同的时钟域,并且它们之间都是异步的。

注意事项

  • 使用 -asynchronous 选项时,不需要指定 -exclusion,因为异步已经隐含了时钟组之间的互相排斥。
  • 异步时钟组的约束对于时序分析工具来说非常重要,因为它们帮助工具理解不同时钟域之间的数据传输需要特殊的处理,例如使用双触发器同步或其他同步机制。
  • 在设计跨时钟域的数据传输时,除了使用 -asynchronous 约束外,还需要确保在 RTL 代码中实现正确的同步机制,以避免亚稳态和时序问题。

关于使用何种方法 

        取决于 Vivado 的版本和具体的使用场景。在 Vivado 的早期版本中,可能更多地使用第一种写法来定义时钟组和它们之间的关系。而在处理跨时钟域的设计时,第二种写法提供了一种明确的方式来指定时钟组之间的异步关系。

        在 Vivado 的较新版本中,推荐的做法是使用第二种写法(如果适用)来明确地定义异步时钟组,因为它提供了更好的时序分析控制,并且有助于避免时序违例和潜在的时序问题。

        总的来说,两种写法都是有效的,选择哪一种取决于你的具体需求和设计中的时钟关系。如果你需要定义异步时钟组,推荐使用包含 -asynchronous 选项的第二种写法。如果你需要定义具有特定名称和标签的时钟组,可以使用第一种写法。在实际应用中,应参考 Xilinx 的官方文档或时序约束向导来确定最适合你设计的方法。

标签:set,group,clock,约束,groups,clk1,时钟
From: https://blog.csdn.net/sqqwm/article/details/139293068

相关文章

  • 论文总结:Grasp-Anything: Large-scale Grasp Dataset from Foundation Models
    目录一、论文摘要二、Grasp-Anything数据集A.场景生成B.抓取姿势标注​编辑C.Grasp-Anything统计D.Grasp-Anything对社区的帮助三、实验A.零样本抓取检测B.机器人评估C.野外抓取检测D.讨论四、总结论文:https://arxiv.org/pdf/2309.09818v1代码:https://......
  • 33.MySQL数据库【三】约束条件
    约束条件限制表中的数据,保证数据的准确性和可靠性而存在的限制规则【一】非空约束(notnull)限制指定字段不能为空#建表createtableeg( namevarchar(32)notnull, hobbyvarchar(32));#name字段不能为空【二】唯一性约束(unique)限制字段具有唯一性,不能重复,但能为......
  • resetlogs强制拉库失败并使用备份system文件还原数据库故障处理---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:resetlogs强制拉库失败并使用备份system文件还原数据库故障处理作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]接手一个库,在open的过程中遭遇到ORA-6002662错误SunMay2......
  • Kubernetes StatefulSet 扩缩容与升级
    KubernetesStatefulSet扩缩容与升级StatefulSet扩容kubectlscalestsstateful-set-web--replicas=5root@k8s-master1:~#kubectlgetpods--watch-lapp=pod-nginxNAMEREADYSTATUSRESTARTSAGEstateful-set-web-01/1Runnin......
  • MySQL约束条件,非空空约束(not nullnull),主键约束PK(primary key),外键约束FK(foreign key
    ⅠMySQL约束条件【一】什么是约束条件约束条件:限制表中的数据,保证添加到数据表中的数据准确和可靠性!凡是不符合约束的数据,插入时就会失败!约束条件在创建表时可以使用,也可以修改表的时候添加约束条件【二】约束条件概览null和notnull为空和不为空限制整数类型必须大......
  • error Conflict: Multiple assets emit different content to the same filename ind
    ERRORFailedtocompilewith1error20:32:04errorConflict:Multipleassetsemitdifferentcontenttothesamefilenameindex.htmlERRORinConflict:Multipleassetsemitdif......
  • YAML示例:创建daemonset
    apiVersion:apps/v1kind:DaemonSetmetadata:name:test-ds-1namespace:sjlabels:k8s-app:arksec-ds-1spec:selector:matchLabels:name:arksec-ds-1template:metadata:labels:name:arksec-ds-1spec:nodeSelector:#只让它在指定hostname的节点上创建,注意,......
  • antdv: Each record in table should have a unique `key` prop,or set `rowKey` to a
    在使用ant-designvue框架的时候,表格组件里面会碰到 Eachrecordintableshouldhaveaunique key prop,orset rowKey toanuniqueprimarykey这样的报错,具体见下图 原因分析:我看了一下官网,以及搜索了很多答案,最终原因是:在Table中,dataSource和columns里的数据......
  • get和set,?和 ?? ,?: ,?. ?:[]的用法和区别
    C#中,get和set访问器通常与属性(property)一起使用,用于定义如何读取和写入属性的值。属性提供了一种比字段(field)更灵活的方式来封装类的数据成员。区别用途:get访问器:用于读取属性的值。set访问器:用于设置属性的值。返回值:get访问器必须返回一个值,其类型必须与属性的......
  • Vue 3 设置中的新 `<script setup>` 语法是如何使用的?
    Vue3中的新<scriptsetup>语法详解Vue.js作为现代前端框架的一大代表,它简洁易用的特性和不断创新的理念吸引了一大批开发者。在Vue3中推出了很多改进和新特性,其中一个引起广泛关注的便是<scriptsetup>语法。这篇文章将详细介绍Vue3中的<scriptsetup>语法,......