#SVA语法滴水穿石# (013)关于内建系统函数
 SystemVerilog 断言(SVA)中 内建系统函数 $onehot、$onehot0、$isunknown 和 $countones 。
1. $onehot(expression)
 
功能与定义
-  作用:检查表达式在指定时钟沿是否 只有 1 位为高电平(1),其他位必须为低电平(0)。 -  若表达式为多热码(multiple-hot)或全零,返回 0(断言失败)。
 
-  
-  语法: $onehot(signal)
示例与波形
property check_onehot;@(posedge clk) valid |-> $onehot(ctrl_bus); // ctrl_bus 必须为独热码
endpropertyassert property (check_onehot);波形分析:
周期: 0   1   2   3
ctrl_bus: 0010  0100  1000  0011
valid  : 1      1      1      1-  周期 0-2: ctrl_bus仅有一位为高 → 断言通过。
-  周期 3: ctrl_bus为0011(两位为高)→ 断言失败。
2. $onehot0(expression)
 
功能与定义
-  作用:检查表达式在指定时钟沿是否 最多 1 位为高电平(1),允许全零。 -  若表达式为多热码(multiple-hot),返回 0。
 
-  
-  语法: $onehot0(signal)
示例与波形
property check_onehot0;@(posedge clk) valid |-> $onehot0(ctrl_bus); // ctrl_bus 可为全零或独热码
endpropertyassert property (check_onehot0);波形分析:
周期: 0   1   2   3
ctrl_bus: 0000  0010  1000  0011
valid  : 1      1      1      1-  周期 0: ctrl_bus全零 → 断言通过。
-  周期 1-2: ctrl_bus仅有一位为高 → 断言通过。
-  周期 3: ctrl_bus为0011→ 断言失败。
3. $isunknown(expression)
 
功能与定义
-  作用:检查表达式中 是否存在未知值(X 或 Z)。 -  若有任意位为 X/Z,返回 1(断言失败);否则返回0。
 
-  
-  语法: $isunknown(signal)
示例与波形
property check_unknown;@(posedge clk) valid |-> !$isunknown(data_bus); // data_bus 不得有 X/Z 值
endpropertyassert property (check_unknown);波形分析:
周期: 0   1   2   3
data_bus: 8'hA5  8'hX1  8'hFF  8'hZZ
valid  : 1      1      1      1-  周期 0,2: data_bus无 X/Z → 断言通过。
-  周期 1,3: data_bus存在 X/Z → 断言失败。
4. $countones(expression)
 
功能与定义
-  作用:计算表达式中 为高电平(1)的位数,返回无符号整数。 -  常用于动态检查有效信号的数量。 
 
-  
-  语法: $countones(signal)
示例与波形
property check_countones;@(posedge clk) valid |-> ($countones(enable_bus) <= 2); // enable_bus 最多 2 位为高
endpropertyassert property (check_countones);波形分析:
周期: 0   1   2   3
enable_bus: 0011  0101  1000  1110
valid    : 1      1      1      1-  周期 0:2 位为高 → 断言通过。 
-  周期 1:2 位为高 → 断言通过。 
-  周期 2:1 位为高 → 断言通过。 
-  周期 3:3 位为高 → 断言失败。 
5. 对比总结
| 函数 | 功能 | 返回值 | 典型应用场景 | 
|---|---|---|---|
| $onehot | 检查独热码(仅 1 位为高) | 1(真)/0(假) | 仲裁器、多路选择器控制信号 | 
| $onehot0 | 检查零或独热码 | 1(真)/0(假) | 可屏蔽中断信号、低功耗模式 | 
| $isunknown | 检测 X/Z 值 | 1(存在 X/Z) | 总线稳定性检查、仿真 X 传播防护 | 
| $countones | 统计高电平位数 | 无符号整数 | 并行资源管理、冗余设计检查 | 
