7.1 $ onehot,$ onehot0
图7.1 $ onehot和$ onehot0
$ onehot和$ onehot0相当自我解释,在图7.1中进行了解释。请注意,如果表达式为'Z'或'X',$ onehot或$ onehot0将失败。图7.1描述了一个简单的应用。对于任何一个总线grant的确认,只能有一个总线grant。如图所示,这很容易通过$ onehot完成。
7.2 $ isunknown
图7.2 $ isunknown
如果表达式未知('X'或'Z'),$ isuncnown则通过。换句话说,如果表达式不是未知的,那么属性将失败!因此,如果您确实希望检测到未知('X'或'Z')失败,则必须否定$isunknown的结果。简单但容易错过。
图7.2中的仿真日志阐明了这个概念。属性'ucheck'指出,如果'bgack'是'真实','busgnt'是未知的。什么?这只是为了展示如果使用$ isunknown而不是'not'会发生什么。
7.2.1应用$ isunknown
图7.3 $ isunknown应用
图7.3显示了两个简单的应用。首先与我们刚讨论过的一样,但是有一个“not”。
@(posedge clk) bgack |-> not ($isunknown(busgnt));它说,如果bgack是真的(高),那么busgnt一定不会处于未知状态。 再次注意,$ isunknown在检测未知时返回true。 所以,如果你想要失败,你必须否定结果。 这在上面的仿真日志中显示。 第二个应用(图7.3的底部)说,如果'adrStrobe'为高电平,那么控制信号不可能是未知的。
7.3 $ countones
图7.4 $ countones-基础和应用
$countones非常简单但功能强大。请注意,系统函数可用于过程块以及并发属性/断言中。
图7.4显示了一个应用程序,该应用程序声明,如果总线授权确认(bgack)在总线上只能激活1个总线授权(busgnt)。请注意,在本例中我们在程序块中使用$ countones。还要注意,如果整个'busgnt'未知('X')或三态('Z'),断言将失败。图7.5显示了检查格雷码合法性的一种非常简单的方法。
图7.5 $countones应用
7.3.1 $countones(作为布尔值)
图7.6 $countones作为布尔值
7.4 $ assertoff,$ asserton,$ assertkill
在许多情况下,如果您希望实现在模块和实例级别的断言的全局控制。回想一下,'disable iff'直接在断言的源头提供本地控制。如图7.7所示,$ assertoff暂时关闭所有断言的执行。请注意,如果在执行$ assertoff时断言正在执行,断言不会被终止。在随后的$ asserton调用中重新启动断言执行。 $ assertkill将会终止你设计中的所有断言,包括已经执行的断言。当下一个断言开始执行时它不会自动启动。它只会在随后的$ asserton中开始执行。 $ asserton:这是默认值。需要在$ assertoff或$ assertkill之后重新启动断言。
图7.7$ assertoff,$ asserton,$assertkill-基础
以下是项目部署的典型应用程序,用于在复位期间或异常期间控制断言的执行(如果需要)(图7.8)。
图7.8断言控制应用程序