第14章 异步断言!!!

 

                                                     图14.1异步断言-问题陈述

 到目前为止,在本书中,我们总是使用同步时钟边作为断言的采样边沿。这是有原因的。这里介绍的例子使用异步边缘(完全合法)作为采样边缘。问题陈述就会变成''每当(即异步)L2TxData == L2ErrorData, L2Abort被断言'。现在看起来非常合乎逻辑,无需使用时钟。所以,我们写一个属性如图14.1所示。我们简单地说@(L2TxData)(即每当L2TxData改变时)我们比较L2TxData == L2ErrorData,如果匹配,我们推导L2Abort == 1。

 

                                                        图14.1(续)

这听起来非常合乎逻辑。它有什么问题?嗯...很多东西。图14.1中的注释系统地告诉你发生了什么。请仔细研究它,看看为什么有问题。我们不会再重复这个图的解释。但这是关于这个问题的高层次提示。“采样边沿”(即@(L2TxData))也用于比较表达式。由于表达式中变量的值总是在推定区域中计算,因此表达式中的L2TxData值不会与@(L2TxData)更改时相同。如果这听起来令人困惑,那好吧。这就是我不推荐使用异步断言的原因。


                                             图14.2异步断言 - 问题陈述分析继续

 我们继续图14.2中的分析。注释解释受挫折的原因!

为了避免我们刚刚在图14.3中描述的问题,我们可以(不幸地)继续异步采样边沿,只是我们把所有比较表达式/变量作为异步采样边沿的一部分。解决方案1显示了这一点,这将解决我们首次遇到的问题。仔细想想,你会明白为什么。

为什么我们在解决方案2中分配了#1?这样当L2TxData或L2Error DataW或L2ABortW发生变化时,会有一个单位时间的延迟,这会使新值稳定下来,因为您需要检查(L2TxData == L2ErrorData)。

这是一个(令人费解的)方式来绕过这些变量在预测区域的检查。如果所有这些看起来令人困惑,不要被吓倒。我强烈建议您不要将异步边缘用作采样边缘。再次,如果您对使用它们感到满意,请这样做,但要小心。请参考上面的示例来帮助您了解异步采样边缘的行为。请注意,我已经用异步断言显示了所有三种解决方案(非常反对它!)。你如何将这个模型作为同步断言来建模?请尝试看看你是否成功。假设'posedge clk'作为你的采样边缘。

 

                                                图14.3异步断言-解决方案

 解决方案3使用程序块来确定您何时执行检查。请注意,我没有在这个解决方案中使用断言。有的时候,简单地使用Verilog会更好,并且会更直观,并提供您期望的结果。我推荐使用纯粹的Verilog进行异步断言描述,对于所有其他类型的断言用SVA。

猜你喜欢

转载自blog.csdn.net/zhajio/article/details/80242880