soc的clk和reset/rst/RDC及afifo复位

本节不去讨论同步复位与异步复位以及异步复位的reset_release,这些问题可参考:

芯片设计进阶之路——Reset深入理解——cy413026

本文主要回答一下几个问题。

0.0 clk不能同时达到所有同步寄存器

需要确定后端是不可能让所有的同步寄存器同时获得时钟的?

如果确定了,那么如果先解复位,再开时钟就可能,同一个clk domain和reset domain的寄存器有的有时钟,有的没有时钟,可能会出现有的正确采样了有的没有正确采样,所以需要等到时钟稳定并传输到所有寄存器clk端?

和后端的同事交流了一下,在做clk tree的时候会对同一个clock做balance。clock balance的目的就是要让同一个clk上升沿几乎同时到达所有该clk下的FF。它们之间的差距就是clk skew,这个skew是很小的【远小于一个时钟周期】,也就是说不会出现距离clk common path近的FF先收到clk,远的FF会晚一个时钟周期以上收到clk。

后端同事说clk会先走到该clk下寄存器的中心区域,尽量把clk的common path做长,然后在散开。但是这样就一定能够保证从common path分开之后近端和远端的clk skew很小吗?会不会出现近端的FF在clk path上加的buff比远端的buff多?这个问题留待后续讨论。

0.为什么异步复位多见低电平

        实际上异步复位用低电平是一个历史问题,非复位状态时,为高电平,早期使用TTL的电路时,保持高电平比低电平节省功耗。现在都是CMOS电路不存在这个区别了。

        但是随着工艺的提升,工作电压的降低,考虑到噪声的影响,大家又偏向于低电平复位。

1.片外的reset信号特别是按键reset怎么防止错误抖动的影响?

   常见的处理方法包括两种:

  • 使用斯密特触发器做IO输入,斯密特触发器有一定的防抖动功能
  • 使用de-bounce电路

    de-bounce电路原理就是检测到IO输入的信号翻转之后 在多次间隔一定时间检测信号值稳定才会输出这个变化

2.常见soc设计为何把reset_release放在子系统来做?

        应该从两个方面来考虑,一个是逻辑设计和软件使用方面;另一个方面从reset网络的物理实现上考虑

    对于逻辑设计和软件来讲有几个方面:

  • release的时钟太多了,在系统级release就需要把所有的clk拉过去,有些clk甚至是子系统内部的时钟
  • 在reset同步的时候 一般会加上软件复位,系统级不方便加这么多软复位,软件也难控制,需要软件知道所有子系统甚至子IP的软件复位时序

    对于物理实现来说:

  • 把所有系统clk集中放在一个模块 就会有问题,时钟间相互干扰,timing都有问题
  • soc这么大的系统来说复位放在一个地方走线到各个复位寄存器也有问题【但本人并不能说明物理实现上的详细影响】

3.异步复位到底要不要时钟和时钟稳定有啥关系

        异步复位本身和时钟没有关系,而且没有时钟的时候,直接复位还没有recovery/remove的时序问题,那么为什么要做同步释放?

        首先没有时钟的时候,直接异步复位 确实不涉及recovery/remove的问题,但是总不能在复位的时候先把所有时钟关掉,解复位后再把所有时钟打开。另外解复位后再把时钟打开,时钟的稳定和传递都需要时间,在这个过程中寄存器有的正确采样了,有的没有正确采样,就会出现不定态。所以recovery/remove的问题还是要考虑的。

        另外异步复位也会导致DFF输出亚稳态,我们为什么不去考虑呢原因在于异步复位信号在复位时要有一定的宽度,保证所有寄存器都会被复位,这时中间产生了亚稳态也没有关系。所以复位脉冲宽度是要注意的。复位信号传输的时候一定要去毛刺。

   为何很多情况下复位流程是这样的【比如上电复位】:

  1. 要求先复位
  2. 然后打开时钟
  3. 等到时钟输出稳定在解复位

    这里面有几个考虑:

  • 首先即使先解复位,由于同步释放,实际复位也没有解除。没有时钟,复位同步电路输出也是不会变的
  • 先解复位,后打开时钟,时钟开启不论是门控时钟还是PLL时钟都需要一定的稳定时间,在不稳定的时候不能确认复位同步输出会不会有问题,而且时钟不稳定时候有些数字和模拟逻辑也会出现错误【就是上文提到的时钟稳定和传输都需要时间,如果不是所有寄存器都已经有了稳定的时钟,还是会出现不定态的传播】
  • 系统中还存在很多无复位寄存器,在复位时候打开时钟,这些无复位寄存器经过几拍时间也会稳定到一定状态
  • 考虑EDA仿真,会出现如果解复位之后 在打开clk的情形可能会直接报出寄存器的x态并传播导致后续仿真跑飞

        无复位寄存器有些是可以在有clk就可以翻转,复位有效时,经过几拍capture有复位寄存器的复位值就达到了稳定。有clk但受控制信号限制的无复位寄存器,在有了clk后虽然不能capture数据,但经过一段时间自身也会停留在稳定状态。

        有一个问题就是系统上电复位的时候PLL还没起来或者lock还需要一段时间,此时如何打开时钟呢? 有些做法就是在这段时间把PLL输出clk mux到晶振输出。

        是否一定在异步复位的时候要打开时钟?

        其实根据上面的描述,如果不打开时钟对功能没有影响也是可以不开时钟的。

一些观点来自下面论坛。

上电复位同步释放问题 - SOC讨论区 - EETOP 创芯网论坛 (原名:电子顶级开发网) -

4.异步桥,异步fifo该怎样复位

异步FIFO设计与使用

这篇资源中详细写了异步fifo的复位。对于复位或者flush/clear都有相似的要求。如果是对afifo及其相关的外围逻辑都进行复位的话是比较简单的,此时无论afifo是否是空状态,指针是否为0,大家一起复位就是没问题的。

关键在于有些时候 只要求复位afifo本身,下面给出了异步FIFO的flush/clear/reset的一些实现。这几个手段是通用的,但是一般情况下复位不会单独去做逻辑,所以都是靠flush/clear信号来完成的。

4.1 afifo flush/clear        

        可以考虑为 FIFO 提供单一的清空信号或独立的清空信号(push_flush、 pop_flush)。flush 信号的实现通常为置 FIFO 读写指针的值,使 FIFO 处于 EMPTY 状态下。由于 flush 操作的特殊性,我们通常是根据应用的实际情况考虑 flush 的实现,例如可以规定 flush 操作前后的一些动作。事实上,在实际应用中,当 需要发生 flush 操作时,经常可以满足某些条件,例如 flush 操作前若干个周期不 能有 push 或 pop 操作,flush 操作维持若干个周期等。

4.1.1 一种先从读时钟域flush的操作

        AFIFO 的 rflush 的实现仅仅是简单的将 rgnext 赋为 rwptr2 的值,从而可以在 下一个周期有效 empty 信号输出。然后,读指针将通过两级寄存后到达到写时钟 域,输出正确的写时钟域信号。应该注意的是,在 flush 过程中应该保证写时钟 域没有 push 操作,而且 flush 操作需要维持三个慢时钟周期,以确保信号正确的 传递到了写时钟域。代码如下:

if (rflush) rgnext = rwptr2; 
else rgnext = (rbnext>>1) ^ rbnext;
4.2 afifo 复位        

        可以考虑实现单一复位信号或独立复位信号。如果实现单一复位信号,则该 复位信号为 FIFO 控制器内部所有寄存器的异步复位信号,同时复位两个时钟域 的寄存器。由于复位信号为完全异步信号(不与任一时钟同步)或与其中一个时 钟同步,无论何种情况,当复位信号有效/无效时,至少有一个时钟域内的寄存 器可能产生 recovery/removal timing violation(即复位信号在该时钟上升沿附近变 化),由此可能产生复位时的不稳定状态。 因此,更合理的做法是分别为两个不同时钟域提供独立的复位信号或者在内部将某个时钟域的复位信号同步到另一个时钟域后再使用

4.2.1 先clr写时钟域

        有一种比较稳妥的做法是 只用一个clr信号输入,然后在另外一个clk domain输出一个clr_done表示clr完成。在这段时间内保证外围逻辑不去读写afifo。

  1. 输入wrclk的wr_clr信号
  2. 用wr_clr信号clr本时钟域逻辑,同时产生wr2rd_clr信号并同步至rd_clk
  3. rd_clk域检测到同步过来的clr信号开始clr
  4. wrclk检测到从rdclk同步过来的rd_ptr==0,说明rdclk已经完成clr,此时清除wr2rd_clr
  5. rdclk检测到wr2rd_clr的同步信号已经清零且wr_ptr==0 就认为afifo已全部clr完毕,输出clr_done信号

      上面过程最大的问题就是 第4步,因为有可能在clr之前同步过来的rd_prt就是0,这样情况下就会直接清除了wr2rd_clr, 此时wr2rd_clr可能还没有同步到rdclk,所以就会出问题。 

        下面的过程就是比较靠谱的流程:

  • wrclk产生wr_clr_pos,并保持clr状态,此时full=1
  • 用wr_clr_pos生成rd_clr_req同步到rdclk
  • 用同步过来的rd_clr_req产生rd_clr和rd_clr_hold信号
  • 将rd_clr_hold同步到wrclk,rd_clr_hold为1,说明rdclk已经clr完毕,且不在读,此时可以真正clr wrclk,同时可以拉低rd_clr_req
  • rdclk检查到rd_clr_req拉低,说明wrclk已经完成clr,并知道rdclk也完成clr,就可以拉低rd_clr_hold状态
  • wrclk检查到rd_clr_hold拉低,说明rdclk已经完成并释放clr,此时wrclk也可以释放wr_cr_hold

    

  • wrclk在产生wr_clr_pos,并保持clr状态,此时full=1
  • 用wr_clr_pos生成rd_clr_req同步到rdclk
  • 用同步过来的rd_clr_req产生rd_clr和rd_clr_hold信号
  • 将rd_clr_hold同步到wrclk,rd_clr_hold为1,说明rdclk已经clr完毕,且不在读,此时可以真正clr wrclk,同时可以拉低rd_clr_req
  • rdclk检查到rd_clr_req拉低,说明wrclk已经完成clr,并知道rdclk也完成clr,就可以拉低rd_clr_hold状态,此时可读但empty
  • wrclk检查到rd_clr_hold拉低,说明rdclk已经完成并释放clr,此时wrclk也可以释放wr_clr_hold

    综合起来就是需要保证先不能写,然后对端不能读之后同时clr 读,再高速wrclk clr写[clr写一定是在不能写也不能读的情况下],clr写完成了释放clr rd,clr rd释放后wr_clr_hold释放。
 

具体的代码实现可参考本人的另一篇文章     

     实际上从上面的描述来看clr信号是从wrclk输入还是rdclk输入,都可以完成clr操作。这一段描述明显要求不能再clr期间操作afifo

5.部分逻辑复位会不会影响外围逻辑

        这个其实就是典型的RDC问题。常见在总线模块对某些master逻辑复位,不能影响其他master的通路

        一般这种情况下会有一个reset保护电路,把边界信号clamp到不影响别的通路值。其实无论这个边界有没有做异步处理,都需要做clamp,因为这部分电路的复位会产生两个影响:

  • 毛刺
  • 不满足外围逻辑的setup/hold的信号翻转

6.RDC reset domain cross要做什么

        什么是reset domain cross?

        被reset_0_n(对应clk_0)复位的信号再被其他复位域 reset_1_n(对应clk_1)的寄存器capture的时候就会出现亚稳态的风险

  • 第一个问题就是RDC指的是被复位的信号corss不同的复位域,而不是复位信号本身。
  • 第二个问题因为reset_0_n是异步复位,所以复位assert的时刻相对于clk_0也好,clk_1也好都是随机的【注意这里不是指复位是随机的,而是复位时刻相对于时钟沿的位置是不确定的】,那么被异步复位的信号在被reset_1_n domain capture的时候就不一定能满足setup/hold约束,就会在reser_1_n(clk_1)域产生亚稳态
  • 第三个问题就是不同的reset domian可能是同一clk domian。但是即使同一个clk domain也会出现亚稳态。原因在于同一clk domian的一部分被异步复位,复位值会传到另外一部分还在工作的复位域中,这个复位时刻是不能保证capture FF的setup和hold的

        实际上同一时钟域的不同reset domain的cross问题比异步时钟域的reset cross问题还要严重,至少异步时钟域的reset cross问题还有同步寄存器可以降低一下亚稳态的传播。

        但无论是同步时钟域还是异步时钟域的reset cross都会给还在工作的逻辑电路带来影响,这里不仅仅是亚稳态的问题,还有复位值也可能影响还在工作的逻辑电路。所以解决这个问题其实和部分区域下电的处理类似。

        举个同步时钟域不同reset域的例子,我们希望复位其中一部分,另一部分不做复位。常见比如noc ,我们需要复位noc的某个master的NIU 工作在nocclk,这一部分需要和master子系统一起复位,noc上除了这个NIU,其他工作在nocclk上的逻辑不复位。

        这种情况的常见处理方式如下:

  • reset assert order---也就是通过控制reset的顺序能够解决很多问题
  • reset-clamp----复位钳位,在复位之前把cross的path输出钳位到需要的值,也就是isolation和不同power domain边界isolation作用一致
  • clk 隔离----就是把会受到影响的复位域的寄存器的clk关掉

具体可参考另外一篇文章:

RDC(reset domian cross)复位跨域-CSDN博客

掌握了CDC,你听说过RDC吗 - 极术社区 - 连接开发者与智能计算生态

7.异步复位树是什么样的结构

异步复位树是由一级一级的复位同步逻辑构成的,即每个层级都加上一个异步复位同步器。如下图所示:

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值