打造IC人才
科技生态圈

System Verilog中的Mailboxes

发布时间:2022-12-14

来源:IC修真院

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

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

获取邮箱中信件的方式有两种:

1、一直等待信件的到来(blocking)

2、如果没有信件就先去干其他事情,过一会儿再来看是否信件到了。(non-blocking)

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

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

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

邮箱声明的语法是:

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

1、new ()

创建一个mailbox,函数原型是:

image

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

2、num ()

返回mailbox中信件的个数,函数原型是:

image

3、put ()

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

image

4、try_put ( )

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

image

5、get ()

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

image

6、try_get ( )

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

image

7、peek ( )

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

image

如果mailbox是空的,会一直block进程。

8、try_peek (),不过多言说,non-block peek。函数原型是:

image

示例:

imageimage仿真log:

image

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

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

参数化Mailbox

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

image

仿真log:

image

相关推荐:

数字ic验证|UVM uart模块总结

数字ic验证|SV实验之异步FIFO总结

面试必备的IC项目资源

推荐阅读

换一换