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

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