微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 微电子和IC设计 > IC验证交流 > 如何自动检测毛刺 ?

如何自动检测毛刺 ?

时间:10-02 整理:3721RD 点击:
不知道大家在验证中如何检测毛刺的?比如,一个clock分频电路,我需要检查在频率切换时是否有毛刺出现,我一般是肉眼去查看,不知道大家如何实现自动检查的?

以前写过这个checker,但是会导致仿真变慢,我当是依据的原理就是循环的检测两沿之间的时间差,和你能够容忍的最小时间差做比较,当是感觉这个checker不是太好用,也没有想过有没有更好的办法

毛刺通常在切换的时候有,你可以监控切换配置的控制脚,然后log,断言或其他方法检查一小段时间即可,这样减少负重。

我也这么干过,不是很好的办法。不知道那位大神有好的办法?

这个是要靠设计来保证的,不能靠调试来找毛刺。
如果说一定要找个方法,那么你可以做个计数器,对时钟计数,直接看计数值是不是连续比拿眼睛看毛刺靠谱。
如果想做到自动化, 可以再用一个高倍快速时钟去采样,看看同一计数值持续的时间是不是达标, 有不达标的情况就是有毛刺了。

如果加入一个高倍时钟采样要检测的时钟,这会让仿真的负荷加重吧?

加高倍时钟的话,光这个频率的选择就是个很头疼的事,比如1GHz的clcok,再弄个几G的clcok,估计仿真就没法仿了。

这个主意还不错~缺点是,需要事先判断毛刺可能出现的位置,这样有可能判断不是那么全面。
感觉systemverilog应该增加一个自动统计高低电平持续周期的内部函数。通过输出的周期大小与期望值做个比较。

用 systemverilog 的 assertion
property detect_glitch;
time leading;
@(posedge glitch)
(1, leading = $time) |=> (($time - leading) >= duration);
endproperty : detect_glitch
DETECT_GLITCH : assert property (detect_glitch)
else
$display ("ERROR");

这个不错!thanks

学习了

建议提前半个周期切换。

你这种只是检查两个上升沿之间的时间间隔,只是检查高电平的glitch,对于低电平的glitch是查不出来的。
是不是最好去掉前面的posedge?

$width

这个task基本上能满足要求,但是有个局限性:如果是0 delay的glitch,那么$width不会报violation。

这种写法也无法检查出0 delay的glitch,个人感觉下面这么写好一些:

  1. realtime change_t;

  2. initial begin
  3. change_t = 0;
  4. while(1)begin
  5. @glitch;
  6. if($realtime - change_t < duration)
  7. $display($time," ERROR: glitch deteced!");
  8. change_t = $realtime;
  9. end
  10. end

复制代码

assertion是不错的方法。

这个前端保证有什么用,你有时序吗?这个需要在后边用STA来保证,类似于门控时钟的hold/setup来保证,前端只要保证你design的正确性,当然你可以用route之后的sdf反标回来进行后仿,应该可能会在波形上看到毛刺。可以加断言。

“这个需要在后边用STA来保证,类似于门控时钟的hold/setup来保证”
请问怎样在后端是怎样保证没有毛刺的?请举例讲讲,先谢谢了!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top