系列文章目录
第六章 时钟glitch检查
前言
之所以要进行时钟glitch检查,是因为实际工程中我们遇到这样的问题,有些时钟设计,比如在频率切换过程中,有的时钟设计并非无毛刺切换设计,但是这又是设计允许的,也有些设计虽然是无毛刺切换,但是切换过程中频率并不规整,但是频率也是可以接受的,这就导致前面章节中我们介绍的频率自动化检查的checker无法cover所有的需求,只能waive掉这些特殊的时钟,但是又担心waive掉后,系统运行过程中有可能漏掉一些不满足最小脉冲要求的情况,即我们常说的glitch。因此,这里我们新增了glitch检查,通过设定最小的min pulse值,让checker自动上报那些不满足脉宽要求的时刻,供验证人员分析。
其次,glitch的风险还是挺大的,首先在前仿真阶段,有些gltich我们还不一定能够发现,这些问题往往需要到了后仿阶段才有可能暴露出来,而一旦系统运行过程中,出现时钟glitch,将有可能带来不可预估的影响,比如timing不满足导致亚稳态等。因此,一个鲁棒性好的设计,一定要避免设计中出现glitch。
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是时钟glitch?
就是我们通常所说的毛刺,即脉冲宽度很小,举个例子,对于某一款工艺节点的DFF的CK端min pulse要求为0.2ns,当clk的最小脉冲宽度小于0.2ns时,DFF就会出现timing违例。包括低电平glitch以及高电平glitch,尤其对于时钟而言,DFF的CK端有最小脉宽要求,一旦不满足要求,即DFF的timing无法保证,将有可能输出不定态,导致亚稳态传播。
二、使用步骤
1.自动化checker代码如下
`define CLK_GLITCH_CHK(clk_sig,t_min,sign) \
begin \
real t_last, t_now, t_diff; \
t_last = 0.0; \
t_now = 0.0; \
begin \
while(1) begin\
@(chk_sig); \
t_now = $realtime; \
if(t_last >= 0) begin \
t_diff = t_now - t_last; \
if((t_diff >= 0) && (t_diff < t_min)) begin\
err_num ++;\
end \
end \
t_last = t_now;\
end \
end\
end\
2.算法解析
这部分算法的核心即在每个时钟的跳变沿,记录当前时刻,然后用后一个沿时间减去前一个沿时间,计算最小min pulse。
最后,我们可以在验证环境中调用该自动化checker,如下:
`CLK_GLITCH_CHK(clk_target, 0.1, "clk_target")
比如上述调用,我们需要对clk_target,检查其在系统运行过程中,任意时刻不能出现最小min pulse小于0.1ns的情况,一旦出现,就会自动向testbench中上报错误信息,方便验证人员进行debug。
总结
通过宏定义的方式对检查进行主体建模,然后在验证bench中对所有待检查的时钟进行扩展建模,很大程度上减少代码的复杂度,使代码通俗易懂,易维护。同时,通过这种自动化的glitch检查,可以检查出任意时刻,出现glitch时随时向testbench上报错误信息,大大提高验证效率。
进一步扩展,该checker不仅仅局限于时钟的验证,甚至可以扩展到任意signal,在实战中大家可以尽情尝试。