文章目录

  • 1.3 时钟周期约束
    • **1. create_clock**
    • **2. create_generated_clock**
    • **3. set_clock_groups**
    • **4. 创建虚拟时钟**

本文摘抄自:
个人网站:http://www.technomania.cn/
微信公众号:Quant_times、Reading_Times

1.3 时钟周期约束

时钟周期约束,顾名思义,就是我们对时钟的周期进行约束,这个约束是我们用的最多的约束了,也是最重要的约束。
下面我们讲一些vivado中时钟约束指令。

1. create_clock

在vivado中使用create_clock来创建时钟周期约束,使用方法为:

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


这里的时钟必须是主时钟primary clock,主时钟通常有两种情形:一种是时钟由外部时钟源提供,通过时钟引脚引入FPGA,该时钟引脚绑定的时钟为主时钟:另一种是高速收发器(GT)的时钟RXOUTCLK或TXOUTCLK。对于7系列FPGA,需要对GT的这两个时钟收工约束:对于UltraScale FPGA,只需要对GT的输入时钟约束即可,Vivado会自动对这两个时钟约束。
如何确定主时钟是时钟周期约束的关键,除了根据主时钟的两种情形判断之外,还可以借助Tcl脚本判断。
在vivado自带的example project里面,打开CPU(HDL)工程,如下图所示。

把工程中的xdc文件中,create_clock的几项都注释掉。这里解释下端口(Port)和管脚(Pin)。get_ports获取的是FPGA的IO端口,get_pins获取的是FPGA内部子模块的Pin。

再Open Synthesized Design或者 Open Implementation Design,并通过以下两种方式查看时钟。
a. 方式一
运行tcl指令 report_clock_networks -name mainclock,显示结果如下:

b. 方式二
运行tcl指令 check_timing -override_defaults no_clock,显示结果如下:

对于高速收发器的时钟,我们也以vivado中的CPU example工程为例,看下xilinx官方约束是怎么约束的。

#Define the clocks for the GTX blocks
create_clock -name gt0_txuserclk_i -period 12.8 [get_pins mgtEngine/ROCKETIO_WRAPPER_TILE_i/gt0_ROCKETIO_WRAPPER_TILE_i/gtxe2_i/TXOUTCLK]
create_clock -name gt2_txuserclk_i -period 12.8 [get_pins mgtEngine/ROCKETIO_WRAPPER_TILE_i/gt2_ROCKETIO_WRAPPER_TILE_i/gtxe2_i/TXOUTCLK]
create_clock -name gt4_txuserclk_i -period 12.8 [get_pins mgtEngine/ROCKETIO_WRAPPER_TILE_i/gt4_ROCKETIO_WRAPPER_TILE_i/gtxe2_i/TXOUTCLK]
create_clock -name gt6_txuserclk_i -period 12.8 [get_pins mgtEngine/ROCKETIO_WRAPPER_TILE_i/gt6_ROCKETIO_WRAPPER_TILE_i/gtxe2_i/TXOUTCLK]

当系统中有多个主时钟,且这几个主时钟之间存在确定的相位关系时,需要用到-waveform参数。如果有两个主时钟,如下图所示。

则时钟约束为:

约束中数字的单位默认是ns,若不写waveform参数,则默认是占空比为50%且第一个上升沿出现在0时刻。使用report_clocks指令可以查看约束是否生效。还是上面的CPU的例子,把约束都还原到最初的状态,执行report_clock后,如下图所示,我们只列出其中几项内容。

一般来讲,我们输入时钟都是差分的,此时我们只对P端进行约束即可。如果同时约束了P端和N端,通过report_clock_interaction可以看到提示unsafe。这样既会增加内存开销,也会延长编译时间。

2. create_generated_clock

使用方法为:


从名字就能看出来,这个是约束我们在FPGA内部产生的衍生时钟,所以参数中有个-source,就是指定这个时钟从哪里来,这个时钟叫做master clock,是指上级时钟,区别于primary clock。它可以是我们上面讲的primary clock,也可以是其他的衍生时钟。该命令不是设定周期或波形,而是描述时钟电路如何对上级时钟进行转换。这种转换可以是下面的关系:
简单的频率分频
简单的频率倍频
频率倍频与分频的组合,获得一个非整数的比例,通常由MMCM或PLL完成
相移或波形反向
占空比改变
上述所有关系的组合
衍生时钟又分为两种情况:
a. Vivado自动推导的衍生时钟
b. 用户自定义的衍生时钟
首先来看第一种,如果使用PLL或MMCM,则Vivado会自动推导出一个约束。大家可以打开Vivado中有个叫wavegen的工程,在这个工程中,输入时钟经过PLL输出两个时钟,如下图所示。

但在xdc文件中,并未对这2个输出时钟进行约束,只对输入的时钟进行了约束,若我们使用report_clocks指令,则会看到:

注:有三个约束是因为PLL会自动输出一个反馈时钟
自动推导的好处在于当MMCM/PLL/BUFR的配置改变而影响到输出时钟的频率和相位时,用户无需改写约束,Vivado仍然可以自动推导出正确的频率/相位信息。劣势在于,用户并不清楚自动推导出的衍生时钟的名字,当设计层次改变时,衍生时钟的名字也可能改变。但由于该衍生时钟的约束并非我们自定义的,因此可能会没有关注到它名字的改变,当我们使用这些衍生时钟进行别的约束时,就会出现错误。
解决办法就是用户自己手动写出自动推导的衍生时钟的名字,也仅仅写出名字即可,其余的不写。如下如所示。

这一步很容易会被提示critical warning,其实有个很简单的方法,就是name 和source都按照Vivado中生成的来。

3. set_clock_groups

使用方法:

这个约束常用的方法有三种,第一种用法是当两个主时钟是异步关系时,使用asynchronous来指定。这个在我们平时用的还是比较多的,一般稍微大点的工程,都会出现至少两个主时钟,而且这两个时钟之间并没有任何的相位关系,这时就要指定:

第二种用法是当我们需要验证同一个时钟端口在不同的时钟频率下是否能获得时序收敛时使用。比如有两个异步主时钟clk1和clk2,需要验证clk2频率为100MHz,clk1频率分别为50MHz、100MHz和200MHz下的时序收敛情况,我们就可以这样写。

第三种用法就是当我们使用BUFGMUX时,会有两个输入时钟,但只有一一个时钟会被使用。比如MMCM输入100MHz时钟,两个输出分别为50MHz和200MHz,这两个时钟进入了BUFGMUX,如下图所示。

在这种情况下,我们需要设置的时序约束如下:

4. 创建虚拟时钟

虚拟时钟通常用于设定对输入和输出的延迟约束,这个约束其实是属于IO约束中的延迟约束,之所以放到这里来讲,是因为虚拟时钟的创建,用到了本章节讲的一些理论。虚拟时钟和前面讲的延迟约束的使用场景不太相同。顾名思义,虚拟时钟,就是没有与之绑定的物理管脚。虚拟时钟主要用于以下三个场景:
a. 外部IO的参考时钟并不是设计中的时钟
b. FPGA I/O路径参考时钟来源于内部衍生时钟,但与主时钟的频率关系并不是整数倍
c. 针对I/O指定不同的jitter和latency
简而言之,之所以要创建虚拟时钟,对于输入来说,是因为输入到FPGA数据的捕获时钟是FPGA内部产生的,与主时钟频率不同;或者PCB上有Clock Buffer导致时钟延迟不同。对于输出来说,下游器件只接收到FPGA发送过去的数据,并没有随路时钟,用自己内部的时钟去捕获数据。
如下图所示,在FPGA的A端和B端口分别有两个输入,其中捕获A端口的时钟是主时钟,而捕获B端口的时钟是MMCM输出的衍生时钟,而且该衍生时钟与主时钟的频率不是整数倍关系。

这种情况下时序约束如下:

可以看到,创建虚拟时钟用到的也是create_clock约束,但后面并没有加get_ports参数,因此被称为虚拟时钟。
再举个例子,我们常用UART和SPI,当FPGA通过串口向下游器件发送数据时,仅仅发送过去了uart_tx这个数据,下游器件通过自己内部的时钟去捕获uart_tx上的数据,这就需要通过虚拟时钟来约束;而当FPGA通过SPI向下游器件发送数据时,会发送sclk/sda/csn三个信号,其中sclk就是sda得随路时钟,下游器件通过sclk去捕获sda的数据,而不是用自己内部的时钟,这就不需要虚拟时钟,直接使用set_output_delay即可。
注意,虚拟时钟必须在约束I/O延迟之前被定义。
5. 最大最小延迟约束
顾名思义,就是设置路径的max/min delay,主要应用场景有两个:
a. 输入管脚的信号经过组合逻辑后直接输出到管脚
b. 异步电之间的最大最小延迟

设置方式为:

set_max_delay <delay> [-datapath_only] [-from <nodu_list>][-to <node_list>][-throurh <node_list>]
set_min_delay <delay> [-from <nodu_list>][-to <node_list>][-throurh <node_list>]


max/min delay的约束平时用的相对少一些,因为在跨时钟域时,我们往往会设置asynchronous或者false_path。对于异步时钟,我们一般会通过设计来保证时效能够收敛,而不是通过时序约束来保证。

时钟周期约束详细介绍相关推荐

  1. xilinx Vivado的使用详细介绍(2):创建工程、添加文件、综合、实现、管脚约束、产生比特流文件、烧写程序、硬件验证

    xilinx Vivado的使用详细介绍(2):创建工程.添加文件.综合.实现.管脚约束.产生比特流文件.烧写程序.硬件验证 Author:zhangxianhe 新建工程 打开Vivado软件,直接 ...

  2. hibernate主键详细介绍

    hibernate主键详细介绍 /** * * @author liuguangyi * @content ejb3注解的API定义在javax.persistence.*包里面. * * 注释说明: ...

  3. Detection and Classification of Acoustic Scenes and Events(DCASE2013详细介绍)

    在DCASE 2013官网上,了解到在本篇文章中,详细描述了DCASE2013挑战赛的结果.下面加上个人的理解做了相应的翻译,可能有不对的地方,在之后的会慢慢改善. 摘要 对于智能系统来说,使用音频形 ...

  4. CodeSmith--SchemaExplorer类结构详细介绍

    CodeSmith----SchemaExplorer类结构详细介绍 CodeSmith与数据库的联系,在CodeSmith中自带一个程序集SchemaExplorer.dll,这个程序集中的类主要用 ...

  5. C++新手之详细介绍MFC

    我们都知道MFC是C++类库,本文详细介绍C++的这个类库,适合初学者阅读,希望对你有帮助,一起来看. MFC (Microsoft Foundation Class Library)中的各种类结合起 ...

  6. oracle的优化适用于mysql吗_性能优化之数据库优化,适用于Sqlite、Mysql、Oracle、Sql server,详细介绍了索引和事务及部分针对Sqlite的优化...

    本文为性能优化的第一篇--数据库性能优化,原理适用于大部分数据库包括Sqlite.Mysql.Oracle.Sql server,详细介绍了索引(优缺点.分类.场景.规则)和事务,最后介绍了部分单独针 ...

  7. HTTP协议详细介绍~超详细

    下面是对HTTP的详细介绍,HTTP协议是应用最广泛的网络协议. 希望可以帮助到有需要的小伙伴 文章目录 HTTP是什么 HTTP协议历史与标准 HTTP请求与响应消息 HTTP的基本原理 基于HTT ...

  8. 卷积神经网络超详细介绍

    文章目录 1.卷积神经网络的概念 2. 发展过程 3.如何利用CNN实现图像识别的任务 4.CNN的特征 5.CNN的求解 6.卷积神经网络注意事项 7.CNN发展综合介绍 8.LeNet-5结构分析 ...

  9. arcgis api 4.13 —— Layer详细介绍

    arcgis api 4.13 Layer详细介绍 近日,esri官方更新了arcgis api4.12版本,接下来我将就此API做一个大概的梳理.本篇文章是关于图层(layer)的一个大概.主要分为 ...

最新文章

  1. 一句话总结等距映射(流形学习)
  2. OFDM技术及其应用
  3. mysql操作库命令_MYSQL数据库------操作命令笔记
  4. 系统辨识理论及应用_控制理论学习书单推荐(值得一读)
  5. 为Unity项目生成文档(一)
  6. mysql时间正确时区错误_在app中的日期时间但在mysql [时区]错误
  7. Element 2.13.0 发布,基于 Vue 的桌面端组件库
  8. 前端笔试能查吗_微软前端社招笔试详解
  9. Android持久化技术
  10. Windows传统取证的一些笔记
  11. Emulator: Process finished with exit code -1073741515 (0xC0000135)错误
  12. PADS VX2.8 原理图图页的添加与名称修改的方法
  13. 分布式文件存储系统FastDFS
  14. 广州大学机器学习与数据挖掘实验三
  15. gps测试软件怎么算正常,完整的GPS测试和经济实用的解决方案
  16. uniapp 上传图片到华为云obs
  17. PHP中RabbitMQ之amqp扩展实现(四)
  18. Ubuntu20.04安装MongoDB
  19. W5500常见问题集锦
  20. syzkaller 源码阅读笔记1(syz-extract syz-sysgen)

热门文章

  1. 7-23 h0036. 蛇形矩阵
  2. Webpage not available err_cleartext_not_permitted
  3. 永远不要以为别人真正明白你的话
  4. 打开WHR-HP-G54-AP的HP(High Power)功能
  5. SlimDX和WPF的合作应用
  6. java bytebuffer 读写_java io byteBuffer
  7. 打车软件为抢入口开战
  8. python爬取企业电话_某数据公司电话以及地址信息爬取
  9. OSChina 周四乱弹 —— 人生得意须尽欢,莫使金樽空对月
  10. 杰里之AC897N、AD697N蓝牙耳机PCB LAYOUT说明【篇】