线程以及线程之间的通信
在实际硬件中,时序逻辑通过时钟沿来激活,组合逻辑的输出则随着输入的变化而变化。所有这些并发的活动在Verilog的寄存器传输级上是通过initial和always块语句、实例化和连续赋值语句来模拟的。为了模拟和校验这些语句块,测试平台使用许多并发执行的线程。在测试平台的环境里,大多数语句块被模拟成事务处理器,并运行在各自的线程里。
线程的使用
测试平台隶属于程序块,代码总是从initial块启动,从时刻0开始执行。
标准的Verilog语句中有两种分组方式——使用begin/end或fork/join。begin/end中的语句以顺序方式执行,而fork/join中的语句则以并发方式执行,必须等里面所有的语句都执行完之后才能继续块内后续的处理。
System Verilog中引入了两种新的创建线程的方法——使用fork/join_none和fork/join_any语句。fork/join_any对块内语句进行调度时,当第一个语句完成之后,父线程才继续执行,其他停顿的线程也得以继续。fork/join_none在调度其块内语句时,父线程继续执行。
在类中创建线程
//带有任务run的发生器/驱动器类
class gen_drive;
//创建n个数据包的事务处理器
task run (int n );