其他分享
首页 > 其他分享> > SystemVerilog 第7章 线程以及线程间的通信

SystemVerilog 第7章 线程以及线程间的通信

作者:互联网

SystemVerilog 第7章 线程以及线程间的通信


在这里插入图片描述


7.1 线程的使用

SV绿皮书中介绍的很简略,这里推荐前辈的一篇文章:线程与进程的一个简单解释

7.1.1 fork…join和begin…end

7.1.2 fork…join_none

7.1.3 fork…join_any

7.1.4 在类中创建线程

7.1.5 动态线程

7.1.6 线程中的自动变量

7.1.7 等待衍生线程

7.1.8 线程间共享变量

7.2 停止线程

7.2.1 停止单个线程

7.2.2 停止多个线程

7.2.3 disable多次调用的task

7.3 线程间的通信

7.4 event

//声明
event event_name;

//使用1
@event_name;
->event_name;

//使用2
wait(event_name.triggered);
->event_name;

7.4.1 边沿阻塞

7.4.2 等待事件触发

7.4.3 循环中使用事件

7.4.4 传递事件

7.4.5 等待多个事件

7.5 旗语(semaphore)

//声明&例化
semaphore sem;
sem=new(1);

//使用
sem.get(1):
sem.put(1);
sem.try_get(1);

7.6 mailbox

//声明&例化
mailbox mbx;
mbx = new();

//使用
sem.put(tr):
sem.get(tr);
sem.peek(tr); //只复制不取出

7.6.1 测试平台里的信箱

7.6.2 定容信箱

7.6.3 异步线程间的信箱通信

7.6.4 定容信箱+peek同步线程

7.6.5 event同步线程

7.6.6 两个信箱同步线程

7.7 搭建通信线程TB

在这里插入图片描述

7.7.1 agent(事务处理器)

class Agent;

mailbox gen2agt, agt2drv;
Transaction tr;

function new();
	this.gen2agt=gen2agt;
	this.agt2gen=agt2gen;
endfunction

task run();
	forever begin
		gen2agt.get(tr);
		...
		agt2drv.put(tr);
	end
endtask

endclass

7.7.2 配置类

class Config;
	bit [31:0] run_for_n_trans;

	constraint reasonable {
		run_for_n_trans inside {[1:1000]};
	}
endclass

7.7.3 环境类

class Environment;

Config cfg;
Generator gen;
Agent agt;
Driver drv;
Monitor mon;
Checker chk;
Scoreboard scb;
mailbox gen2agt, agt2drv, mon2chk;

extern function new();
extern function void gen_cfg();
extern function void build();
extern task run();
extern task wrap_up();

endclass

function Environment::new();
	cfg = new();
endfunction

function Environment::cfg();
	assert(cfg.randomize);
endfunction

function Environment::build();
	gen2agt = new();
	agt2drv = new();
	mon2chk = new();
	gen = new(gen2agt);
	agt = new(gen2agt,agt2drv);
	drv = new(agt2drv);
	mon = new(mon2chk);
	chk = new(mon2chk);
	scb = new();
endfunction

task Environment::run();
	fork
		gen.run(cfg.run_for_n_trans);
		agt.run();
		drv.run();
		mon.run();
		chk.run();
		scb.run(cfg.run_for_n_trans);
	join
endtask

task Environment::wrap_up();
	fork
		gen.wrap_up();
		agt.wrap_up();
		drv.wrap_up();
		mon.wrap_up();
		chk.wrap_up();
		scb.wrap_up();
	join
endtask

7.7.4 测试程序

program automatic test;

Environment env;

initial begin
	env = new();
	env.gen_cfg();
	env.build();
	env.run();
	env.wrap_up();
end

endprogram

标签:fork,run,通信,7.1,线程,new,event,SystemVerilog
来源: https://blog.csdn.net/Breeze1995/article/details/122065838