SV-线程同步与通信-事件-旗语-信箱

2024-03-27 01:10

本文主要是介绍SV-线程同步与通信-事件-旗语-信箱,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

事件event

         用event来声明一个事件,用箭头->来触发,用@来等待事件的发生。

`timescale 1ns/1ps
module tb;event e1, e2, e3;task automatic wait_event(event e, string name);$display("@%t start waiting event %s", $time, name);@e;$display("@%t finish waiting event %s", $time, name);endtaskinitial beginforkwait_event(e1, "e1");wait_event(e2, "e2");wait_event(e3, "e3");joinendinitial beginforkbegin #10ns -> e1; endbegin #20ns -> e2; endbegin #30ns -> e3; endjoinend
endmodulemodule tb2;logic e1, e2, e3;task automatic wait_event(ref bit e, string name);$display("@%t start waiting event %s", $time, name);@e;$display("@%t finish waiting event %s", $time, name);endtaskinitial beginforkwait_event(e1, "e1");wait_event(e2, "e2");wait_event(e3, "e3");joinendinitial beginforkbegin #10ns  e1 = !e1; endbegin #20ns  e2 = !e2; endbegin #30ns  e3 = !e3; endjoinend
endmodule

       tb2中,ref表方向,logic表数据类型。

      tb2中变量要加ref,而event中没有添加ref。  等待的是信号,用ref。

         @是边沿触发,wait是电平触发。   先等待再触发,用@。

         wait_order按照一定顺序去等待event发生

AB

        event之间可以拷贝,拷的是句柄,都共同指向一个event。   如果要等待event,要先等到event再去触发

旗语semaphore

        旗语就是个容器,用来保护,保护共享的资源。为了保护共享的资源,一开始去分配一个访问这个共享资源的钥匙🔑。   访问共享资源,且不允许读/写来访问memory(非共享)等。——此为需求。用semaphore来实现。

`timescale 1ns/1ns
module tb;semaphore mem_acc_key;int unsigned mem[int unsigned];task automatic write(int unsigned addr, int unsigned data);mem_acc_key.get();#1ns;mem[addr] = data;mem_acc_key.put();endtasktask automatic read(int unsigned addr, output int unsigned data);mem_acc_key.get();#1ns;if(mem.exists(addr))data = mem[addr];elsedata = 'x;mem_acc_key.put();endtaskinitial beginint unsigned data = 100;mem_acc_key = new(1);forever beginfork //fork-join是并行执行的begin#10ns;write('h10, data + 100);$display("@%t write with data %d", $time, data);               endbegin#10ns;read('h10, data);$display("@%t read with data %d", $time, data);                  endjoinendend
endmodule

        semaphore的目的是先例化一把钥匙,一开始大家都有往里写/读的权限。而memory是单端口memory,只能读/写,不能读写同时。

         旗语等待的方式是队列——先进先出。   先开始等的先拿钥匙🔑。

         try_get是函数,拿不到就不拿了,会立即返回。   0表示拿不到足量的钥匙。

信箱mailbox

         event事件,旗语semaphore,信箱mailbox共同点是赋值时,其变量是句柄

        信箱和旗语例化的时候要用new,事件不需要用new,因为其很小。

        信箱是丢进去数据,然后拿出数据。mailbox信箱就是一个FIFO,mailbox的通信只能把其当作FIFO来使用。

        try-put和try-get是为了不被堵塞,放进去返回1,放不进去返回0。;信箱可以写满。   peek可以拿数据,拍个快照,数据仍停留在信箱mailbox里边,get是拿走了。

         信箱里边的数据,num来调用信箱的数据。num()返回信箱目前的消息数目。;队列,动态数组访问其有几个数,数据内容用.size。信箱是用.num()

 

         mailbox #,#表示只能存放该种数据类型...。

module tb;mailbox #(int) mb;initial beginint data;mb = new(8);forveer begincase($urandom() % 2)0: begindata = $urandom_range(0, 10);if(mb.try_put(data))$display("mb put data %0d", data);end1: beginif(mb.try_get(data))$display("mb get data %0d", data);end endcase                 endend
endmodule

AB

         可以指定信箱mailbox存储的数据类型,#来限定存储的类型是什么;   可以不限制信箱的大小,new的时候不传参数即可;;;   信箱写满时,再写,数据不会溢出会等待;   信箱为空时,调用try_get返回0,调用get会一直阻塞。

这篇关于SV-线程同步与通信-事件-旗语-信箱的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/850467

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2

vue2 组件通信

props + emits props:用于接收父组件传递给子组件的数据。可以定义期望从父组件接收的数据结构和类型。‘子组件不可更改该数据’emits:用于定义组件可以向父组件发出的事件。这允许父组件监听子组件的事件并作出响应。(比如数据更新) props检查属性 属性名类型描述默认值typeFunction指定 prop 应该是什么类型,如 String, Number, Boolean,

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

FreeRTOS内部机制学习03(事件组内部机制)

文章目录 事件组使用的场景事件组的核心以及Set事件API做的事情事件组的特殊之处事件组为什么不关闭中断xEventGroupSetBitsFromISR内部是怎么做的? 事件组使用的场景 学校组织秋游,组长在等待: 张三:我到了 李四:我到了 王五:我到了 组长说:好,大家都到齐了,出发! 秋游回来第二天就要提交一篇心得报告,组长在焦急等待:张三、李四、王五谁先写好就交谁的

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

java线程深度解析(六)——线程池技术

http://blog.csdn.net/Daybreak1209/article/details/51382604 一种最为简单的线程创建和回收的方法: [html]  view plain copy new Thread(new Runnable(){                @Override               public voi