taskkill无法终止进程 拒绝访问_SystemVerilog中的Process(2) 进程的控制

本文探讨了在SystemVerilog中遇到的`taskkill`无法终止进程并提示“拒绝访问”的问题,分析了进程控制的难点,并介绍了如何通过进程名字获取进程句柄来解决此类问题。文章涵盖了Named block、wait_order、wait fork和disable fork等关键概念,旨在帮助读者深入理解SystemVerilog中的进程管理。
摘要由CSDN通过智能技术生成

来都来了

不关注一下吗

607f5d1df001399c6b841cb3316c4ea0.png

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

|原创作者| 老黄鸭 Hello everybody,我们接着上期的 Process(1)-产生进程的方式(点击跳转) 继续讲解SystemVerilog中对于process的多种控制方式。 本期黄鸭哥主要给大家讲解 named block、wait_order、wait_fork、disable,还有SystemVerilog中的内建类:process类。

1

Named block

Block,也就是语句块,SystemVerilog提供了两种类型的语句块,分别是begin…end为代表的顺序语句块,还有以fork…join为代表的并发语句块。 这两种block都是工程项目中常用的block,但是,大家可能都不知道block也是可以 命名 的,就像我们每个人的名字一样,名字是我们每个人的一个标识。 通过这个 标识 ,我们可以访问block中的 变量、parameter 等。 ecc06b29e269411b8b1c6680fafacf0b.png 图1 图1中,initial begin…end中有两个named block,分别为顺序执行的block_a和并发执行的block_b。 我们可以通过在block的开头和结束编写上 标识名 ,也可以只在开头进行编写; 如果是在block的开头和结束都有对应的标识名,则这两标识名 必须相同 ,否则会编译报错。 dc626a835f4d93e74a2d7210d87c7164.png 图2 从图1和图2中我们还可以看到,int类型的变量和parameter的作用范围都是在 各自block范围内 的。 所以,我们要记住,如果需要访问block中的变量或者parameter,则需要给block进行命名,并且,block中的变量、parameter都是 相互独立的 。

2

wait_order、wait fork

SystemVerilog提供了两大类process的控制方式,分别为wait和disable。 wait中又包含了三小类:wait、wait_order、wait fork。 其中,wait相对简单,在这就不说了,黄鸭哥只介绍后两种。 那么,什么是wait_order? 黄鸭哥总结一句:wait_order会 阻塞等待多个事件的触发 ,并且要求这几个 事件间发生的顺序和设置的一致 。 这句话该怎么理解呢? 我们来看下例子: 38cc6e1e125e628ce2ac5cced1582b0a.png 图3 例子中包含3个event,3个event分别在3个并发进程中进行触发,event_1在第50个timeunit被触发,event_2在第30个timeunit被触发,event_3在第100个timeunit的时候被触发。 wait_order需要阻塞到3个事件依次按照event_2、event_1、event_3的顺序进行触发后才能往下执行。这就是wait_order的用法。 wait中另外一个重要的用法是wait fork,关于它的用法,黄鸭哥总结了三句话: ① wait fork会引起调用进程阻塞, 直到它的所有子进程结束 ; ② wait fork的目的是用来 确保所有子进程执行结束 ; ③ wait fork作用 父进程下的子进程 ,而不包括子进程下的子进程。 cb86687ef8826ea5caef70ffc01724c8.png 图4 图4中initial语句块包含4个子进程,proc_1~proc_4。 其中,proc_4子进程中还含有一个子进程proc_4_1,此进程就是initial语句块的 子进程的子进程 。 按照上面黄鸭哥总结的三点来看,wait fork应该只需要等待到第2个子进程:proc_2执行结束,因为wait fork只会作用到子进程,不会作用到子进程的子进程( 不论是fork…join,fork…join_any还是fork…join_none产生的进程 )。 我们来看下仿真结果验证下我们的理论: 570cad07b464138b151592c3ddf72869.png 图5 果然,wait fork只等待到proc_2,在第200个timeunit就打印出了“wait fork finish”。

4a2c50ed4755a7b618eb0e0dbfc8783f.png

3

disable 、disable fork

上面说完了wait,我们接着说SystemVerilog中第二大类的进程控制方式:disable。 disable语句常用的多种方式包括:disable named_block、disable task_name和disable fork等,调用disable语句将会 终止指定的进程 。 237228630296c15406cbe8b6dc837e50.png 图6 图6里调用了disable,终止了对应的 带标识名 的block,从仿真截图中可以看出,block_1并没有正常结束,而是 中途被终止 了。 2f212d159dc28a4d473f5f7f3f2bc1a5.png 图7 上图中disable proc_a相当于return,它会直接 终止当前的task 。 而关于disable fork,这个是我们工程项目中使用的最多的一类,也是最容易踩坑的一类,disable fork的用法我推荐大家学习下Q哥的一篇文章:disable fork,你真的会用吗? 感兴趣的同学可以点进去看看,他在里面有很详细的描述,黄鸭哥在这里就不多说了。

4

内建类:process

SystemVerilog中内建了一种class,可以对进程进行访问和控制,此种class就是process,我们先来看下process类的原型: 1081af9efd21978085d27f38e07ca300.png 图8 process类中定义了一个枚举变量state,表示当前进程的几种执行状态: FINISHED,RUNNING,WAITING,SUSPENDED,KILLED 。 另外,还声明了几种task和function,我们通过下面的表格来简单了解下:
MethodDescribe
self()获取当前进程的句柄,process类不能主动的通过new来进行创建,只能通过initial…begin…end,final…begin…end,4个always procedure,3个fork procedure和dynamic process来产生
status()获取当前进程的状态:FINISH:    该进程已经结束了RUNNING:  该进程正在运行WAITING:    该进程等待阻塞条件SUSPENDED:该进程停止了,等待resume,当前状态只能通过调用process类中的resume函数来解除KILLED:     该进程被强制终止了
kill()终止该进程以及该进程的子进程
await()等待其他进程结束,不能在该进程中,调用该方法,只能是别的进程调用本进程的await()来阻塞本进程
suspend()挂起该进程
resume()恢复该进程
srandom(int seed)设置进程的随机种子
表1 有人会问了,这么多的method,我们都该记住吗? 黄鸭哥觉得不是的,只需要记住这里面常用的几个method: self(),status(),kill() 就可以了,我们最后再来看个例子,加深下理解: 87aef493bacba8d348a0c7a3d8de82b8.png 图9 be98d7da5d78df5282e9318586cc2e1b.png 图10 图9展示了这三个method的用法,通过self()获取进程的句柄,然后传递给定义的两个process类; 调用status()可以获取到process_1和process_2进程的执行状态,在100个timeunit的时候,process_1已经执行结束,而process_2则处 于阻塞状态; 当再次经过100个timeunit时,调用kill()终止了process_2的继续执行,从这里可以看出,要终 止一个进程,除了disable、disable fork之外,还可以调用process.kill()。

总结

process就讲到这了,我们再回顾下今天的要点: 1、block可以进行命名,命名之后就可以通过标识名访问block内部的变量和parameter,还可以通过disable named_block终止此block。 2、进程的两大控制方式:wait、disable。 3、SystemVerilog内建类,process类,可以通过process类访问进程和控制进程。 4、三种终止进程的方式:disable、disable fork、process.kill()。 快乐的时光总是很短暂,又到了说拜拜的时候了,下次黄鸭哥将给你们带来新的主题。 别着急问新主题是什么,留着点悬念,下次将带给你们新的惊喜!

11f93a410bb4cd6cb06b5b90f67eda40.png

——The  End——

c1b32c39b97153b83d53db1100bace2b.gif

历史推荐

SystemVerilog中的Process(1)---产生进程的方式

disable fork,你真的会用吗?


IC验证之“Timescale”使用小谈(一)

58f3be89c85bbc26e5c056aad74bd5dc.gif 同学,不来留个言吗!!!

899d7fc7e6ae04c59d29bd70e18e70d7.gif

留言板

e34a7ca37491b2761a8c5d0527643f1e.png 你点的每个在看,对我们都是鼓励
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值