第3章 立即断言

立即断言是简单的非时域断言,它们像程序块中的语句那样执行。将它们解释为类似“if”条件语句下表达式。只有在指定程序语句的情况下才可以使用立即断言。

 图3.1描述了立即断言的基础知识。这是所谓的,因为它在程序执行到这个程序块时立即执行。它不会等待'下一个时钟边缘'自行启动。断言之前可以使用电平敏感或边沿敏感的语句。正如我们将看到的那样,断言只能在'采样/时钟边沿'敏感逻辑而不是电平敏感逻辑上工作。

 

                                             图3.1 立即断言:基础

 我们在图3.1中看到,在由@(posedgeclk)触发的程序块中嵌入了立即断言。立即断言在@(posedged)后触发并检查(b || c)是否为真。

 我们需要在这里注意几点。首先,这个例子中前面的语句是@(posedge d),一个边沿敏感语句。但是,它不一定是。它也可以是一个电平敏感的语句或任何其他程序语句。我指出这一点的原因是并发断言只能工作在采样“边缘”,而不能脱离电平敏感控制。将它放在后面的口袋里,因为当我们覆盖后面的断言时,有必要将立即断言与并发断言区分开来。其次,断言本身不能有时域序列。换句话说,立即断言不能消耗'时间'。它只能是零组合,可以在零时间执行。换句话说,断言将被计算并且结果将在断言被触发的同时可用。如果'assert'语句的计算结果为0,X,Z,则断言将被认为是FAIL,否则将被认为是PASS。

 我们还在图中看到,存在(称为)与断言的FAIL或PASS相关的动作块。这与我们用来设计‘if..else’语句的PASS / FAIL逻辑没有什么不同。

 从语法的角度来看,立即声明只使用“assert”作为关键字,而不是需要“assert property”的并发声明。

 即时断言和并发断言之间的一个主要区别是并发断言总是在仿真时间刻度的推定区域(preponed region)中的采样值上运行,而立即断言在执行时立即工作(如程序块中的任何组合表达式)并且不评估其在推定区域的表达。现在将这种想法保留在你的后面的口袋里,因为我们还没有看到并发断言以及如何在仿真时间刻度中评估断言。但是当你更多地了解并发断言时,这个关键的区别将变得很重要。

 最后,正如我们上面所讨论的那样,立即断言对组合表达式起作用,其变量在评估表达式时立即被评估。这些变量可以在给定的仿真时间刻度内从一个逻辑值转换到另一个逻辑值(例如1到0到1),并且立即断言在表达式变量值“稳定”下来之前可以被多次评估。这就是为什么直接断言也被称为“毛刺”的原因。

 要完成这个故事,有三种立即断言。

immediate assert

immediate assume

immediate cover

'assume'和'cover'现在讨论为时尚早。我们将这些作为并发断言的一部分来讨论。最有用的是我们在这里讨论过的'立即断言'。

                                         图3.2 立即断言:更细的点

 图3.2指出了一些更好的点。首先,不要在即时断言的所谓动作块(PASS或FAIL)中放置任何东西。大多数综合工具都会忽略整个动作块的立即断言(这是有道理的),并且它会根据你的逻辑(如果)计划放入设计中。这很明显,但很容易错过。

 请注意,立即断言不能用于连续赋值语句,因为连续赋值不是程序块。最后,请注意,IEEE-1800 2009 LRM还定义了另一种类型的立即断言,称为延迟断言(DeferredAssertion)。我们将在单独致力于断言的IEEE-1800 2009特性的章节中讨论延迟断言。

猜你喜欢

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