set_input_delay属于时序约束中的IO约束,我之前的时序约束教程中,有一篇关于set_input_delay的文章,但里面写的并不是很详细,今天我们就来详细分析一下,这个约束应该如何使用。

FPGA时序约束理论篇之IO约束

  首先还是需要明确一点,这个约束没有延迟的作用,如果需要对输入信号做延迟,就要使用IODELAY这种原语。

什么是input_delay?

  input_delay是指输入的数据到达FPGA的pad时相对于时钟边沿的延迟有多大,单位是ns,数值可以是正,也可以是负。

假设时钟是没有skew的,那么上图中的input_delay就等于Clock to Out+Trace Dealy,即上游器件的时钟到触发器输出的延时+PCB上的布线延迟,即Tco+Tdelay

但我们实际的应用,碰到的大多数情况都是随路时钟,也就是说上游器件输出数据的同时也会输出时钟给FPGA,就像下图所示:

set_input_delay语法

set_input_delay [‑clock <args>] [‑reference_pin <args>] [‑clock_fall][‑rise] [‑fall] [‑max] [‑min] [‑add_delay] [‑network_latency_included][‑source_latency_included] [‑quiet] [‑verbose] <delay> <objects>
Name Description
[-clock] Relative clock
[-reference_pin] Relative pin or port
[-clock_fall] Delay is relative to falling edge of clock
[-rise] Specifies rising delay
[-fall] Specifies falling delay
[-max] Specifies maximum delay
[-min] Specifies minimum delay
[-add_delay] Don’t remove existing input delay
[-network_latency_included] Specifies network latency of clock already included
[-source_latency_included] Specifies source latency of clock already included
[-quiet] Ignore command errors
[-verbose] Suspend message limits during command execution
<delay> Delay value
<objects> List of ports

下面来详细说明一下:

-clock:input_delay一般是相对时钟而言的,而且默认是相对于上升沿,我们可以通过clock_fall参数来指定下降沿,这里的时钟可以是虚拟时钟;

-reference_pin:指定相对于某个pin上的时钟边沿,跟-clock的参数其实是一个意思,毕竟时钟也是通过pin输入进来的;

-clock_fall:指定相对于时钟下降沿

-rise:指定端口的上升转换的输入延迟

-fall:指定端口的下降沿的输入延迟

-max:最大延迟

-min:最小延迟,我们做input delay主要就是约束这两个参数

-add_delay:以增量的方式添加延迟,如果不加该参数,默认行为是替换现有的延时

-network_latency_included:表示参考时钟的网络延迟也包含在延迟中

-source_latency_included:跟上一个参数类似的含义,该参数表示时钟的源端延迟包含在延时中

-quiet:忽略指令的错误信息,即便指令错了也依然返回TCL_OK

-verbose:命令执行期间忽略消息数量的限制,就是说会返回该指令的所有的message

delay:延迟值

objects:端口列表

Vivado Timing Constraints Wizard

很多约束时钟vivado中的Timing Constraints Wizard工具会方便很多,对于input delay的约束,界面如下:

我们需要设置的就是数据相对于时钟的最大和最小的延时,trce_dly_mintrce_dly_max是指布线的延迟,一般随路时钟跟数据都会采用等长布线的方式,因此可以设置为0即可。

在设置完成后,下面的Tcl Command Preview中就会出现约束的tcl语法,这种方式对于该约束是很了解或者懒得手写约束的朋友来说非常的方便。

Examples

1.输入数据比时钟延迟3ns的delay:

create_clock -name clk -period 10 [get_ports clk_in]
set_input_delay -clock clk 3 [get_ports DIN]

2.输入数据相对于时钟的下降沿有2ns的delay:

set_input_delay -clock_fall -clock clk 2 [get_ports DIN]

3.复位管脚相对于BUFG输出的时钟有2ns的delay:

set_input_delay -clock wbClk 2 -reference_pin [get_pin wbClk_IBUF_BUFG_inst/O] [get_ports reset]

4.时钟虚拟时钟的约束

虚拟失踪的具体时钟方式可以参考另一篇文章

FPGA的虚拟时钟如何使用?

外部IO的参考时钟比设计中主时钟的路径上多了一个BUFFER

create_clock -name sysclk -period 10 [get_ports clkin]
create_clock -name virtclk -period 10
set_clock_latency -source 1 [get_clock virtclk]
set_input_delay -clock virtclk -max 4 [get_ports dina]
set_input_delay -clock virtclk -min 2 [get_ports dina]

5.双沿时钟的约束,对上升沿和下降沿都需要进行约束

create_clock -name clk_ddr -period 6 [get_ports DDR_CLK_IN]
set_input_delay -clock clk_ddr -max 2.1 [get_ports DDR_IN]
set_input_delay -clock clk_ddr -max 1.9 [get_ports DDR_IN] -clock_fall -add_delay
set_input_delay -clock clk_ddr -min 0.9 [get_ports DDR_IN]
set_input_delay -clock clk_ddr -min 1.1 [get_ports DDR_IN] -clock_fall -add_delay

具体案例

比如某器件手册的输出时钟与数据的setup和hold要求如下图:

该时钟双沿采样,在时钟边沿到来后,结合input_delay的最大最小延迟的定义,可以知道:

  • 最小延迟就是hold time,因为如果比hold time还小了,那保持时间就不满足了,即1.2ns
  • 最大延迟是时钟周期-setup time,这里上下沿之间的间隔是4ns,因此max delay是2.8ns

因此input delay的约束如下:

set_input_delay -clock [get_clocks rx_clk] -min 1.200 [get_ports RXD0] -add_delay
set_input_delay -clock [get_clocks rx_clk] -min 1.200 [get_ports RXD1] -add_delay
set_input_delay -clock [get_clocks rx_clk] -min 1.200 [get_ports RXD2] -add_delay
set_input_delay -clock [get_clocks rx_clk] -min 1.200 [get_ports RXD3] -add_delay
set_input_delay -clock [get_clocks rx_clk] -min 1.200 [get_ports RXC] -add_delay
set_input_delay -clock [get_clocks rx_clk] -max 2.800 [get_ports RXD0] -add_delay
set_input_delay -clock [get_clocks rx_clk] -max 2.800 [get_ports RXD1] -add_delay
set_input_delay -clock [get_clocks rx_clk] -max 2.800 [get_ports RXD2] -add_delay
set_input_delay -clock [get_clocks rx_clk] -max 2.800 [get_ports RXD3] -add_delay
set_input_delay -clock [get_clocks rx_clk] -max 2.800 [get_ports RXC] -add_delay
set_input_delay -clock [get_clocks rx_clk] -min 1.200 [get_ports RXD0] -clock_fall -add_delay
set_input_delay -clock [get_clocks rx_clk] -min 1.200 [get_ports RXD1] -clock_fall -add_delay
set_input_delay -clock [get_clocks rx_clk] -min 1.200 [get_ports RXD2] -clock_fall -add_delay
set_input_delay -clock [get_clocks rx_clk] -min 1.200 [get_ports RXD3] -clock_fall -add_delay
set_input_delay -clock [get_clocks rx_clk] -min 1.200 [get_ports RXC] -clock_fall -add_delay
set_input_delay -clock [get_clocks rx_clk] -max 2.800 [get_ports RXD0] -clock_fall -add_delay
set_input_delay -clock [get_clocks rx_clk] -max 2.800 [get_ports RXD1] -clock_fall -add_delay
set_input_delay -clock [get_clocks rx_clk] -max 2.800 [get_ports RXD2] -clock_fall -add_delay
set_input_delay -clock [get_clocks rx_clk] -max 2.800 [get_ports RXD3] -clock_fall -add_delay
set_input_delay -clock [get_clocks rx_clk] -max 2.800 [get_ports RXC] -clock_fall -add_delay

因此,只要记住:

  • min_delay就是上游器件的hold time
  • max_delay是时钟周期-上游器件的setup time
  • 如果是双沿的话,就是半个时钟周期,而且还需要对时钟的下降沿进行约束

微信公众号:傅里叶的猫

set_input_delay如何使用?相关推荐

  1. fpga时序相关—set_input_delay和set_output_delay

    set_input_delay与set_out_delay理解 set_input_delay 当fpga 外部送入fpga内部寄存器数据时,会有时钟launch clk以及latch clock,前 ...

  2. set_input_delay/set_output_delay

    input delay和output delay是在SDC中经常会遇到的问题,看似简单其实还有很多模棱两可的问题的.特别是为什要设置input delay和output delay?常用的30%和70 ...

  3. VIVADO时序约束之Input Delay(set_input_delay)

    前言 I/O Delay约束主要有两个命令:set_input_delay和set_output_delay. I/O Delay约束的主要目的同时钟约束一样,是告诉编译器,外部输入输出信号与参考时钟 ...

  4. set_input_delay中-add_delay的作用

    在设置input_delay时,我们经常会使用下面的方式: set_input_delay -clock clk -min 2 [get_ports data_in] set_input_delay ...

  5. 【芯片前端】关于set_input_delay/set_output_delay慢信号约束到快时钟的思考

    前言 继续学习sdc的配置知识,这次思考的缘由是在写上一篇 [芯片前端]sdc学习日常--端口delay的正向设置与反向设置 中,写了这样一句话"还有一种方式,是把约束更恶劣的设置放在下面写 ...

  6. TimeQuest学习之三------外部寄存器模型

    clock skew = < destination reg clock delay > - < source reg clock delay > 为了使clock skew ...

  7. 漫谈时序设计(3)走进时序约束的大门!

    目录 前言 Intra-Clock&Inter-Clock Paths 时序约束 主时钟约束 衍生时钟约束 延迟约束 伪路径约束 多周期路径约束 写在最后 前言 为了秋招,对时序分析做了一些准 ...

  8. 【 Vivado 】输入延迟约束实例

    上篇博文讲了输入延迟约束( Input Delay Constraints):输入延迟约束(Constraining Input Delay) 这篇博文讲解具体的实例,通过实例去学习是最有效果的. 实 ...

  9. 【 Vivado 】输入延迟约束(Constraining Input Delay)

    前几篇博文提到了四种时序路径:基本的时序约束.分析的概念 1)      FPGA内部时序单元间的路径 2)      输入端口到FPGA内部时序单元的路径 3)      FPGA内部时序单元到输出 ...

最新文章

  1. 神经网络常用激活函数
  2. 《零基础看得懂的C语言入门教程 》——(八)了解基本数组还不是那么简单
  3. python kotlin_Java和Python中类似Kotlin的生成器,续:附加参数
  4. ssh 与 telnet 有何不同?_采用创新面料Nike Infinalon的全新瑜珈系列究竟有何不同?...
  5. 《企业软件交付:敏捷与高效管理精要》——3.4 企业软件交付的软件工厂方法...
  6. 如何在DevSecOps道路上快速、安全地抵达终点
  7. crawler py
  8. 如何帮卡住的 iPhone 强制还原? Tenorshare ReiBoot 只需四步实现 iPhone 重装
  9. LeetCode - 720 - 词典里最长的单词(longest-word-in-dictionary)
  10. java学籍管理系统部分代码_java学籍管理系统源代码
  11. 用gin+xorm+docker编写Online Judge后端
  12. [实战]爬取网抑云音乐评论
  13. 掌阅 兼容性测试 结果
  14. 前端配置prettier工具格式化代码
  15. 建立时间保持时间及违例如何处理,求最大时钟频率
  16. Html-小米官网头部
  17. ARM基础(1):Cortex-M3的核心寄存器和特殊寄存器
  18. 中国膜产业需求规模与投资潜力分析报告2022版
  19. CSS实现button按钮的点击效果
  20. mysql 查询所有表以及对应的信息

热门文章

  1. 创建一键部署的前后端(SpringBoot+Vue+nginx)项目镜像
  2. 分享35款非常有用的免费字体
  3. VB与C#的区别(转载)
  4. ubuntu 下stl obj ply 3dx fbx等各种格式转pcd方法
  5. 嵌入式系统及应用——SOC分类
  6. 计算机模型不能预测未来,预测未来是一门艰深的艺术
  7. 功能软件(一):以IDM对抗百度网盘!
  8. 研发效能工程实践-代码评审
  9. 自媒体、短视频博主都在用这5个免费视频网站
  10. 4.1-python爬虫之多线程爬虫