定义
一个经常困扰测试台环境的问题是设计和测试台之间的竞争条件。考虑下面的示例。假设一个测试平台需要等待来自DUT的特定响应。一旦它收到响应,在同一仿真时间,它需要发送一组激励到DUT。由于Verilog可以在各种peocedural block(过程块)中无序地执行事件,因此测试台有可能在DUT的响应到达之前就发送激励。
程序块在 program 和 endprogram 关键字对中定义。
程序块是对编写设计和测试台的目标差异的认识。 它旨在方便测试平台的编写。
它有三个目的。
- 它为测试台的执行提供了一个入口点。类似于设计中的module。
- 与模块类似,程序块可以充当封装程序范围数据的作用域。
- 最重要的是在“Reactive region”中安排事件
Program block中的initial块会在reactive区执行,外部的initial会在active区执行
program block 是与package对应的概念,它是给testbench引用的,存在的意义在于避免testbench中对module的引用引起竞争冒险问题,它是如何解决竞争冒险的呢,这就要回到systemverilog最开始的那篇时序上了,program里面对blocking和non blocking assignment的调用是在reactive region,即active region和NBA之后。
它在使用上,大部分时候跟一个testbench中引用普通的module没有什么不同,但一个很关键的点,program block,就像它的名字所揭示的,是一个纯软件的代码,不能综合,所以它里面不能有always语句。
Program:主要是为了在逻辑和仿真时间上,区分开RTL设计与验证平台。在SV搭建的验证环境中,testcase一般就定义一个program来开始执行。program中不能使用always,因为program相比较来说,与C语言更靠近一些。所以多用initial就可以。
program中的仿真时间与RTL中的是有区别的,SV将同一仿真时刻分为四个区域,Active(design), Observed(assertion), Reactive(testbench), Postponed(sample)。相当于在原verilog的基础上又为program增加了一个执行区间,一个采样区间。所以clk的定义不能放在program中。
当program中的initial结束时,SV会调用$finish完成仿真。
区域名 | 行为 |
---|---|
Active | 仿真模块中的设计代码(RTL、时钟发生器、门级代码) |
Observed | 执行SystemVerilog 断言 |
Reactive | 执行程序中的测试平台部分 |
Postponed | 为测试平台的输入采样信号 |
1,在时间片内首先执行的是Active区域,设计事件在这里运行。这包括RTL和gate代码以及时钟发生器。
2,