断言以验证信号中的毛刺
Assertion to verify a glitch in a signal
假设有信号a
。当信号变高时,它必须至少保持三个正时钟边沿的高电平。
我们可以把属性写成
property p;
@(posedge clk) $rose(a) -> a[*3];
endproperty
对于以下情况,属性 失败。
clk _ _ _ | = = = | _ _ _ | = = = | _ _ _ | = = = | _ _ _ | = = = |
一个 _ _ | = = = | _ _ | ==================
这不符合规范,其中 a 在中间变低但会被下一个姿势拉高,因此上述断言不会捕捉到这一点。
谁能告诉我是否有任何方法可以编写断言来捕捉这个错误?
谢谢
你在这里混淆了东西。通过在信号 a
上编写时钟断言,您可以验证它是一个具有特定行为的同步信号。
同步信号可以在时钟边沿之间出现所有它们想要的毛刺,因为它们永远不会在那里被采样。这正是我们现在使用同步信号的原因,即让信号有机会在我们采样之前稳定到它的值。
如果你的信号 a
不应该因为某种原因出现故障(我不是设计师所以我不知道这会有什么用),据我所知你会使用某种对 HDL 代码进行结构分析的 linting 工具(例如 Spyglass)找出这一点。
Tudor 是的,在大多数情况下,时钟边沿之间发生什么并不重要。但在 CDC 或异步设计中,我们必须验证设计是否无故障。
有一种由内而外的方法可以做到这一点。 (我在 http://www.verificationguild.com/modules.php?name=Forums&file=viewtopic&p=20045 找到了这个解决方案)
property detect_glitch;
time leading; // declare the last edge occurence variable
@(glitch) // At every change of glitch signal
//The following line saves the current time and check
// the delay from the previous edge.
(1, leading = $time) |=> (($time - leading) >= duration);
endproperty : detect_glitch
DETECT_GLITCH : assert property (detect_glitch)
else
$display ("ERROR");
假设有信号a
。当信号变高时,它必须至少保持三个正时钟边沿的高电平。
我们可以把属性写成
property p;
@(posedge clk) $rose(a) -> a[*3];
endproperty
对于以下情况,属性 失败。
clk _ _ _ | = = = | _ _ _ | = = = | _ _ _ | = = = | _ _ _ | = = = |
一个 _ _ | = = = | _ _ | ==================
这不符合规范,其中 a 在中间变低但会被下一个姿势拉高,因此上述断言不会捕捉到这一点。
谁能告诉我是否有任何方法可以编写断言来捕捉这个错误?
谢谢
你在这里混淆了东西。通过在信号 a
上编写时钟断言,您可以验证它是一个具有特定行为的同步信号。
同步信号可以在时钟边沿之间出现所有它们想要的毛刺,因为它们永远不会在那里被采样。这正是我们现在使用同步信号的原因,即让信号有机会在我们采样之前稳定到它的值。
如果你的信号 a
不应该因为某种原因出现故障(我不是设计师所以我不知道这会有什么用),据我所知你会使用某种对 HDL 代码进行结构分析的 linting 工具(例如 Spyglass)找出这一点。
Tudor 是的,在大多数情况下,时钟边沿之间发生什么并不重要。但在 CDC 或异步设计中,我们必须验证设计是否无故障。 有一种由内而外的方法可以做到这一点。 (我在 http://www.verificationguild.com/modules.php?name=Forums&file=viewtopic&p=20045 找到了这个解决方案)
property detect_glitch;
time leading; // declare the last edge occurence variable
@(glitch) // At every change of glitch signal
//The following line saves the current time and check
// the delay from the previous edge.
(1, leading = $time) |=> (($time - leading) >= duration);
endproperty : detect_glitch
DETECT_GLITCH : assert property (detect_glitch)
else
$display ("ERROR");