《基于spyglass同步设计分析和静态验证》阅读笔记

2023-11-19

基于spyglass同步设计分析和静态验证 - 豆丁网
http://www.docin.com/p-1444334021.html

这篇论文,讲述了跨时钟问题的原理、实例分析及使用spyglass解决CDC(clock domain crossing)的办法。对于我来说,有很多参考价值。特此作一阅读笔记。作为以后不断精进的知识储备。

常见的CDC问题

亚稳态

建立保持时间违反,就会发生亚稳态。
这里写图片描述

data hold,数据保持的时间问题

这种情况,发生在快时钟到慢时钟域。由于快时钟域的数据信号,保持时间过短,不能被慢时钟域采样到。
这里写图片描述

常见的两级触发器同步

周期内存在亚稳态问题。所以两级触发器同步结构中,第一级触发器的输出,设计中是不允许参与任何组合逻辑的。
这里写图片描述

多bit信号,采用简单的两级触发器同步

这种设计是有问题的。会使得输出状态存在不可预期的一组或多组值。如果格雷编码后,再经过下述逻辑结构,能够保证输出状态不会存在不可预期的一组或多组值;一般会用到状态机的同步。
这里写图片描述
这里写图片描述

CDC中复杂的同步设计

  1. 异步fifo
  2. 握手协议的同步
  3. 单一使能信号形式的同步

亚稳态总会有概率的存在

这是因为触发器的亚稳态,无法在期望的时间范围内得到恢复。而且亚稳态会传递至后续的电路中。
这就引出了同步设计中的平均失效时间MTBF(Mean Time Between Failures);定义是:一个同步设计的触发器在设计规定的时间内,仍然进入亚稳态的概率。
这里写图片描述
其中亚稳态恢复时间=目的时钟域的周期-(组合逻辑的时间+Tsetup);理解来说就是亚稳态可以恢复的有效时间;超出这个亚稳态恢复时间,就会产生亚稳态的危害。
根据公式,可以看出,数据翻转率越低,目的时钟域频率越低、建立保持窗口越小;都会增加MTBF,即改善亚稳态的概率。增加亚稳态恢复时间,也可以改善亚稳态的概率。
由此,得出二级同步触发器结构的亚稳态恢复时间=目的时钟域的周期-(Tsetup);因为两级触发器的组合逻辑时间为0.
同理,得出二级同步触发器结构的亚稳态恢复时间=2*目的时钟域的周期-(Tsetup)。
这里写图片描述

这里写图片描述
所以,由上图可以得知,800MHz以上,出现亚稳态错误的几率会非常高,平均约3.43小时出现一次。而480MHz以下的时候,2.2994万年才会出现一次。所以,大于480MHz以上,就不要用二级触发器做同步了。
另外,三级同步触发器,只能改善,但是随着时钟频率的不断提高,仍然存在危险;而且会增加系统的总体延迟。
PS:这里写图片描述
这里,可以看出上面的概率,也许会因为这个常量,在不同环境里导致概率增大的情况。

单bit信号的CDC同步设计

慢时钟域到快时钟域的同步情况

有两种传输类型,一种是电平敏感的同步设计;一种是边沿敏感的同步设计。
这里写图片描述
这里写图片描述
原文介绍,异步输入信号必须满足一定的保持时间,这一点没理解。
当目的时钟域与源时钟域小于两倍的情况下,单bit的异步输入信号必须保持至少两个源时钟域的周期,这样才能不会产生数据的丢失情况.

快时钟域到慢时钟域的同步情况

这里写图片描述
这种结构,存在限制。
这里写图片描述
这里写图片描述

多bit信号的CDC同步设计

握手协议同步设计

这里写图片描述
具体实现,有三种握手同步设计。这里不再赘述,详情看参考文件。
这里写图片描述

异步fifo的同步设计

看文档的意思,是说异步fifo能完美解决异步处理。但是还没理解深入,待续。
这里写图片描述

异步复位信号的同步设计

这里写图片描述
不过要注意,同一个异步复位信号,不要多次做上述结构。可能是因为上图中的第一个异步复位宽度已经很窄,无法再执行一次同步设计吧?!

spyglass工具的引入

spyglass类似pt,是静态验证工具。特点就是不需要编写testbench,就可以验证。
这里写图片描述
这里可以结合spyglass的理解,进行演示脚本的执行过程。

组合逻辑的输出,不要直接用于异步处理。

因为会出现毛刺,解决办法,就是组合逻辑的输出,加一个触发器在源时钟域下采样一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《基于spyglass同步设计分析和静态验证》阅读笔记 的相关文章

  • 在verilog中使用for循环生成

    我试图理解为什么我们在verilog 中使用generate 和for 循环 一起使用生成和 for 循环 reg 3 0 temp genvar i generate for i 0 i lt 3 i i 1 begin always p
  • 为什么我的输出没有被赋值?

    我正在为一个更大项目的一部分开发解码器 我有两个计数器充当该模块的输入 其中一个计数器计数 0 15 另一个计数器在第一个计数器达到 15 时递增一次 根据计数器的值 解码器输出不同的值 通常它是 0 1 或 1 但有时它必须是 0 707
  • 比较数字进行排序然后得到中值

    使用按位或比较运算符对五个整数进行排序可以通过以下方式实现 首先获取最大的数字 然后获取第二大的数字 然后获取第三大的数字 依此类推 这是我获取最高数字的代码 include
  • Verilog 奇怪的仿真结果综合后

    我面临一个奇怪的问题 该代码适用于简单的 ALU 仅将感兴趣的代码粘贴到此处 always posedge clk or posedge rst begin if rst 1 begin mul valid shr 3 b000 end e
  • 为什么这个 verilog 关系语句返回 true?

    我有一条名为 sin hall2 的 9 位签名线 该语句返回 true sin hall2 8 0 gt 9 d1 当我查看模拟时 sin hall2 169 我假设这是 verilog 处理比较负数的方式 但我做错了什么 当我执行 si
  • 如何在verilog中逐行读取文本文件?

    我有一个 SREC 文件 它是一个简单的文本文件 我想在 verilog 中逐行读取它 我怎样才能做到这一点 以下读取文件 每个时钟周期 1 行 预期的数据格式是每行一个十进制数 integer data file file handler
  • Verilog:添加寄存器的各个位(组合逻辑,寄存器宽度可参数化)

    我正在尝试想出一种方法来添加寄存器的各个位 例如 if regA 111000 then regB 3 位的总和regA 1 Verilog或SystemVerilog中是否有可以直接使用的可综合函数 运算符来执行此操作 如果不是 那么问题
  • 将枚举转换为逻辑

    考虑以下模块声明 module DFF d q CLK RESET parameter W 2 input W 1 0 d input CLK input RESET output logic W 1 0 q endmodule 当 d 和
  • verilog 中的“<<”运算符

    我有一个verilog代码 其中有一行如下 parameter ADDR WIDTH 8 parameter RAM DEPTH 1 lt lt ADDR WIDTH 这里将存储什么RAM DEPTH以及什么是 lt lt 操作员在这里做
  • 如何获取值数组作为 plusargs?

    如何获取值数组作为参数 我需要从命令行获取一组未定义大小的命令 如何将这些参数放入数组或队列中 Eg CMDS READ WRITE READ N WRITE 它应该被带到一个数组中 value plusargs不支持数组 但支持字符串 看
  • Verilog 中的“net”代表什么?

    我刚刚开始学习Verilog 据我了解 Verilog有net数据类型 什么是net代表 网络就是这样一种数据类型 您不使用它来存储值 它们代表物理连接 您可以将线路视为一种网络数据类型 你可以去网上看看更多here http www ee
  • Verilog 中的大括号是什么意思?

    我很难理解 Verilog 中的以下语法 input 15 0 a 16 bit input output 31 0 result 32 bit output assign result 16 a 15 a 15 0 我知道assign语句
  • 在测试台中显示信号名称/文字

    是否可以在 Verilog 中引用 显示信号的名称 文字 对于在 Verilog 测试台中创建通用信号检查功能来说 这将是一个有用的功能 我知道使用 display 时 m 将打印信号的范围 是否有显示信号名称的等效项 在 Verilog
  • 我怎样才能让我的verilog移位器更通用?

    这里我有一个移位器 但现在它最多只能工作 3 位 我一直在寻找 但不知道如何让它工作最多 8 位 module shifter a b out input 7 0 a b output 7 0 out wire 7 0 out1 out2
  • reg 声明中的位顺序

    如果我需要使用 4 个 8 位数字 我会声明以下 reg reg 7 0 numbers 3 0 我对第一个和第二个声明 7 0 和 3 0 之间的区别感到很困惑 他们应该按什么顺序来 第一个是保留数字的大小 而第二个是保留数字的数量 还是
  • 如何在 icarus verilog 中包含文件?

    我知道基本的 include filename v 命令 但是 我试图包含另一个文件夹中的模块 现在 该模块还包括同一文件夹中存在的其他模块 但是 当我尝试在最顶层运行该模块时 出现错误 C Users Dell Desktop MIPS
  • Verilog 数组语法

    我是 Verilog 新手 并且遇到了很多麻烦 例如 我想要一个包含八个单元的数组 每个单元都是 8 位宽 以下不起作用 reg 7 0 transitionTable 0 7 assign transitionTable 0 10 仅仅做
  • 为什么我们在FGPA / VHDL / VIVADO中使用REG?

    我正在使用 Xilinx 的 vivado 在 verilog 中进行编程 我想知道为什么我们使用某些输出reg 例如reg 3 0 encoder output我们使用它是因为我们的 16 到 4 编码器有 4 个输出 对吧 我假设我们使
  • 仿真输出全为零

    我的设计模块和测试平台代码已编译 但是 当我模拟时 我没有得到正确的输出 谁能告诉我我的代码哪里出了问题 这是测试平台的代码 module testbench reg 511 0 FROM LS reg CLK reg 63 0 TO IF
  • 如何迭代创建参数化大小的总线来连接同样迭代创建的模块?

    我正在尝试使用组合逻辑方法在 verilog 中创建乘法器模块 以便不涉及时钟 我希望模块有一个通用的定义 即我希望乘法器分别接收大小为 M 和 N 位的两个因子 并返回大小为 M N 位的乘积 基本思想是计算部分积的和 每个部分积根据其级

随机推荐

  • 使用http携带token请求第三方接口 并封装参数以post方式请求

    首先准备条件 1 四个jar包 fastjson 1 2 3 jar commons io 2 4 jar commons httpclient 3 1 jar httpcore 4 3 jar slf4j api 1 7 7 jar 这个
  • 范围for语句

    C 新标准提供的范围for语句 这种语句遍历给定序列中个元素并对序列中每一个值执行某种操作 其语法形式是 for declaration expression statement 其中 expression 部分是一个对象 用于表示一个序列
  • tp5 生成随机数

    控制器调用 public function GetRanStr if request gt isPost 生成6位数随机数 return GetRandStr 6 公共方法 生成随机数 param len return string fun
  • 常用与业务密切相关的prompt

    可以在 Bard Bing Claude 2 ChatGPT和 Llama 2 上使用 定义您的业务目的和愿景 提示 我正在 插入行业 创业 我的重点是定义与我的受众产生共鸣的明确目标和愿景 你能指导我制定有意义的愿景声明吗 研究和分析您的
  • android通过JNI用C/C++创建本地文件

    通过jni在本地创建文件 1 在android studio创建基本的jni工程 并且在APP界面成功显示 Hello from C 不会的可以看android studio使用jni 2 在native lib cpp文件中创建文件 为了
  • eclipse导入项目后,项目报红叉的解决方法

    导入项目后 项目报红叉的解决方法 导入别人的项目后 一般都会报错 我之前尝试build path 发现并没有问题 后来发现 点击项目右键 properties 把服务加上Apply and Close就可以了
  • Spring(三):JavaBean的生命周期

    JavaBean的生命周期 一 基本概念 bean 就是由IOC 容器初始化 装配及管理的对象 Spring中的bean默认都是单例的 那么单例Bean在多线程程序下如何保证线程安全呢 Spring的单例是基于BeanFactory也就是S
  • 音视频学习笔记(雷神)—技术解析

    音视频技术解析 封装技术 视频压缩编解码 音频压缩编解码 这是技术层 流媒体传输协议 这是网络层 视频播放器解析 解协议 从视频播放器的角度做解析 拿到传输而来的视频数据后 首先要解协议 传输协议 自然的本地视频经过硬盘传输数据自然没有解协
  • 关于UI适配的文档

    第一部分 原理 1 根据当前屏幕尺寸与开发预设屏幕尺寸尺寸得出以下参数 1 XRatio 当前屏幕尺寸与开发尺寸的X轴比例 2 YRtaio 当前屏幕尺寸与开发尺寸的Y轴比例 3minRatio XRatio与YRtaio中的较小值 2 之
  • 求1到n的所有质数(素数)

    1 一般方法 定义一个空列表 双层循环实现 时间复杂高计算慢 时间复杂度为 O n 2 mathrm O left mathrm n 2
  • 《这些话好帅,经典得让人心痛!》

    http bookmark hexun com shuhe2008 detail aspx bid 6306685 type rss 1 对自己好点 因为一辈子不长 对身边的人好点 因为下辈子不一定能够遇见 2 对不起是一种真诚 没关系是一
  • 线性回归和逻辑回归的区别_【基础】线性回归和逻辑回归

    回归和分类 回归和分类是机器学习可以解决两大主要问题 从预测值的类型上来区分 连续变量的预测称为回归 离散变量的预测称为分类 例如 预测房价的价格是一个回归任务 预测一张图片是猫还是狗的图片是分类任务 线性回归 在一维特征空间 线性回归是通
  • C基础day8(2023.7.10)

    一 Xmind整理 二 课上练习 练习1 基本类型参数 include
  • Ubuntu/Win10双系统安全删除Ubuntu的方法

    为什么要删除Ubuntu 现在 许多筒子喜欢在电脑上安装双系统 Windows Linux Linux系统中最受个人用户用户青睐的当属Ubuntu了 我们常常在Ubuntu上写程序 调代码 做开发 然而 有些时候我们因为各种各样的原因 不得
  • vscode插件开发踩坑

    vscode插件开发踩坑 q npm总是提示连接错误并且切换源也没用 a 卸载重装 卸载干净 usr 下的lib和bin有关node moudle的全删掉 q npm使用sudo时提示错误 a 首先npm不能和sudo一起用 然后因为npm
  • iOS 17 Simulator Failed with HTTP status 400:bad request

    升级 xcode 15 要 ios17 的 sdk 才能运行 但是更新这个 sdk 400 错误了 解决方案 直接去官网下载开发者后台下载dmg文件 使用命令行快速安装即可 https developer apple com documen
  • OCaml简介

    OCaml简介 函数式编程 产生于 优点 ref https zhuanlan zhihu com p 591818090 函数式编程 传统的编程语言 是面向过程 面向对象的 产生于 20世纪80 90年代 产生于法国巴黎高等师范学院 起源
  • 如何在Unity中使用AR Foundation和ARCore创建一个项目并编译到Android 11手机设备中

    最近又开始学如何使用Unity进行AR开发 因为Unity开发的AR Foundation在各种设备 例如Android iOS HoloLens 的原生AR SDK 例如ARCore ARKit Windows 10 SDK 上进行了封装
  • 服务端收发登录注冊流程

    client发包给服务分为主次id struct TCP Command WORD wMainCmdID 主命令码 WORD wSubCmdID 子命令码 一 注冊 1 当在client输入游戏帐号或游戏昵称换行时 进行验证 CS 1 1
  • 《基于spyglass同步设计分析和静态验证》阅读笔记

    常见的CDC问题 亚稳态 data hold数据保持的时间问题 常见的两级触发器同步 多bit信号采用简单的两级触发器同步 CDC中复杂的同步设计 亚稳态总会有概率的存在 单bit信号的CDC同步设计 慢时钟域到快时钟域的同步情况 快时钟域