当我们做后仿时我们究竟在仿些什么(四)

news2024/12/26 23:41:47

 就像人类容易接受自然数,但对于负数缺乏某种直觉上的认识一样;后仿过程中经常出现的 Negative Delay 和 Negative Timing Check 也非常容易使人困惑。

Warning-[SDFCOM_NICD] Negative INTERCONNECT Delay encountered

 今天这篇首先简要分析这些 Negative 们产生的原因,然后看一下 EDA 工具是如何处理它们的。

产生 Negative Delay 的原因

        从根本上来说有两种原因。一种是测量的原因,比如输入和输出信号的观测方法不同,导致输出信号反而比输入信号在时间上提前;一种是信号在传输过程中真实发生了某种变化,导致信号跳变的提前。

        具体原因大概分下面几种。

Voltage Converting

        信号在不同电压域之间的转换可能会导致负延时产生,如下图所示。

图片

        假设都以 50% VDD 为信号跳变的阈值,那么如果信号从高电压域输出到低电压域,50% VDD 对应的时刻反而会提前,导致负延时的出现。这种极端情况出现的前提是信号的 Transition Time 足够的大,连器件的正延时都不足以抵消电压下降带来的负延时。

Threshold Converting

        阈值转换的原因其实类似于电压转换,如果输出负载的阈值低于该器件的输入阈值,并且信号的 Transition Time 也足够的大,那么从观测者的角度,信号在输出时被观测到逻辑跳变的时刻反而提前于输入跳变的时刻。

图片

Noise

        信号在传输过程中难免受到一些干扰,如果这种干扰来自于相邻的器件或者走线,就称之为串扰(crosstalk)。串扰可能造成信号传输的滞后或者提前。

造成提前的情形如下图所示。

图片

        红色实线表示输入信号;绿色虚线是没有串扰的输出信号,如果在这个输出信号跳变之前有个串扰发生(黑色实线),会在输出上产生一个很短的高脉冲(绿色实线),和原本的输出信号合起来看,就相当于输出信号的跳变提前了。如果这个提前量足够大,就相当于该器件有了一个负延时。

Calculation

        还有一些负延时来自于 EDA 工具特定算法的计算过程。比如时序模型做数值计算过程中引入的误差;针对 stage delta delay 和 net delay 分别做 derating 可能引入的负值。这些理解起来不那么浅显,就不做详细的解释了。

EDA 工具如何处理 Negative Delay

        这个问题有点复杂,因为各家 EDA 公司的仿真器都有不同的算法来解决。

        从直观的角度来考虑,一个负延时总归是要结合其相邻的器件延时、线延时来解决的,用整体更大的正延时来抵消局部的负延时。

        有些仿真器干脆做简化处理,把从 SDF 中读取的负延时直接变为零延时。这种做法无可厚非,是符合 Verilog 和 SDF 标准的。

打开 VCS 仿真器的负延时特性,就是在编译时加上-negdelay选项。

        另外,PT 写出 SDF 时是默认带有 Negative Delay 和 Negative Timing Check 的,如果不想写出这些负值,需要加上如下的特定选项,这时 PT 会自动把相关负值都变成零。

pt_shell> write_sdf -no_negative_delays {timing_checks | cell_delays | net_delays} postsim.sdf
产生 Negative Timing Check 的原因

        Negative Timing Check 中的 Negative 其实和 Negative Delay 中的 Negative 不太一样,前者只是描述器件时序特性参数时规定的一种算术表达形式。

Positive Setup/Hold Timing Check

先看一个常见的 Setup Limit 和 Hold Limit 都为正值的例子。

        下图是一个标准单元 D 触发器的框图,我们接下来所讨论的时序检查都是相对于最外层框图所对应的管脚。

图片

        仿真模型中用来检查时序的语句如下,其中的 Setup Limit 和 Hold Limit 的具体数值都是从 SDF 文件取出后反向标注到网表的。

$setuphold (posedge clock, data, 2, 3, notifyreg);

        这种语法模式下,Clock Event 的时刻规定为 0 时刻;Data Event for Setup Check要早于 Clock Event;Data Event for Hold Check 要晚于 Clock Event;符合这种一般情况的时序参数,包括 Setup Limit 和 Hold Limit 都用正值来表示。

图片

        但是标准单元内部因为一些特殊的设计,会造成 Clock 和 Data 到达内部真正的时序器件的延时不同,这样从外部来看,时序参数会有一些不同的情况。

Negative Setup Limit

        从下面的示意图可以看出,Negative Setup Limit 的产生主要是因为标准单元内部 Clock 上的延时相对较大,从外部来看,Data Event for Setup Check 就可以晚一些来,如果晚于 Clock Event(时刻为 0),就用负值来表示(和早于的情况相反)。

图片

$setuphold (posedge clock, data, -2, 7, notifyreg);

图片

Negative Hold Limit

        从下面的示意图可以看出,Negative Hold Limit 的产生主要是因为标准单元内部 Data 上的延时相对较大,从外部来看,Data Event for Hold Check 就必须早一些来,如果早于 Clock Event(时刻为 0),就用负值来表示(和晚于的情况相反)。

图片

$setuphold (posedge clock, data, 7, -2, notifyreg);

图片

EDA 工具对于 Negative Timing Check 的支持

        当时序参数存在负值的情况时,必须要用 $setuphold 以及 $recrem 来表示;而不能用单独的 $setup$hold$recovery$removal。具体语法如下。

$setuphold(reference_event, data_event, setup_limit,
hold_limit, notifier, [timestamp_cond, timecheck_cond,
delayed_reference_signal, delayed_data_signal]);

$recrem(reference_event, data_event, recovery_limit,
removal_limit, notifier, [timestamp_cond, timecheck_cond,
delayed_reference_signal, delayed_data_signal]);

        并且从 STA 工具写出 SDF 文件的时候,需要设置恰当的选项,来支持这种标注语法。例如:

pt_shell> write_sdf -version 3.0 -include {SETUPHOLD RECREM} postsim.sdf

        同样,在调用仿真器的时候,例如 VCS,需要加上 +neg_tchk 的编译选项来支持 Negative Timing Check 的动态仿真。

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

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

相关文章

创建线程池

如何创建线程池及处理相应任务 目录 如何创建线程池及处理相应任务线程池定义解决的问题(需求)工作原理实现线程池创建示意图重要构造器创建线程池(ExecutorService)线程池任务处理常用API处理Runnable任务处理Callable任务 使用工具类(Executors)创建线程池常用API应用案例 拓…

桌面自动化工具总结

引言:产品经理提出桌面程序需要自动化的测试,避免繁琐的人肉点击。说干就干。 现有自动化工具是五花八门,我找了两个框架。 这两个框架都是基于微软的UIA 框架,链接地址 https://learn.microsoft.com/en-us/windows/win32/winauto/uiauto-providerportal?source=recommen…

以太网的MAC层

以太网的MAC层 一、硬件地址 ​ 局域网中,硬件地址又称物理地址或MAC地址(因为用在MAC帧),它是局域网上每一台计算机中固化在适配器的ROM中的地址。 ​ 关于地址问题,有这样的定义:“名字指出我们所要寻…

【Spring】Bean作用域和生命周期

Bean作用域和生命周期 一. Bean 的作用域1. Bean 的 6 种作⽤域:①. singleton②. prototype③. request④. session⑤. application⑥. websocket单例作用域(singleton) VS 全局作⽤域(application) 2. 设置作用域 二. Spring 执行流程和 Bean 的生命周期1. Spring…

MySQL优化、锁、总结常见问题

慢 SQL 如何定位呢? 慢 SQL 的监控主要通过两个途径: 慢查询日志:开启 MySQL 的慢查询日志,再通过一些工具比如 mysqldumpslow 去分析对应的慢查询日志,当然现在一般的云厂商都提供了可视化的平台。服务监控&#xf…

如何实现torch.arange的tensor版本

文章目录 背景实现方案不可行的情况 背景 import torch我们都知道,torch.arange只支持数字,不支持tensor,如下: torch.arange(0,5,1)tensor([0, 1, 2, 3, 4]) 但是如果使用tensor,就会报错: torch.arang…

SpringBoot结合Redisson实现分布式锁

🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:Sp…

力扣 -- 474. 一和零(二维费用的背包问题)

解题步骤&#xff1a; 参考代码&#xff1a; 未优化代码&#xff1a; class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {//开一个三维的dp表vector<vector<vector<int>>> dp(strs.size()1,vector<vector<in…

DevEco Studio如何安装中文插件

首先 官网下载中文插件 由于DevEco是基于IntelliJ IDEA Community的&#xff0c;所有Compatibility选择“IntelliJ IDEA Community”&#xff0c;然后下载一个对应最新的就ok了。 最后打开Plugins页面&#xff0c;点击右上角齿轮 -> Install Plugin from Disk…。选择下载的…

AcWing算法提高课-5.6.1同余方程

宣传一下 算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 题目描述 求关于 x x x 的同余方程 a x ≡ 1 ( m o d b ) ax ≡ 1 \pmod b ax≡1(modb) 的最小正整数解。 输入格式 输入只有一行&#xff0c;包含两个正整数 a , b a,b a,b&#xff0c;用一…

python模拟表格任意输入位置

在表格里输入数值&#xff0c;要任意位置&#xff0c;我找到了好方法&#xff1a; input输入 1. 行 2. 列输入&#xff1a;1 excel每行输入文字input输入位置 3.2 表示输入位置在&#xff1a;3行个列是要实现一个类似于 Excel 表格的输入功能&#xff0c;并且希望能够指定输入…

怎么通过docker/portainer部署vue项目

这篇文章分享一下今天通过docker打包vue项目&#xff0c;并使用打包的镜像在portainer上部署运行&#xff0c;参考了vue-cli和docker的官方文档。 首先&#xff0c;阅读vue-cli关于docker部署的说明 vue-cli关于docker部署的说明https://cli.vuejs.org/guide/deployment.html#…

智慧工地源代码 SaaS模式云平台

伴随着技术的不断发展&#xff0c;信息化手段、移动技术、智能穿戴及工具在工程施工阶段的应用不断提升&#xff0c;智慧工地概念应运而生&#xff0c;庞大的建设规模催生着智慧工地的探索和研发。 什么是智慧工地&#xff1f; 伴随着技术的不断发展&#xff0c;信息化手段、移…

八、动态规划(Dynamic Programming)

文章目录 一、理论基础二、题目分类&#xff08;一&#xff09;基础题目2.[70.爬楼梯](https://leetcode.cn/problems/climbing-stairs/)&#xff08;1&#xff09;思路&#xff08;2&#xff09;代码&#xff08;3&#xff09;复杂度分析 3.[746. 使用最小花费爬楼梯](https:/…

正点原子嵌入式linux驱动开发——U-boot顶层Makefile详解

在学习uboot源码之前&#xff0c;要先看一下顶层Makefile&#xff0c;分析gcc版本代码的时候一定是先从顶层Makefile开始的&#xff0c;然后再是子Makefile&#xff0c;这样通过层层分析Makefile即可了解整个工程的组织结构。顶层Makefile也就是uboot根目录下的Makefile文件&am…

怪兽智能推出3D数字人虚拟主播,实时动作捕捉赋能直播营销,打造全新营销场景

怪兽智能科技推出了数字人直播新功能——3D数字人虚拟主播&#xff0c;通过实时动作捕捉技术&#xff0c;为直播营销场景注入了全新的活力和创意。这一功能将为企业带来更加生动、鲜活的营销体验&#xff0c;助力品牌在竞争激烈的市场中占据优势。 传统的直播营销方式往往依赖于…

论文笔记:Contrastive Trajectory Similarity Learning withDual-Feature Attention

ICDE 2023 1 intro 1.1 背景 轨迹相似性&#xff0c;可以分为两类 启发式度量 根据手工制定的规则&#xff0c;找到两条轨迹之间基于点的匹配学习式度量 通过计算轨迹嵌入之间的距离来预测相似性值上述两种度量的挑战&#xff1a; 无效性&#xff1a; 具有不同采样率或含有噪…

spring的面向切面编程

如果您觉得本博客的内容对您有所帮助或启发&#xff0c;请关注我的博客&#xff0c;以便第一时间获取最新技术文章和教程。同时&#xff0c;也欢迎您在评论区留言&#xff0c;分享想法和建议。谢谢支持&#xff01; 一、介绍什么是面向切面编程&#xff08;AOP&#xff09; 1.…

lv7 嵌入式开发-网络编程开发 05 字节序及IP地址转换

目录 1 主机字节序和网络字节序 1.1 什么是字节序&#xff1f; 1.2 查看主机字节序 2 字节序转换函数 3 IP地址字节序转换函数 4 练习 1 主机字节序和网络字节序 1.1 什么是字节序&#xff1f; 字节序是指多字节数据在计算机内存中存储或者网络传输时各字节的存储顺序&a…

Qt creator+cmake编译并安装

1、qt creator打开项目中的CMakeLists.txt 2、修改“构建设置“-“Cmake”-”Current Configuration“&#xff0c;其中&#xff0c;安装路径为CMAKE_INSTALL_PREFIX 3、修改“构建设置“-“构建的步骤”-”目标“&#xff0c;勾选"all"和"install" 4、构…