时序约束进阶八:时钟抖动Jitter与不确定性Uncertainty

目录

一、前言

二、时钟抖动

2.1 时钟抖动类型

2.2 set_input_jitter

2.3 set_system_jitter

2.4 set_clock_uncertainty

2.5 设计代码

2.6 约束解析

2.7 Input_jitter报告

2.8 System Jitter报告

2.9 Clock Uncertainty报告

2.9.1 Uncertainty的计算

2.9.2 Uncertainty约束设置

2.9.3 Uncertainty报告


一、前言

    在时序约束中有一类约束是针对时钟特性进行约束的,如时钟源create_clock和create_generated_clock,时钟抖动set_input_jitter,set_system_jitter,时钟不确定性set_clock_uncertainty,时钟延时set_clock_latency,时钟极性set_clock_sense。考虑到内容篇幅,create_clock和create_generated_clock前面已讲解,本文主要详细展示其中的关于抖动set_input_jitter,set_system_jitter和不确定性set_clock_uncertainty的使用

二、时钟抖动

        时钟抖动(Clock Jitter)是指时钟信号边沿相对于理想位置的时间偏差,这种偏差会导致建立时间和保持时间不满足要求,使电路的最高工作频率受限,严重可导致芯片失效。因此,需要对时钟抖动进行合理的约束。

2.1 时钟抖动类型

周期抖动(Period Jitter):实际时钟周期与理想周期的偏差,可能导致时序违规,影响电路功能。

周期到周期抖动(Cycle-to-Cycle Jitter):相邻时钟周期之间的偏差,影响高速电路的稳定长期抖动(Long-Term Jitter):多个时钟周期后,时钟边沿与理想位置的累积偏差,对长时间运行的电路有影响。

相位抖动(Phase Jitter):时钟信号相位与理想相位的偏差,影响同步电路的性能。

2.2 set_input_jitter

Input_jitter输入抖动是指连续时钟边沿相对于标称或理想时钟到达时间的变化差异。输入抖动是一个绝对值,表示时钟边沿两侧的变化。

使用 set_input_jitter 命令可以为每个主时钟单独指定输入抖动。不能直接为生成时钟指定输入抖动。Vivado 的时序工具会自动计算生成时钟从其主时钟继承的抖动。

a)对于由 MMCM 或 PLL 驱动的生成时钟,输入抖动会被替换为计算得到的离散抖动。

b)对于由组合逻辑或时序单元创建的生成时钟,生成时钟的抖动与其主时钟的抖动相同。

2.3 set_system_jitter

System_jitter系统抖动是指由于电源噪声、板级噪声或系统中任何额外的抖动引起的整体抖动。使用 set_system_jitter 命令可以为整个设计设置一个全局值,即适用于所有时钟。

以下命令为通过输入端口 clkin 传播的主时钟设置了 ±100 ps 的抖动:

set_system_jitter [get_clocks -of_objects [get_ports clkin]] 0.1


输入抖动和系统抖动在时钟不确定性(clock uncertainty)的整体计算中的影响并非简单直观,且不遵循单一公式。时钟不确定性的计算是路径相关的,取决于时钟拓扑结构,路径中涉及的时钟对,时钟树上是否存在 MMCM/PLL,以及其他考虑因素。不过,Report Timing 命令的文本和 GUI 会展示每条时序路径的时钟不确定性分解结果。

2.4 set_clock_uncertainty

clock uncertainty包含clock jitter,input jitter,system jitter,使用set_clock_uncertainty可以对不同的场景,延时或者是需要的时钟关系设置时钟不确定性,对于设置中的部分添加时序裕量是一种很方便的方式。

Clock uncertainty type:有两种设置不确定性方式,simple uncertainty和interclock uncertainty。simple uncertainty是针对同步时钟,objects可以是Cell pins,clocks,I/O port,interclock uncertainty针对异步时钟,需设置-from和-to参数。

跨时钟间的不确定性总是优先于简单的时钟不确定性,不受约束顺序的影响。以下面约束为例,尽管第二条简单的不确定约束放在后面,从clk1到clk2的时序路径不确定性依旧为2ns

set_clock_uncertainty 2.0 -from [get_clocks clk1] -to [get_clocks clk2] 
set_clock_uncertainty 1.0 [get_clocks clk1]

当在跨时钟域的两个时钟间设置了不确定约束时,需确保约束了两个时钟域间所有的跨时钟域路径,如clk1到clk2,clk2到clk1。

2.5 设计代码

module jitter_uncertainty(clkin1,clkin2,d1,clk,ce,ff3);
input clkin1,clkin2,d1,clk,ce;
output ff3;
reg ff1,ff2,ff3;
wire bus,n_clkout0;PLLE2_ADV #(.BANDWIDTH("OPTIMIZED"),  // OPTIMIZED, HIGH, LOW.CLKFBOUT_MULT(5),        // Multiply value for all CLKOUT, (2-64).CLKFBOUT_PHASE(0.0),     // Phase offset in degrees of CLKFB, (-360.000-360.000).// CLKIN_PERIOD: Input clock period in nS to ps resolution (i.e. 33.333 is 30 MHz)..CLKIN1_PERIOD(0.0),.CLKIN2_PERIOD(0.0),// CLKOUT0_DIVIDE - CLKOUT5_DIVIDE: Divide amount for CLKOUT (1-128).CLKOUT0_DIVIDE(1),.CLKOUT1_DIVIDE(1),// CLKOUT0_DUTY_CYCLE - CLKOUT5_DUTY_CYCLE: Duty cycle for CLKOUT outputs (0.001-0.999)..CLKOUT0_DUTY_CYCLE(0.5),.CLKOUT1_DUTY_CYCLE(0.5),// CLKOUT0_PHASE - CLKOUT5_PHASE: Phase offset for CLKOUT outputs (-360.000-360.000)..CLKOUT0_PHASE(0.0),.CLKOUT1_PHASE(0.0),.COMPENSATION("ZHOLD"),   // ZHOLD, BUF_IN, EXTERNAL, INTERNAL.DIVCLK_DIVIDE(1),        // Master division value (1-56)// REF_JITTER: Reference input jitter in UI (0.000-0.999)..REF_JITTER1(0.0),.REF_JITTER2(0.0),.STARTUP_WAIT("FALSE")    // Delay DONE until PLL Locks, ("TRUE"/"FALSE"))PLLE2_ADV_inst (// Clock Outputs: 1-bit (each) output: User configurable clock outputs.CLKOUT0(n_clkout0),   // 1-bit output: CLKOUT0.CLKOUT1(CLKOUT1),   // 1-bit output: CLKOUT1// Clock Inputs: 1-bit (each) input: Clock inputs.CLKIN1(clkin1),     // 1-bit input: Primary clock.CLKIN2(clkin2),     // 1-bit input: Secondary clock// Control Ports: 1-bit (each) input: PLL control ports.CLKINSEL(ce), // 1-bit input: Clock select, High=CLKIN1 Low=CLKIN2.RST(ce));always@(posedge n_clkout0,negedge ce)
begin
if(!ce)
begin
ff1<=0;
end
else begin
ff1<=d1;end
endalways@(posedge n_clkout0,negedge ce)
begin
if(!ce)
ff2<=0;
else begin
ff2<=ff1;
end
endassign bus=ff2+ff1;
always@(negedge clk)
begin
if(!ce)ff3<=0;else beginff3<=bus;end
end
endmodule

对应的连接网表图如下

 

2.6 约束解析

基础约束中约束了3个主时钟和一个生成时钟

create_clock -period 10.000 -name clkin1 -waveform {0.000 5.000} [get_ports clkin1]
create_clock -period 8.000 -name clkin2 -waveform {0.000 4.000} [get_ports clkin2]
create_clock -period 8.000 -name clk -waveform {0.000 4.000} [get_ports clk]
create_generated_clock -name gen_clk -source [get_pins PLLE2_ADV_inst/CLKOUT0] -multiply_by 2 -add -master_clock clkin1 [get_nets n_clkout0]

2.7 Input_jitter报告

对时钟clk约束输入抖动为1.111ns

set_input_jitter [get_clocks clk] 1.111

以Path9为例,查看Clock Uncertainty,Total Input Jitter(TIJ)即为约束的set_input_jitter值

 

将约束对象改为生成时钟的主时钟clkin1

set_input_jitter [get_clocks clkin1] 1.111

已包含gen_clk的路径Path1为例,此时无Total Input Jitter,即输入抖动约束不会通过主时钟传递到生成时钟

 

移除输入抖动约束,此时Discrete Jitter的数值变化了,即体现在生成时钟gen_clk的Discrete Jitter上

 

2.8 System Jitter报告

查看任一时序路径报告,Clock Uncertainty中Total System Jitter(TSJ)为0.157ns,TSJ的计算公式为Tsj = sqrt(SourceClockSystemJitter^2 + DestinationClockSystemJitter^2),因为SourceClockSystemJitter和DestinationClockSystemJitter都为set_system_jitter值1.234ns,

TSJ=sqrt(1.234^2+1.234^2)=1.745ns。

 

set_system_jitter对所有时钟都生效,因此约束中只有一个抖动值,不能指定对象进行设置

 

2.9 Clock Uncertainty报告

2.9.1 Uncertainty的计算

相比于Input Jitter和System Jitter,Uncertainty的约束方式更复杂,根据计算公式可看出

 

公式中Clock Uncertainty = (√(Tsj^2+Tij^2+Dj^2))/2 +PE+UU 各项含义如下

  • Tsj = 总系统抖动(Total System Jitter),由系统抖动确定。参见 Set System Jitter

  • Tij = 总的输入抖动(Total Input Jitter),由用于约束的Set Input Jitter决定,有的路径也会不存在该项

  • Dj = 离散抖动(Discrete Jitter),是由硬件原语(如 MMCM 或 PLL)引入的抖动量。离散抖动是 MMCM 生成的时钟的特性,包括在主时钟上定义的输入抖动。参见 Set Input Jitter

  • PE = 相位误差(Phase Error),来自 MMCM/PLL 器件模型

  • UU = 用户不确定性(User Uncertainty),即在此指定的用户时钟不确定性。

2.9.2 Uncertainty约束设置

 

相关设置项含义如下

Uncertainty value:指定要分配的不确定性值,以纳秒为单位。

Uncertainty applies to:指示不确定性是用于建立时间分析、保持时间分析,还是两者都适用。

Clock Uncertainty Type:简单不确定性(Simple uncertainty):将时钟不确定性应用于指定的对象。

Objects:列出应分配时钟不确定性的时钟、I/O 端口或单元引脚。

Inter-clock uncertainty:将时钟不确定性应用于跨两个时钟域的时序路径。

From:指定跨时钟不确定性的源时钟。

Transition:指定用于时序分析的源时钟边沿。可以选择上升沿、下降沿或两者。只有由指定时钟边沿触发的路径会受到不确定性的影响。

To:指定跨时钟不确定性的目标时钟。

2.9.3 Uncertainty报告

以Path9为例,展示相关约束对Uncertainty的影响

a) 无Set_Input_Jitter时,路径总的uncertainty为(√(Tsj^2+Dj^2))/2 +PE

 

b) 增加input jitter约束时,路径总的uncertainty(√(Tsj^2+Tij^2+Dj^2))/2 +PE,TIJ为约束的input jitter值

 

c)增加set_clock_uncertainty约束,路径总的uncertainty(√(Tsj^2+Tij^2+Dj^2))/2 +PE+UU,为约束的clock uncertainty值,以约束clk时钟的uncertainty为2.222ns为例

set_clock_uncertainty 2.222 [get_clocks clk]

 

d)set_clock_uncertainty约束中设置setup有效

set_clock_uncertainty -setup 2.222 [get_clocks clk]

查看对应的hold路径,clock uncertainty中不存在UU

 

e)通过interclock uncertainty指定起点和终点上时钟的uncertainty,对象只能为时钟,以约束gen_clk到clk为例

set_clock_uncertainty -from [get_clocks gen_clk] -to [get_clocks clk] 2.222

Path9存在约束UU

 

f) 对clk时钟指定为下降沿生效

set_clock_uncertainty -from [get_clocks gen_clk] -fall_to [get_clocks clk] 2.222

因clk驱动的触发器ff3_reg为上升沿触发,非下降沿,故约束不生效

 

如果需要clk时钟为下降沿触发,则对应的代码需改为

always@(negedge clk)
begin
if(!ce)ff3<=0;else beginff3<=bus;end
end

ff3_reg为下降沿触发时约束生效

 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小米 R3G 路由器(Pandavan)实现网络打印机功能

小米 R3G 路由器&#xff08;Pandavan&#xff09;实现网络打印机功能 一、前言 家中有多台 PC 设备需要打印服务&#xff0c;但苦于家中的 Epson L380 打印机没有网络打印功能&#xff0c;并且配置 Windows 共享打印机实在是过于繁琐且需要共享机保持唤醒状态过于费电。想到…

Leetcode Hot100 第30题 416.分割等和子集

class Solution { public:bool canPartition(vector<int>& nums) {int sum0;for(int num:nums){sumnum;}if(sum%21) return false;int bag_size sum/2;// return dfs(nums,nums.size()-1,bag_size);//递归做法vector<vector<bool>> dp(nums.size()1,vec…

技术晋升读书笔记—阿里管理三板斧(二)

一、引子 美团王兴问马云&#xff1a;“你最强的地方是什么&#xff1f;” 马云反问王兴&#xff1a;“你觉得呢&#xff1f;” 王兴回答&#xff1a;“战略和忽悠。” 马云哈哈大笑&#xff0c;笑完&#xff0c;他一本正经地说&#xff1a;“我最强的地方是管理。” &quo…

引入了 Disruptor 后,系统性能大幅提升!

Disruptor 是一个很受欢迎的内存消息队列&#xff0c;它源于 LMAX 对并发、性能和非阻塞算法的研究。今天一起来学习一下这个消息队列。 简介 对于主流的分布式消息队列来说&#xff0c;一般会包含 Producer、Broker、Consumer、注册中心等模块。比如 RocketMQ 架构如下&…

【WPSOffice】汇总

写在前面 PPT篇 幻灯片母版 通过母版功能统一幻灯片的样式、字体、颜色等&#xff0c;提高整体一致性。 统一设置模板样式 字体安装 查找到字体并安装。 在WPS PPT&#xff08;WPS演示&#xff09;中&#xff0c;以下是最常用的十个功能&#xff0c;能够帮助用户高效制作…

鸿蒙开发:熟知@BuilderParam装饰器

前言 本文代码案例基于Api13。 在实际的开发中&#xff0c;我们经常会遇到自定义组件的情况&#xff0c;比如通用的列表组件&#xff0c;选项卡组件等等&#xff0c;由于使用方的样式不一&#xff0c;子组件是动态变化的&#xff0c;针对这一情况&#xff0c;就不得不让使用方把…

在Nodejs中使用kafka(一)安装使用

安装 方法一、使用docker-compose安装 1、创建docker-compose.yml文件。 services:zookeeper:image: docker.io/bitnami/zookeeper:3.9ports:- "2181:2181"volumes:- "./data/zookeeper:/bitnami"environment:- ALLOW_ANONYMOUS_LOGINyeskafka:image: …

CRISPR spacers数据库;CRT和PILER-CR用于MAGs的spacers搜索

iPHoP&#xff1a;病毒宿主预测-CSDN博客 之前介绍了这个方法来预测病毒宿主&#xff0c;今天来介绍另一种比较用的多的方法CRISPR比对 CRISPR spacers数据库 Dash 在这可以下载作者搜集的spacers用于后期比对 CRT和PILER-CR 使用 CRT 和 PILERCR 识别 CRISPR 间隔区&#x…

深入理解Java的 JIT(即时编译器)

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

LabVIEW开发CANopen紧急对象读取

本示例展示了如何通过CANopen协议读取设备的紧急对象&#xff08;Emergency object&#xff09;。紧急对象用于报告设备发生故障或异常情况时的紧急信息。通过该示例&#xff0c;用户可以配置并读取设备发送的紧急消息&#xff0c;确保在设备发生紧急状况时能够及时响应。 主要…

DeepSeek官方推荐的AI集成系统

DeepSeek模型虽然强大先进&#xff0c;但是模型相当于大脑&#xff0c;再聪明的大脑如果没有输入输出以及执行工具也白搭&#xff0c;所以需要有配套工具才能让模型发挥最大的作用。下面是一个典型AI Agent架构图&#xff0c;包含核心组件与数据流转关系&#xff1a; #mermaid-…

【第13章:自监督学习与少样本学习—13.4 自监督学习与少样本学习的未来研究方向与挑战】

凌晨三点的实验室里,博士生小张盯着屏幕上的训练曲线——他设计的跨模态少样本学习模型在医疗影像诊断任务上突然出现了诡异的性能断崖。前一秒还在92%的准确率高位运行,下一秒就暴跌到47%。这个看似灾难性的现象,却意外揭开了自监督学习与少样本学习技术深藏的核心挑战… 一…

论文解读之DeepSeek R1

今天带来DeepSeek R1的解读 一、介绍 deepseek主打复杂推理任务&#xff0c;如数学、代码任务。 R1以预训练过的V1-base初始化&#xff0c;主要发挥了RL在长思维链上的优势&#xff0c;R1-Zero直接RL而在前置步骤中不进行SFT&#xff0c;即缺少了有监督的指令微调阶段&#…

【Java学习】类和对象

目录 一、选择取块解 二、类变量 三、似复刻变量 四、类变量的指向对象 五、变量的解引用访问 1.new 类变量(参) 2.this(参) 3.类变量/似复刻变量. 六、代码块 七、复制变量的赋值顺序 八、访问限定符 1.private 2.default 九、导类 一、选择取块解 解引用都有可以…

使用css实现镂空效果

前言&#xff1a; 最近在公司完成小程序的新手引导中遇到了要将蒙层挖空&#xff0c;漏出后面内容的功能&#xff0c;找了各种资料之后&#xff0c;发现了一种就使用几行css代码就实现这个效果的方式&#xff0c;在这里分享给各位小伙伴们。 功能描述&#xff1a;实现下图的镂…

15.1 Process(进程)类

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 通常开发时想要获得进程是比较困难的事&#xff0c;必须要调用CreateToolhelpSnapshot、ProcessFirst、ProcessNext等API或者诸如 Zw…

【全栈开发】----Mysql基本配置与使用

本篇是在已下载Mysql的情况下进行的&#xff0c;若还未下载或未创建Mysql服务&#xff0c;请转到这篇: 2024 年 MySQL 8.0.40 安装配置、Workbench汉化教程最简易&#xff08;保姆级&#xff09;_mysql8.0.40下载安装教程-CSDN博客 本文对于mysql的操作均使用控制台sql原生代码…

数据恢复-01-机械硬盘的物理与逻辑结构

磁盘存储原理 磁盘存储数据的原理&#xff1a; 磁盘存储数据的原理是利用磁性材料在磁场作用下的磁化性质&#xff0c;通过在磁盘表面上划分成许多小区域&#xff0c;根据不同的磁化方向来表示0和1的二进制数据&#xff0c;通过读写磁头在磁盘上的移动&#xff0c;可以实现数据…

神经网络新手入门(3)光明顶复出(2006-2012)

让我们继续这场科技江湖的传奇&#xff0c;见证神经网络如何从寒冬中涅槃重生&#xff1a; 第五章&#xff1a;光明顶复出&#xff08;2006-2012&#xff09; 2006年&#xff0c;江湖人称"深度学习教主"的辛顿&#xff08;Geoffrey Hinton&#xff09;闭关修炼二十…

【C++】基础入门(详解)

&#x1f31f; Hello&#xff0c;我是egoist2023&#xff01; &#x1f30d; 种一棵树最好是十年前&#xff0c;其次是现在&#xff01; 目录 输入&输出 缺省参数(默认参数) 函数重载 引用 概念及定义 特性及使用 const引用 与指针的关系 内联inline和nullptr in…