1 断言的功能
- 仿真器会根据哪些断言被激活,这样就可以在此基础上收集功能覆盖率数据。
2 立即断言和并发断言
2.1 立即断言描述的是非时序的。它可以检测待测设计的信号值和测试平台的信号值,并且在存在问题时采取相应的行动。
2.1.1 定制断言行为
一个立即断言有可选的 then 和 else 分句。如果你想改变默认的消息,可以添加自己的输出信息。
a1: assert (bus.cb.grant == 2'b01)
else $error("Grant not asserted"); //如果grant不符合期望的值,就会看到定制的错误信息
2.2 并发断言描述的是时序的,与设计模块并行执行(只做观察不应影响设计的行为)。可以认为它是一个连续运行的模块,它为整个仿真过程检查信号的值。在并发断言内,需要指定一个采样时钟。
区分并发断言和立即断言的关键字是Property,Property是需要时钟的:
a1: assert property(@(posedge clk) a);
3 区分Sequence和Property
- Property描述了一些条件和结果之间的关系,它是一个单独的语言元素。Sequence描述了一些时序事件的序列,并在时序事件的序列上进行匹配。
- Property可以包含多个时序事件,而Sequence只描述了一个时序事件的序列。
- Sequence可以使用通配符来进行匹配,而Property不支持通配符。
- 只有在Property中才能使用蕴含操作符,Property中不能使用蕴含操作符
- Property块可以直接包含Sequence,复杂的Property块也可以独立声明Sequence
断言中的sequence不是uvm_sequence,而是一种用来表示一个或多个时钟周期内时序的描述。它是property的基本构建模块,可以在module,package,interface,program,clocking块中声明,但是不能在class中,property也是。sequence在声明的时候可以使用形式参数提高复用性。
总结:property:结合sequence对时序和逻辑的描述,用来表达设计的确切行为。
4 Sequence中基本符号描述
4.1 ## 表示周期延迟,##0表示当前周期,##n表示n个周期后,只计一次,条件满足后重新判断
##[min:max]表示延迟一个范围的周期,min、max要是非负数。序列会匹配最早的时间,通配符$表示无穷,如果##[3:$]表示延迟周期大于等于3都复合条件。
a |-> ##[1:4] b; //表示接下来的四个时钟内有一个满足即可。
a |-> ##[0:3] b; //表示当前时钟和后续的三个时钟有一个满足即可。
4.2 [*n]表示重复计多次事件(连续计算),不能和$配对使用,n是非负数,如果[*0]表示不检查当前算子(表示这个信号情况不发生),在信号后使用如@(posedge clk)a## 3 b[2],即表示在时钟上升沿时a信号拉高且再过3个周期后b连续拉高两拍。也可以配合":"来表示重复一个范围的次数,如[*3:8]重复3-8次。
a |-> ##1 b[*4]; //表示连续四个时钟都为1.
4.3 [=n]表示需要重复n次,但这n次不用连续,只要发生了n次即可,如a[=5]表示a要拉高5次,但不用是连续拉高5拍,可以不连续。也可以和":"组合使用表示一个范围。
a |-> ##1 b[=4]; //只需要后续b有4个时钟为1即可,不要求连续。