【SV】通过“三个问题”了解systemverilog的进程并发与进程通信

本文通过三个问题,以提问的形式来学习sv的并行进程和进程通信的基本知识。
在这里插入图片描述
1,什么是sv的进程?
systemverilog在eda仿真中本身是通过软件模拟实际的硬件处理,而电路处理都是并行开展的。所以,sv或者verilog中需要有功能
模拟各并行执行的组件。sv中增加了fork joinx类来加强该方面的能力。
在这里插入图片描述
fork…join/join_any/join_none三种语句的区别用下面图解释非常形象,也很容易理解。关键的差别是在子进程与后续父进程的执行顺序上。
在实际项目中,三种都有使用。举几个例子,fork/join 可以用在driver 或者monitor的forever处理task中,表示两个一直并行执行的进程;fork…join_any 可以用在验证平台结束条件控制中,结束可能有多个条件,只要其中进程的条件满足,则可以结束仿真;fork…join_none 可以用例测试用例的过程控制中,如仿真启动后,需要在这个过程中通过读取dut的状态等操作,可以启动并行执行,而不阻塞。
在这里插入图片描述
2,如何启动和停止进程?
进程的启动比较灵活,验证平台各组件可以灵活启动,而不需要关注其如何停止。进程的停止,则一般是在仿真平台的顶层统一控制。UVM/VMM 中都有统一的方法来停止线程。SV的方法主要有disable fork。
在这里插入图片描述
3,进程间如何通信?
进程是并发执行的,通常不同进程间需要交互或者传递数据,SV中提供了机制方法来实现。
1),事件;通常使用在两个有相互等待或者阻塞的进程间;
2),旗语;通常使用在两个进程对同一个资源有方法控制的时候;
3),信箱;两个或者多个进程间的数据传递,也是组件间常用的fifo;
这三种方法,各自的使用场景还是非常分明和容易理解的,简单归类下:
在这里插入图片描述
进程间做到数据传递是第一步,两者之间的同步也是很重要的问题,即如何保持关联的两个组件间步调一致。典型的例子是sequencer和driver之间的同步,不能sequencer所有的激励全部都产生完成了,还一个数据都没有通过driver发生出去,这个显然也不合理。
具体解决办法有下面几个,从这几个方法看,其实是对信箱和事件的灵活应用。
在这里插入图片描述
上面就是sv进程的三个主要方面,通过本文讲解可以基本上看到全貌。另外,进程中变量的使用也经常被提起,因为经常出一些莫名其妙的问题,这个下次再补充讲解一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值