在实际的硬件中,时序逻辑通过时钟沿来激活,组合逻辑的输出随着输入的变化而变化(所有的并发的活动在verilog的寄存器传输级是通过initial和always块语句、实例化和连续赋值语句来模拟的,在测试平台的环境中,大多数语句块被模拟成事务处理器,并运行在各自的线程中)
发生器把激励传递给代理,环境类需要知道发生器什么时候完成任务,以便及时终止测试平台还在运行的线程(通过线程间的通信完成),常见的线程间的通信有标准的Verilog事件、事件控制、wait语句、systemverilog信箱和旗语。
虽然所有的线程结构都可以用在模块和程序块中,但测试平台隶属于程序块(代码总是以initial启动,always=initial forever)
verilog对语句有两种:
1、begin…end
2、fork…join(必须等fork…join内的所有语句都执行完才能继续块内后续的处理)
sv引入两种新的创建线程的方法:
1、fork…join_none
2、fork…join_any
fork…join_none块调用其块内语句时,父线程继续执行
fork…join_any块对块内语句进行调度,当第一个语句完成后,父线程才继续执行,其他停顿的线程也得以继续。
在类中创建线程(构造函数只用来对数值初始化,并不启动任何线程,任务通过fork…join none块启动了一个线程)
class Gen_drive;
task run(int n);
packet p;
fork
repeat(n) begin
p=new();
assert(p.randomize());
transmit(p);
end
join_none
endtask
task transmit(input packet p);
...
endtask
endclass
Gen_drive gen;
initial
begin
gen=new();
gen.run(10);
...
end
动态线程:verilog通过统计initial、always和fork…join的数量可以确定一个模块中有多少线程;而sv可以动态创建线程,而且不用等待他们都执