【问题标题】:zero delay signal event sequence check零延迟信号事件序列检查
【发布时间】:2020-05-14 19:33:57
【问题描述】:

假设我要检查这两个信号的变化顺序:sigAsigB。 设计规范是sigB必须比sigA更早改变(B先变后A变)

这里假设我已经简化了 RTL,它对上述规范有一个错误。

// buggy RTL
sigB = ~sigA;

在此代码中,sigBsigA 之后由于逆变器延迟而发生变化。

但在 RTL 中,通常我们可能无法注意到问题 - 因为它是一种零延迟事件。 我们只能在门级模拟中实现它,延迟出乎意料地sigB实际上比sigA稍晚改变。

我正在寻找一种使用 SVA 或其他可以在 RTL 仿真期间检测到此问题的方法,而不是在门级仿真期间检测到它(这为时已晚)。

【问题讨论】:

  • 您需要更多信息。假设没有错误,所以sigBsigA 之前按指定更改。因此,您的更改将像这样运行:sigB change ... sigA change --- sigB change ... sigA change。在中间我们有sigA change --- sigB change。所以,sigBsigA 之前发生了变化,而且sigAsigB 之前也发生了变化。

标签: verilog system-verilog system-verilog-assertions


【解决方案1】:

Verilog 是一个事件驱动的模拟器。它将根据基本调度块的输入/输出来调度执行:alwaysassign

在 rtl 模拟中,事件序列由always 块的敏感度列表或assign 语句的“输入”定义。因此,以下行为将如您所愿:

assign sigB = ~sigA;

always @(sigA)
   sibB = ~sigA;

如果你在always块的敏感列表中错过了'sigA',就会出现问题:

always @(sigC) 
   sibB = ~sigA;

出于这个原因,veilog 2K 提出了always @* 语句,它不需要您在敏感度列表中列出所有信号。因此,以下内容也可以正常工作:

always @(*)
   sibB = ~sigA;

在模拟滴答结束时,由于零延迟事件驱动模拟中的事件顺序,所有变量的值将与硬件中的值相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多