0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

System Verilog中的Mailboxes

芯片验证工程师 来源:芯片验证工程师 作者:芯片验证工程师 2022-12-13 09:24 次阅读

Mailboxes是进程间通信的另一种方式,但是比semaphores更强大,因为Mailboxes可以在两个进程之间交换消息。

数据可以由一个进程发送,由另一个进程获取,顾名思义就像是邮箱一样。

获取邮箱中信件的方式有两种:
1、一直等待信件的到来(blocking
2、如果没有信件就先去干其他事情,过一会儿再来看是否信件到了。(non-blocking

从Mailboxes中可以存放信件规模的角度,Mailboxes可以大致分为bounded Mailboxesunbounded Mailboxes

bounded Mailboxes就是指Mailboxes中能够容纳有限数量的信件,如果在Mailboxes满时写入会阻塞住,直到不满。unbounded Mailboxes可以容纳无限数量的信件。

Mailboxes也可以声明为只能存放某一类的信件。默认情况下,Mailboxes是无类型的,这意味着Mailboxes可以发送和接收任何不同类型的信件。

邮箱声明的语法是:

mailbox mbox;

Mailbox是一个SystemVerilog内置类,自然也提供了许多内置的方法:

1、new ()
创建一个mailbox,函数原型是:

functionnew()(intbound=0);

会返回一个mailbox句柄,默认bound是0,表示unbounded mailbox。

2、num ()
返回mailbox中信件的个数,函数原型是:

functionintnum();

3、put ()
blocking put(按照FIFO顺序),如果mailbox满了会阻塞进程,函数原型是:

task put (singular message)

4、try_put ( )
non-blocking put(按照FIFO顺序),如果mailbox满了不会阻塞进程,会返回值0。函数原型是:

functiontry_put(singularmessage);

5、get ()
blocking get(按照FIFO顺序),如果mailbox是空的,会一直blocking进程。函数原型是:

taskget(refsingularmessage);

6、try_get ( )
non-blocking get(按照FIFO顺序),如果mailbox是空的,不会阻塞进程,会返回值0。函数原型是:

function int try_get( ) (ref singular expression)

7、peek ( )
peek()不同于get(),peek会复制mailbox中的信件,而不会将信件从mailbox中删除。函数原型是:

taskpeek(refsingularmessage);

如果mailbox是空的,会一直block进程。
8、try_peek (),不过多言说,non-block peek。函数原型是:

function int try_peek ( ref singular expression)

示例:

module mB;
 bit [7:0] mem [0:3];
 int i, j, data;
 mailbox mbox; //declare a mailbox
 
 initial begin
 mbox = new (4); //create a bounded mailbox
 
 fork
 DMA_write;
 CPU_read; 
 join 
 end
 
 task DMA_write; 
 $display($stime,,, "DMA puts Mem Data into mbox");
 for (i=0; i < 4; i++) begin
 mem[i] = $urandom;
 $display($stime,,, "DMA WRITE[%0d] = %0d",i,mem[i]);
 mbox.put(mem[i]); //put data into the mailbox
 end
 endtask
 
 task CPU_read;
 $display($stime,,, "CPU retrieves Mem Data from mbox");
 for (j=0; j < 4; j++) begin
 mbox.get(data); //retrieve data from the mailbox
 $display($stime,,, "CPU READ[%0d] = %0d",i,data);
 end 
 endtask
 
endmodule

仿真log:

 0 DMA puts Mem Data into mbox
 0 DMA WRITE[0] = 36
 0 DMA WRITE[1] = 129
 0 DMA WRITE[2] = 9
 0 DMA WRITE[3] = 99
 0 CPU retrieves Mem Data from mbox
 0 CPU READ[0] = 36
 0 CPU READ[1] = 129
 0 CPU READ[2] = 9
 0 CPU READ[3] = 99
 V C S S i m u l a t i o n R e p o r t

上面这个例子首先声明了一个mailbox “mbox”,然后例化深度为4。

后面两个并行的进程“DMA_write”和“CPU_read” 。从打印log来看并不存在两个进程之间的冲突。

参数化Mailbox

如果希望在mailbox put和get时进行类型检查,可以显式地声明mailbox的类型。

module pMailbox; 
 typedef mailbox #(string) string_mbox;
 string s;
 
 initial begin
 static string_mbox SMbox = new;
 s = "hi";
 SMbox.put( s );
 $display("String 'put' is %s", s);
 SMbox.get( s ); 
 $display("String 'get' is %s", s);
 end
endmodule

仿真log:

String 'put' is hi
String 'get' is hi

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1328

    浏览量

    109507
  • System
    +关注

    关注

    0

    文章

    162

    浏览量

    36632
  • 进程
    +关注

    关注

    0

    文章

    196

    浏览量

    13909

原文标题:System Verilog中的Mailboxes

文章出处:【微信号:芯片验证工程师,微信公众号:芯片验证工程师】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Modelsim XE是否支持System Verilog

    information:-1.Does itsupport System verilog forverification?2. Code coverage support.3.Assertion support.Whichversionof Modelsim XE su
    发表于 11-27 14:20

    SYSTEM C中用verilog HDL和Firmaware编写了RTL

    CO_SIMULATION获取所有信号。我在SYSTEM C中用verilog HDL和Firmaware编写了RTL。但我没有得到任何适用于HW / FW协同仿真的文件。请帮我解决这个问题。谢谢
    发表于 04-17 10:09

    Vivado 2016.3对任何System Verilog功能的支持是否有所改变?

    你能否告诉我,自2014年4月以来Vivado 2016.3对任何System Verilog功能的支持是否有所改变?你能告诉我这段代码是否适用于2014.4?interface ibb_if
    发表于 05-14 08:57

    System Verilog常见问题及语言参考手册规范

    本文讨论了一些System Verilog问题以及相关的SystemVerilog 语言参考手册规范。正确理解这些规格将有助于System Verilog用户避免意外的模拟结果。
    发表于 12-11 07:19

    System Verilog问题和语言参考手册规范

    本文讨论了一些System Verilog问题以及相关的SystemVerilog 语言参考手册规范。正确理解这些规格将有助于System Verilog用户避免意外的模拟结果。
    发表于 12-24 07:07

    求大佬分享一些System Verilog的学习经验

    求大佬分享一些System Verilog的学习经验
    发表于 06-21 06:29

    Verilog Digital System Design

    This book is on the IEEE Standard Hardware Description Languagebased on the Verilog® Hardware
    发表于 07-23 08:59 0次下载
    <b class='flag-5'>Verilog</b> Digital <b class='flag-5'>System</b> Design

    VHDL,Verilog,System verilog比较

    本文简单讨论并总结了VHDL、VerilogSystem verilog 这三中语言的各自特点和区别 As the number of enhancements
    发表于 01-17 11:32 0次下载

    基于System Verilog中的随机化激励

    基于System Verilog中的随机化激励
    发表于 10-31 09:25 9次下载
    基于<b class='flag-5'>System</b> <b class='flag-5'>Verilog</b>中的随机化激励

    System Verilogverilog的对比

    SystemVerilog语言简介 SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE1364-2001 Verilog硬件描述语言(HDL),并对其进行了扩展,包括扩充
    的头像 发表于 09-28 17:12 3030次阅读

    学会这些System Verilog方法,芯片验证入门没问题

    一个掌握Verilog语言的工程师初次看SystemVerilog都会有这样的感受,这就是Verilog啊,很容易啊,So easy啊。没错,确实是这样,System Verilog
    的头像 发表于 12-09 15:08 2757次阅读

    浅谈System Verilog的DPI机制

    System Verilog(SV)把其他编程语言统一成为外语,Foreign Programming Language(FPL)。
    的头像 发表于 05-23 15:39 1328次阅读
    浅谈<b class='flag-5'>System</b> <b class='flag-5'>Verilog</b>的DPI机制

    谈谈system Verilog 和C的交互

    PLI全称 Program Language Interface,程序员可以通过PLI在verilog中调用C函数,这种访问是双向的。这些用户定义的系统任务和函数的名称必须以美元符号"$" 开头。大家用得比较多的PLI函数有$display,$finish等。
    发表于 05-31 09:59 454次阅读
    谈谈<b class='flag-5'>system</b> <b class='flag-5'>Verilog</b> 和C的交互

    谈谈Verilog/System Verilog和C的几种交互模式

    PLI全称 Program Language Interface,程序员可以通过PLI在verilog中调用C函数,这种访问是双向的。
    的头像 发表于 06-01 17:32 1078次阅读
    谈谈<b class='flag-5'>Verilog</b>/<b class='flag-5'>System</b> <b class='flag-5'>Verilog</b>和C的几种交互模式

    System Verilog的概念以及与Verilog的对比

    Verilog模块之间的连接是通过模块端口进行的。 为了给组成设计的各个模块定义端口,我们必须对期望的硬件设计有一个详细的认识。 不幸的是,在设计的早期,我们很难把握设计的细节。 而且,一旦模块
    的头像 发表于 06-12 10:05 997次阅读