• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

SOC/IP验证工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

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) &#124;-> $onehot(grant)
$changed(expression) 返回布尔值。当表达式在当前时钟沿的值与上一个时钟沿相比发生了任何变化时,返回真。 触发对输入信号变化的监测。 $changed(data)

总结

SVA 的这些内置函数是进行高效、精确验证的关键工具。建议根据具体的检查需求选择合适的函数,例如,检查独热码状态机时,优先使用语义明确的 $onehot 而非通过 $countones(vec) == 1 来实现,这不仅能提高代码的可读性,也有助于验证工具进行优化和错误定位 。

你还想了解这些函数在属性或序列中如何结合 ## 操作符来构建更复杂的时序检查吗?

posted on 2026-03-01 18:13  SOC验证工程师  阅读(0)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3