01

线程控制

1.概述

线程,即独立运行的程序;

线程需要被触发执行,可以结束或者不结束;

  • 在module中的initial和always,都可以看作独立的线程,他们在仿真0时刻开始,而选择结束或者不结束;

  • 在硬件模块中都是always语句块,所以可以看成是独立运行的线程,而且会一直占用仿真资源,因为他们不会结束;

验证环境需要initial语句块,在仿真过程中,验证环境中的对象可以创建和销毁,故验证环境的资源是动态的;

  • 验证环境中的initial语句块有两种方式:begin……end或者fork……join;

Begin……end中语句顺序执行,而fork……join中语句并发执行;

与fork……join类似的并行语句有fork……join_any、fork……join_none;

  • 线程的执行轨迹是呈树状结构,即任何线程都应该有父线程;

  • 父线程可以开辟若干子线程,父线程可以暂停或者终止子线程;

  • 当子线程终止时,父线程可以继续执行;

  • 当父线程终止时,其子线程都终止执行;

2.并行线程

fork……join需要所有并行线程都结束才会继续执行;

fork……join_any其中任意一个线程结束就继续执行;

fork……join_none不等待子线程,直接继续执行;

  • 注意:

Fork……join_any和fork……join_none继续执行后,其一些未完成的子线程仍将继续在后台执行;

如果要等待或者停止这些子线程,可使用wait fork 或者disable fork;

task do_test;    fork        ……    join_any    fork        ……    join_none    wait fork;//等待所有子线程结束endtask
task get_first(output ubt adr);    fork        ……    join_any    disable fork;endtask

3.时序控制

  • SV可以通过延迟控制或者事件(event)等待来完成时序控制;

延迟控制即通过#来完成;

#100 clk2=clk1;

事件(event)控制即通过@来完成;

@a clk1=clk2;  //等待事件

@(posedge clk)a=b;//边沿触发

Wait语句可以与事件或者表达式结合使用;

Real AOR[];

Initial wait(AOR,size()>0)  //wait语句完成电平触发

02

线程同步

1.概述

测试平台所有线程都需要同步并进行交换数据;

一个线程等待另一个线程;

2.事件event

  • 通过event声明一个event变量,并且触发;

  • event变量可以由一端去触发,再由另一端完成阻塞式的等待,即可以用来控制多个线程之间的同步;

  • 通过->来触发事件;

  • 其他等待该事件的线程可以通过@操作符或者wait()来检查事件触发状态来完成等待事件;

event done,blast;  //声明两个独立的事件event done_too=done;   //事件done赋值给done_tootask trigger(event ev);    ->ev;   //触发ev事件endtask……fork     @done_too;  //等待done_too    #1 trigger(done);  //触发done事件joinfork    ->blast;  //触发blast事件    wait(blast.triggered);  //电平触发等待join
  • wait_order() 可使得线程保持等待,直到在参数列表中的事件event按照顺序从左往右依次完成;

wait_order(a,b,c);

3.旗语(semaphore)

旗语是一个互斥体,使用旗语可以实现对同一资源的访问控制;

在创建旗语时,会为其分配固定的钥匙数量;

使用旗语的进程必须先获得钥匙,才可访问资源;

旗语的钥匙数量可以有多个,等待旗语的进程也可以有多个;

旗语的等待队列是先进先出(FIFO),即先排队等待旗语的将优先得到钥匙;

旗语操作

创建旗语

semaphore sm;//创建一个旗语

sm=new(1); //分配一个钥匙

创建一个固定钥匙数量的旗语:new

从旗语获取一个或多个钥匙(阻塞型):get

返回一个或多个钥匙:put

获取一个或多个钥匙而不被阻塞:try_get

task send;    sem.get(1)  ///获取钥匙        ……        sem.put(1);  //处理完成时把钥匙返回endtask

03

线程通信

1.信箱

用于收发信息,SV中信箱可以存放任何数据类型,也可以从信箱中读取这些数据,

创建信箱:new()

将信息写入信箱:put()

写入信箱但不会阻塞:try_put()

获取信息:get() 获取信息并取出数据:

peek()获取信息不会取出数据

从信箱获取数据但不会阻塞:try_get()/try_peek()

获取信箱信息数目:num()

2.信箱和队列区别

  • 信箱必须通过new()例化,队列只需要声明

  • 信箱的存取方法put()和get()是阻塞方法,不一定会立即返回;队列的存取方法push_back和pop_front()是非阻塞方法,会立即返回;

  • 传递形式参数时,如果是input方向,则信箱类型传递的是句柄,队列类型完成的是队列内容的拷贝;

3.总结

  • event:最小信息量的触发,即单一的通知单元,用来做事件的触发,也可多个事件组合起来作线程之间的同步;

  • semaphore:共享资源安全,用于多线程间需要对某一公共资源做访问;

  • mailbpx:SV类似FIFO,在线程之间做数据通信或者内部数据缓存;

END

往期相关(?猛戳可查看)

  • SystemVerilog

  • SystemVerilog两态数据类型

  • SystemVerilog自定义、枚举、结构体类型

  • SystemVerilog数组操作

  • SystemVerilog数组类型

  • SystemVerilog函数和任务

  • SystemVerilog覆盖率

$display("点个在看吧!")

事件触发控制_SystemVerilog线程控制与通信相关推荐

  1. 多智能体协同传输的事件触发通信与控制的深度强化学习(ICRA-2021)

    摘要 本文探讨了一种多智能体强化学习方法来解决多智能体协作传输的通信和控制策略设计问题.典型的端到端深度神经网络策略可能不足以覆盖通信和控制;这些方法不能决定通信的时间,只能工作在固定速率的通信.因此 ...

  2. 事件触发控制_基于事件触发机制的直流微电网多混合储能系统分层协调控制方法...

    点击下面标题,了解通知详情第九届电工技术前沿问题学术论坛征文通知 华北电力大学电气与电子工程学院的研究人员郭伟.赵洪山,在2020年第5期<电工技术学报>上撰文,以含有多个混合储能系统(H ...

  3. Linux下的C编程实战(开发平台搭建,文件系统编程,进程控制与进程通信编程,“线程”控制与“线程”通信编程,驱动程序设计,专家问答)

    Linux下的C编程实战(一) ――开发平台搭建 1.引言 Linux操作系统在服务器领域的应用和普及已经有较长的历史,这源于它的开源特点以及其超越Windows的安全性和稳定性.而近年来,Linux ...

  4. 事件触发控制 Event-Trigger Control Matlab Code

    提示:仅供参考 事件触发控制Matlab Code 前言 一.线性系统 二.有限差分法 三. Matlab ODE45 总结 前言 自动控制的大部分工作和研究考虑了周期或时间触发控制系统,在这些系统中 ...

  5. [分布式控制浅述] (3)简单分布式事件触发控制

    [分布式控制浅述] (3)简单分布式事件触发控制 [分布式控制浅述] (3)简单分布式事件触发控制 1 前言 2 分布式事件触发控制 3 稳定性分析 [分布式控制浅述] (3)简单分布式事件触发控制 ...

  6. 多智能体系统——具有非线性不确定干扰的多智能体系统的固定时间事件触发一致性控制(附论文链接+源码Matlab)

    *[多智能体系统--具有非线性不确定干扰的多智能体系统的固定时间事件触发一致性控制-Fixed-time event-triggered consensus control for multi-age ...

  7. python线程间通信_python多线程之事件触发(线程间通信)

    执行结果: 那么,通过分析执行结果来看,您已经体会到了其中的秘密.... 再脑补一下: Python提供了Event对象用于线程间通信,它是由线程设置的信号标志,如果信号标志位真,则其他线程等待直到信 ...

  8. System Verilog 线程间的通信——事件,信箱与旗语

    本文参考绿皮书第七章节,主要介绍System Verilog线程间通信的方式与基本的使用.包括事件,mailbox,semaphore.简而言之,事件可以实现线程间的通信,mailbox用于线程间的数 ...

  9. SV学习笔记—线程之间的通信(事件event、信箱mailbox、旗语semaphore)

    目录 0.前言 1.事件event 2.信箱mailbox 3.旗语semaphore 0.前言 若多个线程之间想要进行数据交换或者知道彼此的状态以决定执行什么线程,SV中通过event.mailbo ...

最新文章

  1. 以太坊今日大涨7.5%,芝商所备战“以太坊期货”
  2. 第01章_数据库概述
  3. SVN学习总结(2)——SVN冲突解决
  4. 基础练习 字符串对比
  5. 线上CPU飚高(死循环,死锁……)?帮你迅速定位代码位置
  6. 【二分】Best Cow Fences(poj 2018)
  7. 没有IF-ELSE的工厂
  8. 多线程编程(9) - 认识等待函数 WaitForSingleObject
  9. 拖拽升空的Android小火箭
  10. openshift 在win7上的实现
  11. 决定对SQL Server 2008 R2进行升级
  12. GC调优在Spark应用中的实践
  13. 常见排序算法、查找算法(中英文命名)
  14. Python 内置容器 之 字典 ( dict )超详细指南
  15. 三分钟搭建你的个人支付接口
  16. python基础程序_Python基础初识
  17. Cadence Allegro 鼠标轨迹快捷键的设置图文教程及视频演示
  18. 配置聚合连接 和 配置firewalld防火墙
  19. 断章取义:关于红玫瑰和白玫瑰
  20. 机器学习的思考–计算机的潜意识

热门文章

  1. java 内联调用深度_Java中内联虚拟方法调用的性能
  2. 谁最终需要Java模块?
  3. 使用Java 8进行分组,转换和归约
  4. 如何优化Hibernate EllementCollection语句
  5. 使用默认方法进行接口演化–第二部分:接口
  6. Java 8 StringJoiner
  7. 使用Spring 3.2的DeferredResult进行长轮询
  8. 简单的Gradle Web应用程序
  9. Spring集成–第1节– Hello World
  10. JavaFX 2 GameTutorial第4部分