SVA中内置函数的用法
在SystemVerilog Assertion (SVA) 中,内置函数极大地增强了断言对设计行为的检查能力。这些函数可以大致分为几类:边沿检测、数值检查、位计数和历史值访问。
下面是 SVA 中主要内置函数的详细介绍和用法。
边沿检测函数
这类函数用于检测信号值在时钟边沿的变化情况 。
| 函数 | 描述 | 典型应用场景 | 示例 |
|---|---|---|---|
$rose(expression) |
返回布尔值。当表达式的最低位在当前时钟沿为1,且在上一个时钟沿为0时,返回真 。 |
检测请求信号(req)的上升启动沿。 | @(posedge clk) $rose(req) |
$fell(expression) |
返回布尔值。当表达式的最低位在当前时钟沿为0,且在上一个时钟沿为1时,返回真 。 |
检测应答信号(ack)的下降结束沿。 | @(posedge clk) $fell(ack) |
$stable(expression) |
返回布尔值。当表达式的值在当前时钟沿与上一个时钟沿相比没有发生变化时,返回真 。 | 检查控制信号(如地址线)在锁存周期内是否保持稳定。 | @(posedge clk) $stable(addr) |
数值检查函数
这类函数用于检查向量的特定位模式,特别适合状态机检查 。
| 函数 | 描述 | 典型应用场景 | 示例 |
|---|---|---|---|
$onehot(expression) |
返回布尔值。检查向量的位是否为独热码,即有且仅有一位为 1。 |
检查采用独热码编码的状态寄存器是否出现非法值。 | $onehot(state_reg) |
$onehot0(expression) |
返回布尔值。检查向量是否至多只有一位为 1,即允许全 0 或独热码。 |
检查允许空闲状态(全0)的独热码状态机。 | $onehot0(state_reg) |
$isunknown(expression) |
返回布尔值。检查表达式的任何位是否为 X 或 Z。 |
检查关键控制信号是否在复位完成后仍然存在未知态。 | !$isunknown(valid_signal) |
位计数函数
这类函数用于对向量进行统计,返回的是数值而非布尔值 。
| 函数 | 描述 | 典型应用场景 | 示例 |
|---|---|---|---|
$countones(expression) |
返回一个整数值,表示向量中值为 1 的位的个数。不统计 X 和 Z。 |
检查并发请求的数量是否超过上限。 | $countones(req) <= 3 |
$countbits(expression, list_of_control_bits) |
返回一个整数值,统计表达式中匹配指定值(0、1、x、z)的位数。 |
精细地统计信号中处于高阻或未知态的位数。 | $countbits(bus, '1, '0) //统计0或1的位数 $countbits(bus, 'x, 'z) //统计高阻或未知的位数 |
历史值与改变检测函数
这类函数提供了跨时钟周期的信号访问能力 。
| 函数 | 描述 | 典型应用场景 | 示例 |
|---|---|---|---|
$past(expression [, num_cycles]) |
返回一个值,即表达式在之前指定时钟周期的值。默认 num_cycles 为 1。 |
在状态跳转后,检查跳转前的条件是否与预期一致。 | ($past(state) == IDLE) |-> $onehot(grant) |
$changed(expression) |
返回布尔值。当表达式在当前时钟沿的值与上一个时钟沿相比发生了任何变化时,返回真。 | 触发对输入信号变化的监测。 | $changed(data) |
总结
SVA 的这些内置函数是进行高效、精确验证的关键工具。建议根据具体的检查需求选择合适的函数,例如,检查独热码状态机时,优先使用语义明确的 $onehot 而非通过 $countones(vec) == 1 来实现,这不仅能提高代码的可读性,也有助于验证工具进行优化和错误定位 。
你还想了解这些函数在属性或序列中如何结合 ## 操作符来构建更复杂的时序检查吗?
浙公网安备 33010602011771号