如何自动检测毛刺 ?
以前写过这个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,个人感觉下面这么写好一些:
- realtime change_t;
- initial begin
- change_t = 0;
- while(1)begin
- @glitch;
- if($realtime - change_t < duration)
- $display($time," ERROR: glitch deteced!");
- change_t = $realtime;
- end
- end
assertion是不错的方法。
这个前端保证有什么用,你有时序吗?这个需要在后边用STA来保证,类似于门控时钟的hold/setup来保证,前端只要保证你design的正确性,当然你可以用route之后的sdf反标回来进行后仿,应该可能会在波形上看到毛刺。可以加断言。
“这个需要在后边用STA来保证,类似于门控时钟的hold/setup来保证”
请问怎样在后端是怎样保证没有毛刺的?请举例讲讲,先谢谢了!