interface clocking
作用:用来进行事件的同步,输入的采样,输出的驱动。
线程的控制
- fork join等所有线程都执行完毕,才跳出循环。
- fork join_any只要有一个线程执行完,就跳出循环
- fork join_none只是启动所有线程,并不等他们执行完毕。
- 如果希望所有fork块都执行完毕再退出,我们可以使用wait_fork语句。
- 我们可以使用disable来停止线程。
组件的通信
- event ,单一的通知功能,用来做事件的触发。@是边沿敏感,阻塞等待事件的变化,wait(e1.triggered()是电平敏感。
- semaphore,共享资源的安全卫士。使用前要用new对其进行初始化
- mailbox,精小的SV原生fifo。也需要使用new对其进行初始化。
覆盖率
- 代码覆盖率主要有:行覆盖率,路径覆盖率,翻转覆盖率,状态机覆盖率
- 断言覆盖率
- 功能覆盖率,如果覆盖率稳步增长,那么我们添加新的种子或者加长测试实际即可。如果增速放缓,那么需要添加额外的约束。如果覆盖率停止增长,那么需要创建新的测试用例。
- 翻转覆盖率
回调函数
验证环境被移植做水平复用或者垂直复用时,应当尽可能少的修改模块验证环境本身,只在外部最少量的配置,一方面我们可以通过顶层环境的配置对象自顶向下进行配置参数传递,另一方面我们可以预留回调函数入口,在继承的子类中填充回调函数,完成对父类的修改。
参数化的类
参数化的使用时为了提高代码的复用率,例如class mail box #(type T=int ) 后期类在声明变量时,如果不指定参数类型,则默认采用int类型,参数化的类可以在后期例化时使用不同的参数,以此来存储不同的数据类型。