system verilog(七)线程以及线程间的通信

在实际的硬件中,时序逻辑通过时钟沿来激活,组合逻辑的输出随着输入的变化而变化(所有的并发的活动在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可以动态创建线程,而且不用等待他们都执

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值