FPGA时序分析与约束(13)——I/O接口约束

news2024/11/26 16:23:02

一、概述

        在应用了时钟约束后,所有寄存器到寄存器的路径都能定时。为了获得更加精准的FPGA外部时序信息,设计者需要为FPGA的I/O接口指定时序信息,一般时序工具只能获取FPGA器件内部的时序信息,对于FPGA器件引脚之外的时序信息,必须由设计者约束定义。如果没有指定的输入输出的,时序分析工具会假设在接口上使用最优时序要求并假设电路单元的组合逻辑本身具有整个周期,电路单元外部没有信号。

二、输入有效

2.0 输入有效    

        我们需要为每个输入端口指定输入有效时间,考虑如下的一个电路图:

        对于电路单元B1,我们需要知道信号到达I1的时间。

        这个到达时间可以告诉实现工具在组合逻辑云C1(输入端口和第一个寄存器元器件之间)中花费的时间,反过来,到达时间也决定了要求优化的等级。如果信号没有按时达到F1(通过组合逻辑后的第一个寄存器)并被及时锁定,那么它将允许STA工具发送报告。思考如下图电路的情况:

        对于电路单元B2,需要指定输入I1的输入到达时间。当触发器由一个时钟触发时,信号从F1(前一个电路单元B1的F1)开始。这个时钟触发就充当了参考事件,参考事件产生后,信号通过线路经过触发器(Clk_to_Q延迟)、组合逻辑C1(在前一个电路单元B1中)、组合逻辑C2(在顶层中)和互连延迟。但是,如果考虑了I1的信号到达时间,那么延迟在C1、C2、Clk_to_Q、互连线等之间如何分配就不那么重要了。我们只需要知道参考事件在发生后经过多久到达现在的输入端口。

2.1 最小和最大有效时间

        这个话题在之前的文章中已经多次提到过了,这里再简单说明一下,在输入端口,设计者需要指定信号可以改变的最早时间、这也就是最小时间,在这个时间之前,输入信号不能到达输入输入端口。由此可以确定,输入端口的上一个值要保持到这个时间。最小时间可以保证输入信号不违反后级电路的保持时间要求。

        设计者还需要指定最大时间,在这个时间内,要确保输入端口上的输入信号有效。这个时间也是最迟时间,在这个时间内,输入端口上信号的所有变化都是有效的。最大时间用于确保满足后级电路的建立要求。

2.2 多时钟

        有的时候,一个输入信号可能由多个时钟触发,如下图所示:

        到达I1的信号可能从Clk1(电路单元B)处产生,也可能从Clk2(电路单元B2)处产生。两个触发事件可能相互独立。在这种情况下,到达事件会根据两个参考事件来指定。实现工具和STA工具会考虑每个到达时间,并同时满足在两个条件。

三、输出要求

3.0 输出要求

        对于每个输出端口,都需要指定信号被采样前,在电路单元外部经过的时间。电路如下图所示:

        对于电路单元B1来说,我们需要知道产生输出O1后,在采样前信号需要的传输时间。

        实现工具可以通过这个时间计算出应该在逻辑云C1(最后一个寄存器元件F1和输出端口O1之间)放置多少逻辑。STA工具也可以通过这个时间报告在某个时间O1上信号是否有效,这样在产生输出O1后,就有足够的时间经过电路单元的外部,如下图所示:

        对于电路单元B1,需要为输出O1指定输出要求时间(output required time)。O1输出后,信后由电路单元B2中的触发器F2采样。触发器F2的时钟起到了参考事件的作用。在参考事件到达F2之前,信号经过组合逻辑C2(在顶层中)、组合逻辑C3(在下一个电路单元中)存在延迟和互连延迟。信号需要在参考事件之前到达F2,这样触发器才能满足建立要求。但是,只要考虑了在O1处的信号输出要求时间,那么延迟在C2、C3、F2的建立时间和互连线之间是如何分配的就不重要了。我们只需要知道参考时间之前在输出端口处信号有效需要多长时间。在O1外的时间越多意味着逻辑云C1(寄存器与输出端口之间)的延迟越小。

        输出要求时间是根据信号采样之前,在电路单元外需要的时间来确定的,而不是根据输出端信号有效时间来确定的。输出要求时间可以通过计算得出。例如,如果输出延迟为6ns,这意味着信号输出后需要6ns。如果一个时钟触发器在10ns时对信号进行采样,那么意味着信号需要在4ns时有效。在SDC中,用户指定6,即输出后需要的时间时6ns。信号应该什么时间有效可以通过计算获得。这就是输入延迟和输出延迟在概念上的不同。在输入端,指定的输入延迟直接给定了输入有效时间。在输出端,指定的输出延迟是信号进一步传输需要的时间。输出延迟不同于输出信号的有效时间。

3.1 最小和最大要求时间

        有时候,在输出端不太能指定信号在输出后需要传输的精确时间,例如,从输出端到相同参考事件可能有多条路径时。但是,我们还是要求设计者尽可能给出信号输出后需要传输的最小时间和输出信号从输出出来后需要传输的最大时间。

3.2 多个参考事件

        有时候,输出信号可以被多个参考事件捕获,电路图如下所示:

        从O1出来的信号可以被Clk1捕获,也可以被Clk2捕获。这两个捕获事件可以是独立的。在这种情况下,要求时间根据两个参考事件来指定。这是实现工具和STA工具的功能,它们独立计算每个要求时间并满足每个要求。

四、set_input_delay 

        在输入端口指定延迟的SDC命令是set_input_delay。命令的BNF如下:

set_input_dalay    [-clock clock_name]
                   [-clock_fall]
                   [-level_sensitive]
                   [-rise]
                   [-fall]
                   [-max]
                   [-min]
                   [-add_delay]
                   [-network_latency_included]
                   [-source_latency_included]
                   delay_value port_pin_list

 4.1 时钟规格

        -clock 选项用于指定参考时钟,根据参考时钟指定延迟时间,这个选项通常指的是触发器输入端信号的时钟名称。

        假设电路单元B1的输入I1由触发器F1驱动,它也可以在其他电路单元中,还可以是顶层逻辑的一部分。假设触发F1的时钟还可以进入电路单元B1,B1的时钟名称是Clk1。在这种情况下,clock_name的规格应该指定为Clk1。这个时钟触发输入的到达时间,同时这个时钟也是参考事件。当驱动F1时,时钟信号的名称相同也没有关系。例如,可以把包含F1的时钟信号命名为CLK_1,但是,对于B1的输入延迟,时钟的名称还需指定以便对B1可见。

         有时候,触发F1的时钟信号可能不会进入电路单元B1,在这种情况下,需要为B1声明虚拟时钟。这种虚拟时钟的特性必须与触发F1的时钟相同,这时,虚拟时钟能够使用带-clock选项的clock_name来指定。

        默认情况下,输入延迟是基于时钟上升沿来指定的,但是,如果触发器F1由时钟下降沿触发,那么需要添加选项-clock_fall,这个选项可以使得参考事件是clock_name的下降沿而不是上升沿。

        如果时钟周期是10ns,具有{0 5}波形,触发器F1是由时钟下降沿触发的,那么可以指定时钟下降沿的延迟是2,或者指定时钟上升沿的延迟是7。关于时序分析,下面命令具有相同的作用。

set_input_delay -clock CLK1 -clock_fall 2.0 [get_ports I1]
set_input_delay -clock CLK1 7.0 [get_ports I1]

        但是,如果启动触发器F1是由时钟下降沿触发的,那么我们应该使用第一个命令,因为它可以很好地反映电路的设计。

        如果输入引脚是组合电路唯一路径的一部分,那么就没有时钟触发到达输入引脚上的信号。这种情况下,就不需要指定-clock。对于set_input_delay命令,参考事件是时间0。如果没有指定-clock,那么-clock_fall也就没有意义。因为现在许多设计都是同步的,通常会用set_input_dalay指定时钟,组合路径(即使存在)也可以使用其他约束方式来约束。

4.2 -level_sensitive

        如果启动元器件不是一个触发器而是一个锁存器,那么就应该指定这个开关。从概念上讲,使用这个开关后启动锁存器可以借用这个周期里的时间。这意味着建立裕度(setup slack)会减少——这考虑了当锁存器为透明信号从锁存器开始的情况。

        但是,这个选项应该谨慎使用。不同工具对这个选项的处理方式不同,一些工具和转换器会简单地忽略这个选项。如果设计者想使用这个选项,那么应该保证在整个过程中使用所有工具处理这个选项时都使用同一种方法。

4.3 rise/fall 限定符

        -rise 用于限定输入延迟与输入端口信号的上升沿对应。-fall用于限定输入延迟与输入端口的下降沿对应。如果在输入端口信号上升或下降时的输入到达时间不同,那么这个命令需要提供rise或者fall限定符。

        当不指定限定符 rise 或者 fall 时,给定值适用于这两种过渡。在CMOS电路中,上升和下降过渡时的路径延迟非常相似,所以不会经常使用 -rise/fall 规格。

4.4 min/max限定符

        -min 用于限定指定的延迟值与输入端口信号的最早到达时间到达对应。这个值用在当前设计内部以保持检查。-max 用于限定指定的延迟值与输入端口信号的最迟到达时间对应。这个值用于在当前设计内部以实现建立检查。

        当不使用-min/max限定符时,两个限定符使用相同的设定值。通常不使用-min/-max 限定符,其值与指定的最大延迟相同。

        目前随着纳米技术的发展,单个触发器的保持值大幅下降,在某种程度上可以说降低了很多。很显然,因为在数据路径上的延迟有限,所以会出现输入到达时间为正,保持时间为负的情况,即使保持值不是负值,也会与“零”非常接近,因此,在大部分情况下,通过启动元器件的延迟(启动触发器的Clk_to_q延迟)和互连延迟将比保持时间长,因此,大部分情况下外部到达信号都能满足保持要求。通常,使用最大值可以可靠完成建立检查。这个值也用于保持检查,无论如何必须满足保持检查。如果信号将输入到一个保持要求很大元器件中,那么保持检查就很重要,如内存。这种情况下,也应该正确指定-min值。

4.5 -add_delay

        许多时序分析工具都为用户提供了交互shell,用户使用这些shell可以修改上述指定值。当指定端口的输入延迟时,在这个端口上最新的规格就会覆盖前面的规格。如果用户必须在同一个端口指定多个参考事件的输入延迟,那么所有后续规格就需要指定-add_delay。

4.6 时钟延迟

        我们知道,在触发触发器之前,时钟在路径上会有延迟(时钟源延迟和网络延迟),我们可以通过开关-source_latency_included 和 -network_latency_included 来进行约束。

4.7 完成输入延迟约束

        要完成输入约束,现在就剩下唯一的工作就是需要指定输入延迟的实际端口或引脚,并且指定延迟值,这是set_input_delay 命令必须指定的两个选项。

五、set_output_delay

        用于指定输出端口延迟的SDC命令是set_output_delay。命令的BNF是如下:

set_output_dalay   [-clock clock_name]
                   [-clock_fall]
                   [-level_sensitive]
                   [-rise]
                   [-fall]
                   [-max]
                   [-min]
                   [-add_delay]
                   [-network_latency_included]
                   [-source_latency_included]
                   delay_value port_pin_list

        从概念上讲,set_output_delay和set_input_delay两个命令非常相似,所以这里不会像之前那样一一展开,仅对两个命令不同的部分详细说明。

        set_input_delay 和 set_output_delay 的根本区别在于:输入延迟是指到达输入端的时间,即在输入端信号有效的时间。另一方面,输出延迟是信号输出后还要传输的时间,这个时间与在输出端信号需要有效的时间不同。但是,从语义上讲,两个命令非常相似,它们都指定了在感兴趣的电路单元外的延迟要求。就像外部延迟需要满足要求一样,电路单元内部也有自己的时序要求。

六、小结

        set_input_delay 和 set_output_delay 需要正确设定,这样,电路单元的信号就可以保证时序正确了。如果设定不正确,那么单个电路单元可能就能够满足自己的时序,而当集成整个设计时,最终的设计可能不会满足时序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1213476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】-- 红黑树详解

目录 一、红黑树概念 1.概念 2.性质 二、红黑树定义 1.红黑树节点定义 (1)将新插入节点置为红色 (2)将新插入节点置为黑色 2.红黑树定义 三、红黑树插入 1.插入节点 2.控制颜色 (1)父亲为黑色 &#xff0…

如何使用 Github Action 管理 Issue

本文作者为 360 奇舞团前端开发工程师 Daryl 前言 很多小伙伴打开 github 上的仓库都只使用Code查看代码,或者只是把 github 当成一个代码仓库,但是 github 还提供了很多好用的功能。 其中,GitHub Action就是一个很好用的功能,本文…

EfficientNet:通过模型效率彻底改变深度学习

一、介绍 EfficientNet 是深度学习领域的里程碑,代表了神经网络架构方法的范式转变。EfficientNet 由 Google Research 的 Mingxing Tan 和 Quoc V. Le 开发,在不影响性能的情况下满足了对计算高效模型不断增长的需求。本文深入探讨了 EfficientNet 背后…

自动驾驶汽车:人工智能最具挑战性的任务

据说,自动驾驶汽车是汽车行业梦寐以求的状态,将彻底改变交通运输业。就在几年前,对自动驾驶汽车的炒作风靡一时,那么到底发生了什么呢?这么多公司吹嘘到2021年我们将迎来的无人驾驶汽车革命在何处?事实证明…

LeetCode(18)整数转罗马数字【数组/字符串】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 12. 整数转罗马数字 1.题目 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X …

javaweb---maventomcat使用教程

文章目录 今日内容0 复习昨日1 Maven1.0 引言1.1 介绍1.2 下载1.3 安装1.3.1 解压1.3.2 配置环境变量1.3.3 测试 1.4 仓库1.5 Maven配置1.5.1 修改仓库位置1.5.2 设置镜像 2 IDEA - MAVEN2.1 idea关联maven2.2 创建java项目2.3 java项目结构2.4 pom2.5 导入依赖2.5.1 查找依赖2…

【Hello Go】Go语言基础类型

Go语言基础类型 基础类型命名变量变量声明变量初始化变量赋值匿名变量 常量字面常量常量定义iota枚举 基础数据类型分类 fmt包的标准输入输出格式说明输入类型转换类型取别名 基础类型 命名 Go语言中的命名遵循下面的几个规则 必须以字母或者是下划线开头不能使用Go语言中的…

C/C++---------------LeetCode第1394.找出数组中的幸运数

找出数组中的幸运数 题目及要求暴力算法哈希算法在main里使用 题目及要求 在整数数组中,如果一个整数的出现频次和它的数值大小相等,我们就称这个整数为「幸运数」。 给你一个整数数组 arr,请你从中找出并返回一个幸运数。 如果数组中存在…

过滤器模式 rust和java的实现

文章目录 过滤器模式实现 过滤器模式实现javarustjavarust rust代码仓库 过滤器模式 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来过滤一组对象&…

C++ opencv基本用法【学习笔记(九)】

这篇博客为修改过后的转载,因为没有转载链接,所以选了原创 文章目录 一、vs code 结合Cmake debug1.1 配置tasks.json1.2 配置launch.json 二、图片、视频、摄像头读取显示2.1 读取图片并显示2.2 读取视频文件并显示2.3 读取摄像头并写入文件 三、图片基…

C# 之 选择并调用文件[winform]

winform 之 选择并调用文件 在 form.cs[设计] 文件中选择一个button, 然后设置一个点击函数 将下方内容复制到函数中执行 private void push_btn_Click(object sender, EventArgs e){ // 1. 打开文件管理器选择文件OpenFileDialog openFileDialog1 new OpenFileDialog(); /…

【数电】IEEE754浮点数

IEEE754浮点数 1.组成及分类2.计算(1)符号位(2)阶码(3)尾码(4)实际计算公式 1.组成及分类 (1)组成 IEEE754浮点数由三部分组成:符号位、阶码和尾码。 (2)分类 根据数据位宽分为三类:短浮点数、长浮点数和…

PHP项目学习笔记-萤火商城-增加一个模块(表涉及到的操作和文件)

背景 是在store的后台添加一个页面,显示的如满意度调查的页面 在router.config.js里面配置一个新的菜单 路径:yoshop2.0-store\src\config\router.config.js 代码如下,很简单,定义了这菜单点击的时候进入的页面,和下面…

Donut 中,video组件层级失效、同层渲染失效、z-index设置无效解决办法

微信小程序转安卓之后,z-index设置的层级关系失效,video组件总是处在最上层解决办法: 很重要的设置! 同层渲染要开 xweb,project.miniapp.json中勾选此设置 感谢腾讯官方大佬 黄嘉敏

【Git】的分支与版本

前言 Git 的分支是指将代码库从某一个特定的提交记录开始的一个独立的开发线,也可以理解为是一种代码开发的并行方式。分支在 Git 中的使用非常广泛,它可以让多人在同一个代码库中并行开发,同时也能够很方便地进行代码版本控制和管理。 Git …

PM2学习

目录 PM2简介 pm2的主要特性 PM2安装 启动PM2项目 查看应用列表(查看当前机器执行的所有进程) 查看某个应用详情 重启 停止 删除 日志查看 负载均衡 监控CPU/内存 内存使用超过上限自动重启 监听代码变化/自动重启 PM2简介 PM2是常用的node…

什么是OpenCL?

什么是OpenCL? 1.概述 OpenCL(Open Computing Language 开放计算语言)是一种开放的、免版税的标准,用于超级计算机、云服务器、个人计算机、移动设备和嵌入式平台中各种加速器的跨平台并行编程。OpenCL是由Khronos Group创建和管理的。OpenCL使应用程序…

modbus-RTU是一种比较简单、可靠的协议

modbus-RTU是一种比较简单、可靠的协议 RTU, 是modbus中的一种应用层协议,在OSI的第七层 数据格式 应用

[C国演义] 第二十章

第二十章 最长回文子序列让字符串成为回文串的最少插入次数 最长回文子序列 力扣链接 单个数组讨论子序列 ⇒ dp[i] -- 以nums[i]为结尾的所有子序列中, 回文子序列的最长长度. 然后讨论 最后一个位置的归属情况 但 又要满足 回文结构 ⇒ 二维dp ⇒ dp[i][j] -- 区间[i, j]内…

类加载器(classloader)

作者:ZeaTalk 链接:https://www.zhihu.com/question/49667892/answer/690161827 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 类加载器(classloader) 先从类加载器…