关于复位的一些总结

2023-11-10

同步reset(synchronous reset)是说,当reset信号为active的时候,寄存器在下一个时钟沿到来之后被复位,时钟沿到来之前寄存器还是保持其之前的值。

异步reset(asynchronous reset)是说,当reset信号为active的时候,寄存器立刻被复位,与时钟沿到来与否没有关系。

注意这里老李没有说reset信号为1的时候,而是说active,因为有的时候是为1能够使寄存器复位,这个时候我们说high active,而有的时候是0能够使寄存器复位,这个时候我们说low active。

同步reset和异步reset的区别算是数字芯片设计的入门知识点,一般第一轮面试就会考察。如果这个问题回答不好的话,那么你在面试官心里的印象一定是低于平均值的。老李在这里带大家简单复习一下,如果你对下面这些内容已经烂熟于心,就直接跳过吧。

首先同步reset和异步reset最主要的区别,从定义上就可以看得出,同步reset需要时钟,而异步reset不需要时钟。如果说你的模块需要在没有时钟的时候复位,那只有异步reset能够做到,这也是绝大多数芯片的上电复位信号(PowerOn Reset)以及一些PHY比如USB的内部需要异步reset的原因。而在一些IP中,如果你可以等到时钟开始翻转之后再复位,时钟开始翻转之前内部即使没有复位也没有关系的话,那么就可以用同步reset。

其次一个差别,即同步reset信号在综合后,reset信号和其他的datapth信号一样,是一起算在两个寄存器之间的logic深度里,D寄存器本身是没有复位的pin的。而异步reset信号通常会综合出一个带有复位pin的D寄存器。一般来说工艺厂家的standard cell library都会提供两种不同的寄存器,只要你的coding style正确,综合工具会选择适当的flop。

在这里插入图片描述
上图是同步reset综合出来之后的netlist,可以看出reset_n使得两级寄存器之间的组合逻辑多加了一个AND门。

always_ff @(posedge clk) begin
if (!reset_n) begin
q2 <= 1’b0;
end
else begin
// q2 <= …
end
end
对于异步reset,综合出来的flop自带reset pin,所以reset不参与中间的组合逻辑,如下图D2所示

在这里插入图片描述
always_ff @(posedge clk or negedge reset_n) begin
if(!reset_n) begin
q2 <= 1’b0;
end
else begin
//q2 <= …
end
end
从综合出来的逻辑可以看出,异步reset由于对寄存器之间的datapath没有贡献,所以在timing上面能够略微比同步reset好一些,特别是reset信号作为一个负载很大的信号,如果reset tree做得不好可能使得reset path的combo delay变得很大,反而限制了performance的提高。所以在对logic depth抠得很细的设计中,可以使用异步reset来避免引入更多的combo delay。

但是同步reset还有一个优势,由于reset信号会最终起作用在寄存器的D输入端,那么通过reset的组合逻辑都会被STA所约束,也就是说reset信号和其他datapath的信号一起要满足寄存器的setup time, hold time, min pulse等一系列check,在timing close的情况下我们可以拍着胸脯保证:寄存器不会因为reset信号的变化产生metastable。(所以同步reset信号的跨时钟域咱们就不废话了)可以对于异步reset就没有这么简单了,既然是异步,那么就是在任何时候都可能变化。现在STA之所以叫static timing analysis,是因为工具是静态分析电路的:给定一个时钟沿的起始点,然后后面每一级的delay都是纯粹的累加,最后再和required time来进行比较,比required time早到,就是满足timing,晚到就是violation。可是如果一个信号什么时候来都无法确定,那么就无法判断这个信号的datapath上最后能否满足required time。换句话说,纯粹的异步reset在当前的STA check中是没有办法检查的。

那么怎么办呢?难道对于异步reset信号就听之任之放任不管吗?当然不是,我们做IC的当然要对每一个细节都要研究清楚。我们这里要分两种情况:1. reset assertion; 2. reset release。老李直接上结论:

如果使用异步reset,reset assertion是异步的,但是reset release一定要和时钟同步!

因为对于reset assertion,reset active之后flop的值是稳定在reset value的,只要reset继续active,来多少个clock,其他datapath上的信号怎么变,flop的值都不会变化,所以reset 在什么时候assertion都没关系。但是reset release就不一样了,一旦reset从active变为in-active,那么flop之后的值就得取决于其他信号输入和时钟沿的关系了,所以对于reset de-assertion,在STA里有两个专门的参数来check,叫做recovery time和removal time。

recovery time指的是reset release之后要求距离下一个时钟沿的最小间隔,可以类比于其他信号datapth上的setup time。

removal time指的是reset release之后要求距离上一个时钟沿的最小间隔,可以类比于其他信号datapth上的hold time。
换句话说,reset release必须在recovery time和removal time加起来这个窗口之外,这样才能保证寄存器不会产生metastable。

在这里插入图片描述
好,下面的问题就变成了,我们如何设计可以使得异步reset信号是异步assertion, 同步release呢? 终于要引出我们今天的主题,将一个异步的reset信号同步到一个时钟域,并且还要保证assertion是异步的,但是release是同步于这个时钟的,我们把这样的电路叫做reset synchronizer, 如下图所示。
在这里插入图片描述
可以看到,当src_reset_n assert时,两个flop被异步reset,它们的Q会经过reset-to-q的延时之后立刻发生变化,使得dst_reset_n assert。
而当src_reset_n release后,dst_reset_n并不是立刻发生变化,而是要等待dst_clk的时钟沿,并且打两拍之后才能将1传递到dst_reset_n。因为dst_reset_n是来自于flop的Q,而Q是经过dst_clk上的同步信号。那为什么要两级flop,还是为了减小产生metastable的概率。

复位信号不满足recovery time和removal time本质上就是不满足setup/hold。进一步解释:复位信号也可以把它看成是一种输入的数据信号,当复位释放时,如果没满足setup/hold(即复位释放点实在触发器的setup/hold窗口内),那么此时触发器不确定这个复位信号到底生不生效,也就是说不确定是输出复位值(复位生效)还是数据输入端的值(复位不生效),这就是说图中的reg1会发生亚稳态的原因,那为什么reg2不会发生亚稳态呢?因为reg2的输入是reg1的输出,复位释放之前这里是0,那么就算reg2发生了亚稳态,reg2不确定是输出复位值还是输入的数据,但是因为复位值和数据输入都是0,所以无论reg2判定复位有不有效,输出都是0,可以看成是不会发生亚稳态(即不确定输出是0还是1)。但是其实reg2本质上是发生了亚稳态的,它输出的0不能确定是复位信号导致的还是说是数据输入端来的。
避免复位亚稳态发生就是避免在reg输入数据跳变的时候复位,可采用的方法是:
对于REG2而言,其D输入和CDN复位值可能出现竞争。在复位时之前就保证上游模块出口数据处于某一个稳定状态。
注意,对于一个使用异步reset的模块,reset synchronizer是必须的,但是也不要对一个异步reset信号进行多次reset synchronizer,否则同样的会产生coherency的问题。

有人会问了?什么是coherency?下面这张图就明白了:
在这里插入图片描述

如果复位的释放与时钟异步(通常就是这种情况),那么就无法保证所有触发器都能在同一个时钟边缘释放(图2)。
在这里插入图片描述

。当在A时刻释放reset时,触发器将在第一个时钟边沿检测到有效的释放信号;在C时刻释放reset时,复位的释放将直到下一个时钟边沿才被检测到;B时刻时钟上升沿时触发器检测到的reset状态很难确定(可能高电平,也可能低电平),可能导致亚稳态。
异步复位的复位信号必须满足一定的恢复时间和解除时间,否则没法确定时钟沿是否起作用了,即判断不了到时是复位了还是没复位。D触发器如果不复位,那么输出就是输入的数据。

1). 不满足复位恢复时间或者撤离时间,可能会导致亚稳态问题。(注意是可能)因为如果输出本身就是复位后的值,即使当前时钟沿不能判断是否复位,输出也是复位值,这时候就不会产生亚稳态,因为已经是复位态了。

2). 不满足复位恢复时间或者撤离时间可能会导致不同FF复位状态不一致的问题。复位信号和时钟信号一样,通过复位网络到达各个触发器。复位网络具有非常大的扇出和负载,到达不同的触发器存在不同的延时,不满足复位恢复或者解除时间的情况下,**就有可能在不同的触发器的不同时钟周期内进行解复位。**注意,这里的假设条件是复位树和时钟树已经做成立平衡状态,不再考虑复位树和时钟树没做好的情况。异步复位可能导致复位解除(reset removal) 发生在不同的触发器的不同时钟周期

Does It Really Matter?
好消息是,在99.99%的情况下,全局复位的异步释放对系统没什么影响,所以大多数电路都能正常工作。如果一个电路不工作,那可能恰好是遇到了另外的0.01%,不幸地在错误的时间释放了复位。

在图4所示的流水线场景中,复位释放的时间并不重要。
在这里插入图片描述
当数据通过流水线进程时,复位的释放时间无关紧要。即使出现了错误,在经过一定时钟周期后整个系统就能恢复。这种情况下,复位是没有意义的。当有效的数据输入时,初始状态或者未知的状态将从系统中清除。

但是,在图5显示了的独热码状态机场景中复位释放的时间非常重要。
在上面的独热码状态机中,有明显的失败可能性。如果第一个触发器在第二个触发器的前一个时钟周期释放,那么独热码的热状态将丢失,状态机将永远变冷(状态机无法恢复)。将所有的触发器尽可能的靠近布局能够降低错误的发生概率(在局部重置网络上的低倾斜)。然而,除非Set-up timie建立时间得到保证,否则这种错误情况仍有可能发生。如果所有触发器没有在同一个时钟周期中释放,编码后的状态机可能进入意外状态或则会非法状态。

最后,需要仔细考虑复位的是包含反馈路径的电路。

没有反馈的电路实际上根本不需要复位。在数字信号处理应用中,有限脉冲响应滤波器(FIR)是没有反馈的。在有效数据填充了所有的抽头之前,输出样本实际上没有有效的值,所以复位抽头寄存器没有任何效果。然而,无限脉冲响应滤波器(IIR)包含反馈。如果因为不干净的复位释放而产生了一些不符合预期的输出,该输出结果又会返回到输入,那么会在很长一段时间内无法获取真实的输出结果(反馈环路互相影响了)。在最坏的情况下,由于不稳定,滤波器可能会完全失效。

一般逻辑对此时序不用关心,比如很多模块的操作流程是复位完了,才开启模块时钟,再启动模块工作。这种流程可以保证不会出现recovery和removal的问题,因为复位置起撤销时都没有时钟;即使操作流程保证不了,出现recovery和removal违例,由于模块此时都不会工作,也没什么问题。

需要关心recovery和removal问题的最常见模块应该是CPU,因为一般CPU是在复位撤销后就开始工作。想象一下,CPU的工作其实是在很多个DFF一起配合完成的,如果复位撤销时刻在DFF的clock沿附近,势必导致各个DFF开始动作的步调不一致,导致无法预料的错误情形。

处理办法就是讲需要考虑recovery和removal问题模块的复位信号,用模块的工作时钟同步后,再送进模块使用。这样PR工具是会自动检查这个模块的DFF的时序并修正,直到没有recovery和removal的violation。对于其他没有要求的模块复位信号,设置false path不去检查这个时序即可。

另外,复位还需要注意RDC处理的问题,也就是比信号跨复位域传播的问题。后续补充。。。。。

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

关于复位的一些总结 的相关文章

  • 安装eclipse启动时报错

    1 在安装eclipse后 点击exe文件时 提示出现错误 记录在log文件中 因为log文件就是日志文件 可以方便我们排查错误 打开log文件 可以看到文件记录了每次出错的时间和错误栈信息 最新一次错误是 ENTRY org eclips
  • ‘cudaThreadSynchronize’ is deprecated

    Problem src gemm c In function time gpu src gemm c 232 9 warning cudaThreadSynchronize is deprecated Wdeprecated declara

随机推荐

  • C++程序中调用exe文件的一种方法

    我们在开发项目时 通常需要通过一个程序调用另一个程序 在这里介绍一中在C 程序中调用exe文件的方法 使用ShellExcecuteEx函数 使用ShellExcecuteEx相对于其他的调用exe的方法 例如 使用system函数 使用e
  • 区块链是生命体、经济体。未来的区块链世界离不开自己的价值尺度建设

    想知道更多区块链技术知识 请百度 链客区块链技术问答社区 链客 有问必答 公有链和联盟链的本质不同 区块链受到大家广泛关注应该是2015年10月 那时候万向在上海搞了一场区块链国际峰会 因为万向在整个金融界比较有影响力 加上 经济学人 在1
  • 如何删除在System中打开的iso文件

    目录 问题 解决方法 弹出DVD驱动器 删除iso文件 问题 在打开iso文件后 我的电脑中突然出现了一个DVD驱动器 如图1 而且原来的iso文件也无法删除 会提示文件在System中打开 如图2 图一 图二 解决方法 弹出DVD驱动器
  • 使用ffmpeg 将MP4格式 或其他格式转为谷歌浏览器可以播放的MP4文件

    场景 在网页上传任意视频格式的文件后 调用系统的ffmpeg 命令对其格式 转化后 发现谷歌浏览器压根无法播放 原因 视频不光区分格式 同一格式还区分编码 对于扩展名相同的视频文件它们的视频的编码可能是不一样的 mp4格式的视频就有3种编码
  • 【bnlearn in Python】Python下载bnlearn包的一些问题

    贝叶斯网络小萌新 请大家多多指教多多关注 文章目录 bnlearn document 下载超时问题 下载指令 证明下载成功 bnlearn document bnlearn包的指南文件见链接 bnlearn document 下载超时问题
  • kmp(看毛片)算法

    别人的两篇博客 传送门1 传送门2 摘录 其中T为主串 P为模式串 其实就是在T中找P 其中next数组存的是 部分匹配值 部分匹配值 就是 前缀 和 后缀 的最长的共有元素的长度 以 ABCDABD 为例 A 的前缀和后缀都为空集 共有元
  • 如何安装使用IP广播?

    步骤一 连接设备到同个局域网 设备连接网络 所有的设备与服务器处于同个局域网内 测试时放在同个交换机内 步骤二 在服务器上安装广播软件 再服务器上安装 数字网络广播系统软件 运行目录下的 Setup exe 文件 一直下一步直到完成 再服务
  • TortoiseSVN使用方法

    安装和配置 TortoiseSVN的下载地址为 http tortoisesvn net downloads html 有32位和64位的版本 一定要根据自己的操作系统下载对应的版本 最好安装一个简体中文的Language packs 可以
  • C++opencv进行图像处理(三)图像的基本操作

    1 图像像素的加法 主要包含了图像的像素加法 当像素增加 会使得图像变亮 当像素减少会使得图像变暗 除法操作会变暗 结果如下所示 左边是原图 右边是像素相加后的 在前面的代码模块中增加的代码为 void QuickDemo pixel op
  • STM32学习笔记—独立看门狗

    1 独立看门狗的介绍 2 独立看门狗的使用 3 代码段 1 独立看门狗的介绍 独立看门狗利用系统内部的低速时钟提供机械周期 这个低速时钟与系统的工作时钟不是一个时钟 所以看门狗的运行和系统的运行是互不干扰的 独立看门狗由内部专门的 40Kh
  • 计算机视觉---常见的颜色空间

    RGB 最常见的面向硬件设备的彩色模型 它是人的视觉系统密切相连的模型 根据人眼结构 所有的颜色都可以看做是3种基本颜色 红r 绿g 蓝b的不同比例的组合 HSV HSV颜色空间是孟塞尔彩色空间的简化形式 是一种基于感知的颜色模型 它将彩色
  • ShardingSphere水平、垂直分库、分表和公共表

    目录 一 ShardingSphere简介 二 ShardingSphere 分库分表 1 垂直拆分 1 垂直分库 2 垂直分表 2 水平拆分 1 水平分库 2 水平分表 三 水平分库操作 1 创建数据库和表 2 配置分片的规则 3 测试类
  • Java内存分配介绍

    Java的内存分配主要有三个位置 方法区 就是字节文件 存储未运行的代码 栈内存 当方法运行的时候 则在栈内存中存储 堆内存 当方法新生成对象的时候 或者新产生出局的时候将在堆内存中存储 方法区 字节文件加载时进入的内存 存储的就是编写成功
  • 常用服务器指令

    查看docker 容器占用进程 docker top 容器id 容器名 查看进程占用内存 top p PID 查看服务器所有进程 pid ef 查看内存 free 查看占用CUP最多 ps aux sort k4nr head n 10 查
  • 【Mariadb数据库用户及权限管理】

    一 用户管理 1 创建用户 方法一 直接创建用户 create user 用户名 来源 identified by 密码 来源地址 localhost 本机 192 168 150 网段 所有 方法二 在授权同时就创建用户 grant 权限
  • VTK笔记-图形相关-判断空间上的点是否在图元内-vtkSelectEnclosedPoints

    判断空间上的点是否在几何图元内 使用vtkSelectEnclosedPoints类 vtkSelectEnclosedPoints vtkSelectEnclosedPoints类可以判断标记点是否在封闭表面内 vtkSelectEncl
  • 【CVPR2021】文章、代码和数据链接

    Awesome CVPR2021 Low Level Vision 整理汇总下今年CVPR图像重建 Image Reconstruction 底层视觉 Low Level Vision 相关的论文和代码 括超分辨率 图像去雨 图像去雾 去模
  • 解决 ANSJ分词 自定义词典文件无效

    注意 1 指定配置文件的路径时 建议配置为绝对路径 这种方式最简单 否则需自行解决路径的问题 2 配置文件的内容 词典各字段之间使用tab t 分割 一般发现自定义字典无效 就是因为使用的不是tab t 而是4个空格等 所以 一定要记住 t
  • Bootstrap 3导航栏

    Today we continue Bootstrap 3 lessons and review Bootstrap 3 Navbar In our new lesson we will try to disassemble the nav
  • 关于复位的一些总结

    同步reset synchronous reset 是说 当reset信号为active的时候 寄存器在下一个时钟沿到来之后被复位 时钟沿到来之前寄存器还是保持其之前的值 异步reset asynchronous reset 是说 当res