时序约束进阶五:Set_Max_Delay与Set_Min_Delay详解

目录

一、背景

二、Max/Min_delay约束

2.1 约束设置参数

2.2 约束说明

三、场景说明

 3.1 路径分段

3.1.1 无效的约束对象

3.1.2 设计代码

3.2 有效的约束对象

3.3 datapath only

3.3.1 工程设计

3.3.2 datapath only报告

3.4 clock group约束优先级

3.4.1 MAX/MIN约束对象正确

3.4.2 MAX/MIN约束对象非时序起点/终点

一、背景

     正常情况下FPGA设计中,内部路径通常需要时钟周期约束(create_clock)和时钟组约束(set_clock_groups),但对于一些特殊场景则需要时序例外约束,set_max_dealy和set_max_delay就是四大时序例外约束中的两个。

二、Max/Min_delay约束

     在设计中,有时需要限定路径的最大时延和最小时延,如没有特定时钟关系的异步信号,但需要限制最大时延和最小时延,也可以对端口到端口(中间无寄存器)的路径设置最大时延和最小时延,设置最大时延和最小时延会影响路径的setup和hold时序分析,它会覆盖默认的时序约束。

    设置路径最大时延和最小时延的命令为set_max_delay,set_min_delay,可在Timing Constraints窗口进入Exceptions中,选择Set Maximum Delay或Set Minimum Delay,即为选择最大时延或最小时延。

2.1 约束设置参数

以设置最大时延为例,双击Set Maximum Delay进入设置窗口

Targets设置

Specify path delay:设置路径最大时延值,可为正整数或负整数

From:设置路径的起点,对象可以是Clocks,Cells,Cell pins,I/O ports

Through:设置路径的中间经过点,对象可以是Net,Cells,Cell pins

To:设置路径的终点,对象可以是Clocks,Cells,Cell pins,I/O ports

Options设置

Rise/Fall:勾选后可设置最大时延只对上升沿触发或下降沿触发的路径有效,未勾选时不区分边沿触发。

Set Maximum delay for only the datapath:勾选后设置的时延约束只对数据路径有效,时钟偏斜和hold检查会被忽略,即等效于该路径也设置了set_false_path -hold约束,此时如果约束中设置了set_min_delay约束也不会生效。并且该设置不能用于set_min_delay约束中。

Remove existing path exceptions before setting path delays:勾选后,如果设置的约束路径上有其他时例外约束(如false_path,multicycle约束,最大最小时延约束都将被移除)

2.2 约束说明

    set_max_delay/set_min_delay应用场景之一是用于约束输入端口和输出端口间的纯组合逻辑路径。

    set_max_delay另一个常用的场景是没有时钟关系的异步信号,但需要设置最大时延。两个异步时钟路径可以使用set_clock_group或set_false_path,从而不会进行时序分析。当异步时钟间的设计合理,如FIFO中的两级同步寄存器,要放宽约束,保证两个时钟间的路径延时符合实际情况,就需要使用set_max_delay。

    在多比特跨时钟域(CDC)场景中,比特之间的偏斜必须在一定要求时间内,虽然偏斜可以通过set_bus_skew来约束,但必须确保两个时钟域间的时延不能太大。此时可以通过约束set_max_delay -datapath_only代替set_false_path/set_clock_groups。

    如果对于两个时钟域间的部分路径或全部路径的最大时延必须明确时,就必须使用set_max_delay -datapath_only约束。这种场景下,set_clock_groups不能用来定义两个时钟作为异步时钟,因为从约束的优先级角度看它将取代set_max_delay。其他跨时钟域路径就必须联合约束set_false_path或set_max_delay约束。

三、场景说明

 3.1 路径分段

    不同于约束文件XDC中的其他约束,在设置最大时延和最小时延中,参数-from和-to选项为设置约束的起点和终点,在设置时,有些起点和终点对于约束来说是无效的。当设置了一个无效的起点时,为了让节点成为一个有效的起点,时序分析工具会阻止时序路径通过该节点

以schematic如下图的路径为例,d1存在到ff2_reg和ff3_reg的时序路径

未设置max/min delay约束时,存在d1到ff2_reg/D和ff3_reg/D的时序路径

添加d1到ff2_reg/D的max delay约束,约束的from和to为有效的时序起点和终点

set_max_delay -from [get_ports d1] -to [get_pins ff2_reg/D] 1.0

时序报告如下,d1到ff2_reg/D和ff3_reg/D的路径依旧有效

3.1.1 无效的约束对象

如果约束中的对象非时序路径的起点或终点,则会将该对象强制设置为时序路径的起点或终点,但可能引入路径分段从而导致其他时序路径断开。如约束的起点为组合逻辑单元

set_max_delay -from [get_pins LUT4_inst0/O] -to [get_pins ff2_reg/D] 1.0

时序报告如下,因为将LUT4_inst0/O强制设为起点,导致其他经过该单元的路径将会断开,因此不存在d1到ff3_reg/D的时序路径,同时也不存在对应的hold路径

3.1.2 设计代码

module MAX_MIN(d1,d2,clk1,clk2,ce,I1,I2,ff2,ff3);
input d1,d2,clk1,clk2,ce,I1,I2;
output ff2,ff3;
reg ff1,ff2,ff3;
wire comb,comb1,comb2;
always@(posedge clk1,negedge ce)
beginif(!ce)beginff1<=0;endelse beginff1<=d1;end
end
//assign comb=ff1&d2;LUT4 #(.INIT(16'h0101)  // Specify LUT Contents) LUT4_inst0 (.O(comb1),   // LUT general output.I0(ce), // LUT input.I1(d1), // LUT input.I2(I2), // LUT input.I3(ff1)  // LUT input);always@(posedge clk2,negedge ce)
beginif(!ce)ff2<=0;else beginff2<=comb1;end
endLUT4 #(.INIT(16'h0111)  // Specify LUT Contents) LUT4_inst (.O(comb2),   // LUT general output.I0(ce), // LUT input.I1(I1), // LUT input.I2(I2), // LUT input.I3(comb)  // LUT input);always@(posedge clk2)
beginif(!ce)ff3<=0;else beginff3<=comb1;end
end
endmodule

3.2 有效的约束对象

工程设计如下

module MAX_MIN(d1,clk1,clk2,ce,ff2,ff3);
input d1,clk1,clk2,ce;
output ff2,ff3;
reg ff1,ff2,ff3;
always@(posedge clk1,negedge ce)
beginif(!ce)beginff1<=0;endelse beginff1<=d1;end
endalways@(posedge clk2,negedge ce)
beginif(!ce)ff2<=0;else beginff2<=ff1;end
endalways@(posedge clk2)
beginif(!ce)ff3<=0;else beginff3<=ff1;end
end
endmodule

schematic图如下,设计简单,即ff1_reg到ff2_reg和ff3_reg的两条路径

对ff1_reg到ff2_reg和ff3_reg分别设置max delay和min delay约束

create_clock -period 10.000 -name clk1 -waveform {1.000 6.000} [get_ports clk1]
create_clock -period 8.000 -name clk2 -waveform {0.000 4.000} [get_ports clk2]
set_max_delay -from [get_pins ff1_reg/C] -to [get_pins ff2_reg/D] 1.0
set_min_delay -from [get_pins ff1_reg/C] -to [get_pins ff3_reg/D] 1.0

max delay生效于setup分析中,min delay生效于hold分析中

3.3 datapath only

datapath only表示分析时序slack时只考虑数据路径上的时延,不分析source clock和destination clock的时钟延时

3.3.1 工程设计

工程设计同上述有效约束对象章节的代码一致,对ff1_reg/C到ff2_reg/D的路径设置set_max_delay datapath_only约束

create_clock -period 10.000 -name clk1 -waveform {1.000 6.000} [get_ports clk1]
create_clock -period 8.000 -name clk2 -waveform {0.000 4.000} [get_ports clk2]
set_max_delay -datapath_only -from [get_pins ff1_reg/C] -to [get_pins ff2_reg/D] 1.0

3.3.2 datapath only报告

在path report中,因ff1_reg/C到ff2_reg/D设置了max delay,所以没有source clock和destination clock路径

查看hold中时序结果,只有ff1_reg/c到ff3_reg/D的路径,符合预期

3.4 clock group约束优先级

3.4.1 MAX/MIN约束对象正确

在set_max_delay/set_min_delay的from/to为有效的时序路径起点和终点时,对路径设置set_clock_group约束,此时set_clock_group优先级更高。

依旧采用3.2小节的设计,约束如下,clk1和clk2通过set_clock_group设置为异步时钟,max delay约束对象为时序起点的ff1_reg/C

create_clock -period 10.000 -name clk1 -waveform {1.000 6.000} [get_ports clk1]
create_clock -period 8.000 -name clk2 -waveform {0.000 4.000} [get_ports clk2]
set_max_delay -from [get_pins ff1_reg/C] 1.0
set_min_delay -from [get_pins ff1_reg/C] 0.5
set_clock_groups -name clk_group -asynchronous -group [get_clocks clk1] -group [get_clocks clk2]

时序报告inter clock paths中已不存在clk1到clk2的时序路径,即set_clock_groups的优先级更高,已将set_max_delay/set_min_delay覆盖

3.4.2 MAX/MIN约束对象非时序起点/终点

在set_max_delay/set_min_delay的from/to为有效的时序路径起点和终点时,对路径设置set_clock_group约束,此时set_max_delay/set_min_delay优先级更高。

采用3.1小节的设计,约束如下,clk1和clk2设置为异步时钟,max delay约束对象为非时序起点的LUT4_inst0/O

create_clock -period 10.000 -name clk1 -waveform {1.000 6.000} [get_ports clk1]
create_clock -period 8.000 -name clk2 -waveform {0.000 4.000} [get_ports clk2]
set_input_delay -clock [get_clocks clk1] 1.000 [get_ports {d1 d2}]
set_max_delay -from [get_pins LUT4_inst0/O] -to [get_pins ff2_reg/D] 1.0
set_clock_groups -name clk_group -asynchronous -group [get_clocks clk1] -group [get_clocks clk2]

此时报告中依旧存在max delay的路径

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

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

相关文章

搭建实验仪器知识库:从产品手册到智慧资源的飞跃

在科研、教学及工业生产领域&#xff0c;实验仪器作为探索未知、验证理论、提升效率的重要工具&#xff0c;其重要性不言而喻。然而&#xff0c;随着技术的不断进步和仪器的日益复杂化&#xff0c;如何高效、准确地使用这些仪器成为了科研人员、技术人员及学生面临的共同挑战。…

OA项目 python + vue3

准备工作 创建django项目 在setting.py进行数据库的配置&#xff1a; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: , #数据库名字USER: , #连接的数据库的用户名PASSWORD: ,HOST: 127.0.0.1,PORT: 3306,} }安装app&#xff1a; rest_framwork: 关闭csrf…

婚礼纪 9.5.57 | 解锁plus权益的全能结婚助手,一键生成结婚请柬

婚礼纪是一款结婚服务全能助手&#xff0c;深受9000万新人信赖的一站式结婚服务平台。解锁plus权益后&#xff0c;用户可以享受部分VIP会员功能。应用提供了丰富的结婚筹备工具和服务&#xff0c;包括一键生成结婚请柬、婚礼策划、婚纱摄影、婚宴预订等。婚礼纪旨在为新人提供全…

树形结构数据

树形结构数据 树形结构数据是一种基础且强大的数据结构&#xff0c;广泛应用于计算机科学和软件开发的各个领域。它模拟了自然界中树的层级关系&#xff0c;通过节点和它们之间的连接来组织数据。在本文中&#xff0c;我们将深入探讨树形结构数据的概念、特点、类型以及它们在…

洛古---越狱问题【快速幂】

今天和大家讲一个洛古的算法题&#xff0c;我觉得还是比较有含金量的&#xff0c;今天给大家分享一下 题目描述 监狱有 &#x1d45b;n个房间&#xff0c;每个房间关押一个犯人&#xff0c;有 &#x1d45a; 种宗教&#xff0c;每个犯人会信仰其中一种。如果相邻房间的犯人的宗…

【论文笔记】Parameter-Efficient Transfer Learning for NLP

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: Parameter-Efficient Tran…

《PyTorch深度学习快速入门教程》学习笔记(第20周)

目录 摘要 Abstract 1. 池化层原理 2. 二维池化层 3. 二维最大池化 4. 填充、步幅与多个通道 5. 平均池化层 6. 理论总结 7. 池化层处理数据 8. 池化层处理图片 摘要 本周报的目的在于汇报《PyTorch深度学习快速入门教程》课程第六周的学习成果&#xff0c;主要聚焦于…

C# 实现对指定句柄的窗口进行键盘输入的实现

在C#中实现对指定句柄的窗口进行键盘操作&#xff0c;可以通过多种方式来实现。以下是一篇详细的指南&#xff0c;介绍如何在C#中实现这一功能。 1. 使用Windows API函数 在C#中&#xff0c;我们可以通过P/Invoke调用Windows API来实现对指定窗口的键盘操作。以下是一些关键的…

c语言简单编程练习10

1、typedef和#define的区别 在用作数据类型替换时的区别&#xff1a; #include <stdio.h> #include <unistd.h>typedef char * A; //typedef需要&#xff1b; #define B char *int main(int argc, char *argv[]) {A a,b;B c,d;printf("a_size%ld\n"…

题目讲解15 合并两个排序的链表

原题链接&#xff1a; 合并两个排序的链表_牛客题霸_牛客网 思路分析&#xff1a; 第一步&#xff1a;写一个链表尾插数据的方法。 typedef struct ListNode ListNode;//申请结点 ListNode* BuyNode(int x) {ListNode* node (ListNode*)malloc(sizeof(ListNode));node->…

【freertos】FreeRTOS任务管理

FreeRTOS任务管理 一、任务的创建和删除1、函数xTaskCreate2、函数xTaskCreateStatic3、函数xTaskCreateRestricted4、函数vTaskDelete 二、任务的挂起和恢复1、函数vTaskSuspend2、函数vTaskResume3、函数vTaskResumeFromISR4、函数vTaskSuspendAll5、函数xTaskResumeAll 三、…

FreeRTOS 20:互斥量(互斥信号量)操作

互斥信号量其实就是一个拥有优先级继承的二值信号量&#xff0c;在同步的应用中&#xff08;任务与任务或中断与任务之间的同步&#xff09;二值信号量最适合。互斥信号量适合用于那些需要互斥访问的应用中。在互斥访问中互斥信号量相当于一把钥匙&#xff0c; 当任务想要访问共…

MongoDB笔记03-MongoDB索引

文章目录 一、前言1.1 概述1.2 MongoDB索引使用B-Tree还是BTree&#xff1f;1.3 B 树和 B 树的对比1.4 总结 二、索引的类型2.1 单字段索引2.2 复合索引2.3 其他索引 三、索引的管理操作3.1 索引的查看3.2 索引的创建3.2.1 单字段索引3.2.2 复合索引 3.3 索引的移除3.3.1 指定索…

肿瘤治疗评价指标太多?一文帮你梳理清楚!|个人观点·24-11-09

小罗碎碎念 如何延长癌症患者存活时间、提高生存质量、减轻肿瘤带来的痛苦&#xff0c;是评价抗癌药物的重要标准&#xff0c;而把这些标准落在数据上就诞生了各项“评价指标”。 在肿瘤治疗领域&#xff0c;有OS、PFS、RFS、TTP、TTF、ORR、DCR、DDC等各项评价指标。对于大部…

保研考研机试攻略:python笔记(3)

&#x1f428;&#x1f428;&#x1f428;11sort 与 sorted 区别 sort 是应用在 list 上的方法&#xff0c;sorted 可以对所有可迭代的对象进行排序操作。 list 的 sort 方法返回的是对已经存在的列表进行操作&#xff0c; 无返回值&#xff0c;而内建函数 sorted 方法返回的…

Linux之自定义shell和C标准库函数

自定义shell和C标准库函数 一.自定义xshell1.1main函数主体1.2获取用户信息以及命令串1.3判断命令串是否为空串1.4判断是否为重定向1.5分割命令串1.6判断是否为内建命令1.7执行命令 二.自定义C标准库函数2.1mystdio.h2.2mystdio.c2.3main.c 一.自定义xshell 1.1main函数主体 1…

TeamTalk知识点梳理一(单聊)

文章目录 db_proxy_serverdb_proxy_server reactor响应处理流程连接池redis连接池MySQL连接池 单聊消息消息如何封装&#xff1f;如何保证对端完整解析一帧消息&#xff1f;协议格式&#xff1f;单聊消息流转流程消息序号&#xff08;msg_id &#xff09;为什么使用redis生成&a…

带跳转功能的电子产品目录如何制作?

​在数字化时代&#xff0c;电子产品已成为我们生活和工作中不可或缺的伙伴。为了方便用户快速查找所需产品&#xff0c;带跳转功能的电子产品目录应运而生。本文将详细介绍如何制作一个高效便捷的带跳转功能电子产品目录&#xff0c;让用户轻松实现产品查找、筛选和购买。 1.要…

从0开始linux(26)——动静态库

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 如何写一个静态库动态库动静态链接 c/c程序形成可执行程序&#xff0c;需要经过三个步骤&#xff0c;编译、汇编、链接三个步骤&#xff0c;我们之前做链接时&#xff0c;使用的方法是将头文件…

hexo 搭建个人博客网站

hexo搭建个人博客 文章目录 hexo搭建个人博客摘要搭建网站的前置工具WebStormHexo Hexo配置初始化本地运行 主题更改安装butterfly主题 正式上线GitHub Pages配置新建仓库SSH密钥配置 将hexo部署到GitHub 个性化设置后续网站更新内容分类和标签设置分类&#xff08;categories&…