蕴含操作符
- 蕴含相当于一个if-then结构。
- 蕴含的左边叫作“先行算子”(antecedent),右边叫作“后续算子”(consequent)。
- 先行算子时约束条件。当先行算子成功时,后续算子才会被计算。
- 如果先行算子不成功,那么整个属性就默认地被认为成功。这叫作“空成功”(vacuous success)
- 蕴含可以分为两类:交叠蕴含和非交叠蕴含
交叠蕴含
- 交叠蕴含用符号 “|->”来表示。
实例:属性p8检查在时钟上升沿时信号a是否为高电平,若是则检查b是否为高电平,若是则断言成功。
仿真结果:
值得注意的是:若先行算子a=0时,视为空成功。在最新verdi版本里不显示向上箭头。
非交叠蕴含
- 非交叠蕴含用符号“|=>”来表示。
- 如果先行算子匹配那么在下一个时钟周期计算后续算子的表达式,有1个时钟周期的延时。
实例:属性p9检查在时钟上升沿时信号a是否为高电平,若是则1个时钟周期后检查b是否为高电平,若是则断言成功。
仿真结果:
后续算子带固定延时的蕴含
- 可以自定义后续算子时间延迟,使用##符号
实例:属性p10检查在时钟上升沿时信号a是否为高电平,若是则2个时钟周期后检查b是否为高电平,若是则断言成功。
仿真结果:
算子为序列的蕴含
实例:序列s11a检查信号a、b都为高电平时,1个时钟周期后检查信号c是否为高电平。序列s11b检查当前时钟上升沿的2个时钟周期后,信号b是否为低电平。属性p11检查序列s11a是否为真,若是则检查序列s11b是否为真,若是则断言成功。
仿真结果:
SVA检验器的时序窗口
- 前面的例子中,所带延迟使用的都是固定的正延迟。
- SVA允许使用时序窗口来匹配后续算子。简单说就是后续算子只要在一个自定义的时序窗口内被检查为真时即视为断言成功。
- 时序窗口表达式左侧的值必须小于右侧的值。左侧的值可以是0。
实例:属性p12检查“a && b “在时钟上升沿是否为真,若是则在接下来的1~3时钟周内,检查信号c是否至少在1个时钟周期为高,若是则断言成功。
仿真结果:
在每声明一个时序窗口时,就会在每个时钟沿上触发多个线程来检查所有可能的成功。
属性p12实际按以下三个线程展开:
属性p12有三个成功机会。所有三个线程具有相同的起始点,一旦一个成功的线程将使整个属性成功。
重叠的时序窗口
实例:属性p13与属性p12的区别是 p13的后续算子在先行算子成功的同一个时钟沿开始计算。
仿真结果:
无限的时序窗口
- 时序窗口的上限可以用符号“$”定义,也就是代表时序没有上限。
- 这叫作“可能性”(eventuality)运算符。检验器不停地检查表达式是否成功直到模拟仿真结束。
实例:属性p14检查在时钟上升沿时信号a是否为高,若是则检查信号b是否从下一个周期开始到最终将为高,若是则检查信号c在信号b为高的时钟周期开始到最终是否为高,若是则断言成功。
仿真结果:
注意,使用无限的时序窗口会对模拟的性能产生较大的负面影响,因此建议尽量使用有限的时序窗口上限。
今天就分享到这了,欢迎讨论交流。