sv线程基础

news/2025/3/30 7:46:32/

一、多线程fork join/fork join_any/fork join_none的用法差异

fork…join:父进程会阻塞所有子线程结束。
fork…join_any:父进程会阻塞到任意一个线程结束。
fork…join_none:父进程会继续与所有子现成并发执行。
wait fork: 使父线程等待所有子线程执行完毕;一般用来确保所有子进程(调用进程产生的进程,也即一级子进程)执行都已经结束。
disable fork: 当执行disable fork时,会终止所有子线程的执行;

在这里插入图片描述
wait fork:
会引起调用进程阻塞直到它的所有子进程结束,
一般用来确保所有子进程(调用进程产生的进程)执行都已经结束
disable fork:
用来终止调用进程的所有活跃进程, 以及子进程的所有子进程

注意:wait fork作用的父进程下的子进程,而不包括子进程下的子进程,而disable fork则是作用于父进程下的所有进程,包括子进程的子进程
module tb_top;

  initial begin// Fork off 3 sub-threads in parallel and the currently executing main thread// will finish when any of the 3 sub-threads have finished.fork// Thread1 : Will finish first at time 40ns#40 $display ("[%0t ns] Show #40 $display statement", $time);    // Thread2 : Will finish at time 70nsbegin#20 $display ("[%0t ns] Show #20 $display statement", $time);#50 $display ("[%0t ns] Show #50 $display statement", $time);end// Thread3 : Will finish at time 60ns#60 $display ("[%0t ns] TIMEOUT", $time);join_any// Display as soon as the fork is done$display ("[%0t ns] Fork join is done, wait fork to end", $time);// Fork two more processesfork#10 $display ("[%0t ns] Wait for 10", $time);#20 $display ("[%0t ns] Wait for 20", $time);join_any// Wait until ALL forked processes are overwait fork;$display ("[%0t ns] Fork join is over", $time);end
endmodule
[20 ns] Show #20 $display statement
[40 ns] Show #40 $display statement
[40 ns] Fork join is done, wait fork to end
[50 ns] Wait for 10
[60 ns] TIMEOUT
[60 ns] Wait for 20
[70 ns] Show #50 $display statement
[70 ns] Fork join is over

首先需要知道的是,能够建立进程的只有initial块,always块,以及fork语句(也许还有其它的,我SV也没有了解透彻,欢迎指出问题)。 inital、always块、fork join创建静态进程, fork join_any 和 fork join_none创建动态进程。
了解这点之后我们就可以知道父进程是哪个范围,以及它有哪些子进程。在上述例子中, 调用进程就是initial挂起的一个begin块,它有哪些子进程?fork join_any的特点不在赘述,第一个fork join_any创建了三个进程(三条并行语句),第二个fork join_any创建了两个进程,一共五个。父进程调用的wait fork于是需要等待这五个进程全部结束之后才会打印后面的display,这五个进程结束得最晚的是Thread2, 花费70个仿真时间所以最后一个display打印时间是70 ns。
如果在wait fork之前打印一次时间,应该是50 ns,这个第一个和第二个fork join_any种的最短进程的花费时间之和。

在使用了fork… join_any或者fork… join_none以后,我们可以使用disable来指定需要停止的线程。

parameter TIME_OUT = 1000; 
task check_trans{Transaction tr);
fork
begin
//等待回应,或者达到某个最大时延
fork: timeout_block
begin
wait(bus.cb.addr == tr.addr);
$display("@%0t: Addr match %d", $time, tr.addr);
end 
#TIME_ OUT $display ("@%0t: Error: timeout, $time);
join_any 
disable timeout_block;
end
join_none
endtask
文章来源:https://blog.csdn.net/qq_39787102/article/details/146462567
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ppmy.cn/news/1582704.html

相关文章

集成学习之随机森林

目录 一、集成学习的含义 二、集成学习的代表 三、集成学习的应用 1、分类问题集成。(基学习器是分类模型) 2、回归问题集成。(基学习器是回归模型) 3、特征选取集成。 四、Bagging之随机森林 1、随机森林是有多个决策树&a…

多无人车协同探索开源包启动文件介绍(下)

在之前介绍的《多无人车协同探索开源包部署教程及常见报错解决方式》中运行多无人车协同探索时,先后运行了两个launch文件 multiple_tb3_house.launch 和three_robots.launch ,本文来进一步看一下这两个启动文件以及其调用的move_base .launch 和multi_t…

STM32__红外避障模块的使用

目录 一、红外避障模块 概述 二、直接读取OUT引脚电平 三、使用中断方式触发 一、红外避障模块 概述 引脚解释: VCC接3.3V 或 5.0VGND接开发板的GNDOUT数字量输出(0或1); 低电平时表示前方有障碍 ; 通过可调电阻调整检测距离 产品特点: …

【STM32实物】基于STM32的扫地机器人/小车控制系统设计

基于STM32的扫地机器人/小车控制系统设计 演示视频: 基于STM32的扫地机器人小车控制系统设计 简介:扫地机器人系统采用分层结构设计,主要包括底层硬件控制层、中间数据处理层和上层用户交互层。底层硬件控制层负责对各个硬件模块进行控制和数据采集,中间数据处理层负责对采…

记一次MyBatis分页莫名其妙的失效,首次执行合适,后续执行分页失效且异常

代码几乎一样,为啥这个xml配置的就会出现莫名其妙的问题呢 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{propertymybatis_plus_first, modeI…

电阻的阻值识别

电阻买回来是有偏差的,不同的电阻种类,它的偏差大小会不一样,偏差越小的肯定越贵 主要看要求的精度要求是否越高 色环电阻或者说插件电阻 用来读数的几个色环它是比较靠近的,精度的色环跟用来读数的几个色环的间距会大一点点。 间…

embeddings

embeddings(嵌入) 是一种将数据从原始空间映射到低维向量空间的表示方法。这些低维向量通常能够捕捉数据的重要特征和语义信息,同时减少数据的维度,便于模型处理和学习。 Embeddings的主要特点 低维表示:将高维数据&a…

谷歌Gemini代码助手免费版解析:技术革新与用户隐私的权衡

摘要 谷歌近期推出了Gemini代码助手的免费版本,并默认启用了用户代码数据收集功能,以优化和改进其AI模型。此外,谷歌还预览了一项针对GitHub平台的AI代码评审功能,旨在提升代码审查的效率与准确性。这一系列举措将为开发者提供更智…