文章目录
- 同步方法
- 哪些信号需要同步
- 常用同步方法
- Rules
- AC_unsync01/02
- AC_sync01/02
- AC_conv01/02/03
- AC_glitch03
- Clock_sync05/06
- setup_quasi_static
CDC_verify_struct过程主要检查设计中是否有未同步的信号,是否有毛刺。在多时钟设计中,要考虑哪些信号需要同步?用什么同步方法?如果处理不当,则会在设计中引入亚稳态或者数据丢失。亚稳态产生的根本原因是建立时间或保持时间不够。本文先简单介绍CDC常用同步方法,再介绍CDC_verify_struct中的rules。
同步方法
note: 本节相位差单位为纳秒
哪些信号需要同步
时钟有效跳变沿的相位差是固定的,称为同步时钟。如下图clk1和clk2,虽然两者频率不一样,但有效边沿(上升沿)之间的相位差固定为T, 2T, 3T,因此可称为同步时钟。
无法判定两个时钟有效边沿相位差,称为异步时钟。不同DPLL或晶振的时钟一定是异步时钟。信号跨异步时钟传输时如果不做同步处理,很容易引起亚稳态和数据丢失。如下图所示。
同一个DPLL或晶振的时钟称为同源时钟。同源时钟根据频率和相位可以分为:
- 同频零相位差时钟
- 同频恒定相位差时钟
- 非同频可变相位差时钟,包括整数倍时钟和分数倍时钟。
只要设计中的时钟不都是同频零相位差,就要考虑信号传输时是否会引入亚稳态,是否有数据丢失。
常用同步方法
跨时钟域传输的信号可以分为两类:
- 控制信号的传输(通常为单bit),常用二级同步器。
- 数据信号的传输(通常为多bit),常用握手信号,异步FIFO方法。
图片来源:Verilog基础知识(亚稳态和跨时钟域的同步电路)
Rules
AC_unsync01/02
报告跨时钟传输中未同步的信号。如果此项违例,应检查:
- 如果源寄存器和目的寄存器都在同一个IP模块中,使用ip_block约束此模块;
- 如果源寄存器或目的寄存器在black_box中,使用abstract_port或assume_path约束black_box端口;
- 如果源寄存器是个静态信号,使用quasi_static对源寄存器进行约束;
- 如果源寄存器是控制信号,检查信号是否通过一个有效同步器(qualifier);
- 如果源寄存器是数据信号,检查是否使用异步FIFO或握手信号;
AC_sync01/02
报告设计中已经同步的信号。这项规则只是报告信息,不会报告违例。
AC_conv01/02/03
报告设计中的聚合问题。聚合问题有可能会引起数据一致性(data coherency)问题,即同步前的数据与同步后的数据不一致。
AC_conv01规则报告信号经过同步器+寄存器后聚合违例:
-
不同信号经过同步器后又经过不同数量的寄存器,最终在同一个逻辑门处聚合
在上面例子中,第一根信号经过二级同步器后经过一个寄存器,第二个信号经过二级同步器后经过两个寄存器。这两个信号最终在同一个逻辑门处聚合。为什么这样会有问题?假设两个信号在clk1时钟域有00->11的跳变,那么经过clk2时钟域的一堆寄存器后,在逻辑门处看到信号会有00->10->11的跳变,显然这样是不行的。如果确保两根信号不会同时跳变,就没有问题,例如00->01或00->10的跳变就不会有问题。 -
同一个信号经过多个同步器后又经过不同数量的寄存器,最终在同一个逻辑门处聚合。这种情况与上述情况类似。
-
特殊情况下不会报违例:两个信号由同一个控制信号控制
如果spyglass报出违例,但通过检查发现设计没有问题,可使用 cdc_false_path , quasi_static, cdc_filter_conherency等命令约束。
AC_conv02规则报告信号经过同步器后聚合违例,且聚合后又通过寄存器:
- 报告不同信号经过同步器后在同一个逻辑门处聚合问题
注意这里报告违例的地方与AC_conv01不同,仔细看两张图。一个是在寄存器之后聚合,一个是在寄存器之前聚合。这里为什么会出问题?假设clk1时钟与信号有011->100跳变,由于各个路径延时不同,经过同步器后可能会产生011->110->100等奇怪的跳变。如果这个信号是个计数器,那么这样同步肯定有问题。解决办法就是使用格雷码编码,在同步之前,先将二进制编码转换成格雷码,再经过同步器。可以参考异步FIFO中的格雷码指针同步。
上述例子中,sync[0:3]是使用格雷码同步的信号,sync_1是经过二级同步器同步的信号,它们在同一个逻辑门处聚合,spyglass会报出这里违例。如果确定sync_1与sync[0:3]信号没有关系,即这样的设计没有问题,可使用如下约束脚本
cdc_filter_coherenct -unrelated sync[0:3] sync_1
gray_signals -nam sync[0:3]
- 报告同一个信号经过多个同步器后在同一个逻辑门处聚合问题
AC_conv03规则检查不同时钟域信号经过同一个时钟域同步器后聚合问题。
AC_glitch03
报告设计中的毛刺。
竞争: 组合逻辑电路中,同一信号经不同的路径传输后,到达电路中某一会合点的时间有先有后(每条途径的组合逻辑污染延时不同),这种现象称为逻辑竞争,而因此产生输出干扰脉冲的现象称为冒险。
冒险: 信号在器件内部通过连线和逻辑单元时,都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为"毛刺"。如果一个组合逻辑电路中有"毛刺"出现,就说明该电路存在冒险。
毛刺: 数字电路中常将毛刺定义为采样间越过逻辑门限一次以上的任何跳变,主要是指电路输出波形中含有时间很短有规律或没有规律的脉冲而又对设计没有用处或产生其他影响,一般都要考虑去除毛刺。
脉冲: 在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号,在单位时间内所产生的脉冲个数就称为频率。例如手电筒打开灯亮,这是直流,不停的开关灯亮、熄,就形成了脉冲,开关速度的快慢也就是脉冲频率的高低。
The reason for 竞争冒险: 数字电路中的竞争与冒险出现在组合逻辑电路中。由于延迟时间的存在,当一个输入信号经过多条路径传送后又重新会合到某个门上,由于不同路径上门的级数不同,或者门电路延迟时间的差异,导致到达会合点的时间有先有后,从而产生瞬间的错误输出。
The judgement for 竞争冒险: 只要输出端的逻辑函数在一定的条件下能简化成 Y = A + A’ 或者 Y = A·A’,那么就可以判断存在竞争-冒险现象。
The resolve of 竞争冒险: 接入滤波电容、引入选通脉冲、修改逻辑设计等等。
转载于:https://www.cnblogs.com/PG13/p/10329675.html
在下图设计中,D0与I1信号达到与门时间不同,C0处容易输出毛刺,如果该毛刺恰好被CLK2时钟域的寄存器采到,则设计容易出错。应将CLK1的组合逻辑修改成寄存器输出。
Clock_sync05/06
Clock_sync05报告输入信号被多个时钟域下寄存器采样,如下图中,输入信号在clka和clkb中被采样。
Clock_sync06报告输出信号由多个时钟域信号组合而成。
若确保设计没有问题,可使用set_case_analysis或quasi_static命令加强对输入信号的约束。
setup_quasi_static
准静态寄存器是指设计中的输入信号、寄存器、线网在芯片工作开始时改变,但在接下来的工作中保持为0或1。
setup_quasi_static报告设计中spyglass推断出的准静态寄存器和约束脚本约束的静态寄存器。应仔细检查信号是否满足准静态寄存器的定义。如果信号被spyglass错误推断为准静态寄存器,那么当芯片工作时,该信号变化可能会引起功能出错。