首页系统综合问题扒一扒SystemVerilog中的Process之进程控制

扒一扒SystemVerilog中的Process之进程控制

时间2022-12-22 15:15:08发布分享专员分类系统综合问题浏览100

杰瑞IC验证

来源| 杰瑞IC验证(ID:Jerry_IC)

|原创作者| 老黄鸭

Hello everybody,我们接着上期的Process(1)-产生进程的方式( 点击跳转 ) 继续讲解SystemVerilog中对于process的多种控制方式process monitor 。

本期黄鸭哥主要给大家讲解 named block、wait_order、wait_fork、disable,还有SystemVerilog中的内建类:process类process monitor 。

1

Named block

Block,也就是语句块,SystemVerilog提供了两种类型的语句块,分别是begin…end为代表的顺序语句块,还有以fork…join为代表的并发语句块process monitor 。

这两种block都是工程项目中常用的block,但是,大家可能都不知道block也是可以命名的,就像我们每个人的名字一样,名字是我们每个人的一个标识process monitor 。

通过这个标识,我们可以访问block中的变量、parameter等process monitor 。

扒一扒SystemVerilog中的Process之进程控制

图1

图1中,initial begin…end中有两个named block,分别为顺序执行的block_a和并发执行的block_bprocess monitor 。

我们可以通过在block的开头和结束编写上标识名process monitor ,也可以只在开头进行编写;

如果是在block的开头和结束都有对应的标识名,则这两标识名必须相同,否则会编译报错process monitor 。

图2

从图1和图2中我们还可以看到,int类型的变量和parameter的作用范围都是在各自block范围内的process monitor 。

所以,我们要记住,如果需要访问block中的变量或者parameter,则需要给block进行命名,并且,block中的变量、parameter都是相互独立的process monitor 。

2

wait_order、wait fork

SystemVerilog提供了两大类process的控制方式,分别为wait和disableprocess monitor 。

wait中又包含了三小类:wait、wait_order、wait forkprocess monitor 。

其中,wait相对简单,在这就不说了,黄鸭哥只介绍后两种process monitor 。

那么process monitor ,什么是wait_order?

黄鸭哥总结一句:wait_order会阻塞等待多个事件的触发,并且要求这几个事件间发生的顺序和设置的一致process monitor 。

这句话该怎么理解呢process monitor ?我们来看下例子:

扒一扒SystemVerilog中的Process之进程控制

图3

例子中包含3个event,3个event分别在3个并发进程中进行触发,event_1在第50个timeunit被触发,event_2在第30个timeunit被触发,event_3在第100个timeunit的时候被触发process monitor 。

wait_order需要阻塞到3个事件依次按照 event_2、event_1、event_3的顺序进行触发后才能往下执行process monitor 。这就是wait_order的用法。

wait中另外一个重要的用法是wait forkprocess monitor ,关于它的用法,黄鸭哥总结了三句话:

① wait fork会引起调用进程阻塞process monitor ,直到它的所有子进程结束;

② wait fork的目的是用来确保所有子进程执行结束;

③ wait fork作用父进程下的子进程,而不包括子进程下的子进程process monitor 。

扒一扒SystemVerilog中的Process之进程控制

图4

图4中initial语句块包含4个子进程,proc_1~proc_4process monitor 。

其中,proc_4子进程中还含有一个子进程 proc_4_1,此进程就是initial语句块的 子进程的子进程process monitor 。

按照上面黄鸭哥总结的三点来看,wait fork应该只需要等待到第2个子进程:proc_2执行结束,因为wait fork只会作用到子进程,不会作用到子进程的子进程(不论是fork…join,fork…join_any还是fork…join_none产生的进程)process monitor 。

process monitor 我们来看下仿真结果验证下我们的理论:

图5

果然,wait fork只等待到proc_2,在第200个timeunit就打印出了“wait fork finish”process monitor 。

扒一扒SystemVerilog中的Process之进程控制

3

disable 、disable fork

上面说完了wait,我们接着说SystemVerilog中第二大类的进程控制方式:disableprocess monitor 。

disable语句常用的多种方式包括:disable named_block、disable task_name和disable fork等,调用disable语句将会终止指定的进程process monitor 。

图6

图6里调用了disable,终止了对应的带标识名的block,从仿真截图中可以看出,block_1并没有正常结束,而是中途被终止了process monitor 。

图7

上图中disable proc_a相当于return,它会直接终止当前的taskprocess monitor 。

而关于disable forkprocess monitor ,这个是我们工程项目中使用的最多的一类,也是最容易踩坑的一类,disable fork的用法我推荐大家学习下Q哥的一篇文章: disable fork,你真的会用吗?

感兴趣的同学可以点进去看看,他在里面有很详细的描述,黄鸭哥在这里就不多说了process monitor 。

4

内建类:process

SystemVerilog中内建了一种classprocess monitor ,可以对进程进行访问和控制,此种class就是process,我们先来看下process类的原型:

扒一扒SystemVerilog中的Process之进程控制

图8

process类中定义了一个枚举变量state,表示当前进程的几种执行状态:FINISHED,RUNNING,WAITING,SUSPENDED,KILLEDprocess monitor 。

另外process monitor ,还声明了几种task和function,我们通过下面的表格来简单了解下:

Method

Describe

self

获取当前进程的句柄process monitor ,process类 不能主动的通过new来进行创建,只能通过initial…begin…end,final…begin…end,4个always procedure,3个fork procedure和dynamic process来产生

status

获取当前进程的状态:

FINISH: 该进程已经结束process monitor 了

RUNNING: 该进程正在运行

WAITING: 该进程等待阻塞条件

SUSPENDED:该进程停止了process monitor ,等待resume,当前状态只能通过调用process类中的resume函数来解除

KILLED: 该进程被强制终止process monitor 了

kill

终止该进程以及该进程的子进程

await

等待其他进程结束process monitor ,不能在该进程中,调用该方法,只能是别的进程调用本进程的await来阻塞本进程

suspend

挂起该进程

resume

恢复该进程

srandom(int seed)

设置进程的随机种子

表1

有人会问了process monitor ,这么多的method,我们都该记住吗?

黄鸭哥觉得不是的process monitor ,只需要记住这里面常用的几个method:self,status,kill就可以了,我们最后再来看个例子,加深下理解:

扒一扒SystemVerilog中的Process之进程控制

图9

图10

图9展示了这三个method的用法process monitor ,通过self获取进程的句柄,然后传递给定义的两个process类;

调用status可以获取到process_1和process_2进程的执行状态process monitor ,在100个timeunit的时候,process_1已经执行结束,而process_2则处于阻塞状态;

当再次经过100个timeunit时,调用kill终止了process_2的继续执行,从这里可以看出,要终止一个进程,除了disable、disable fork之外,还可以调用process.killprocess monitor 。

总结

process就讲到这了process monitor ,我们再回顾下今天的要点:

1、block可以进行命名,命名之后就可以通过标识名访问block内部的变量和parameter,还可以通过disable named_block终止此blockprocess monitor 。

2、进程的两大控制方式:wait、disableprocess monitor 。

3、SystemVerilog内建类,process类,可以通过process类访问进程和控制进程process monitor 。

4、三种终止进程的方式:disable、disable fork、process.killprocess monitor 。

扒一扒SystemVerilog中的Process之进程控制

你点的每个在看process monitor ,对我们都是鼓励

爱资源吧版权声明:以上文中内容来自网络,如有侵权请联系删除,谢谢。

SystemVerilogProcess程控制SystemVerilog程控制process monitor
BURTON 推出兔年限定滑雪板 重要!这个密码你设置了吗?