打造IC人才
科技生态圈
发布时间:2022-12-14
来源:IC修真院
Mailboxes是进程间通信的另一种方式,但是比semaphores更强大,因为Mailboxes可以在两个进程之间交换消息。
数据可以由一个进程发送,由另一个进程获取,顾名思义就像是邮箱一样。
获取邮箱中信件的方式有两种:
1、一直等待信件的到来(blocking)
2、如果没有信件就先去干其他事情,过一会儿再来看是否信件到了。(non-blocking)
从Mailboxes中可以存放信件规模的角度,Mailboxes可以大致分为bounded Mailboxes和unbounded Mailboxes。
bounded Mailboxes就是指Mailboxes中能够容纳有限数量的信件,如果在Mailboxes满时写入会阻塞住,直到不满。unbounded Mailboxes可以容纳无限数量的信件。
Mailboxes也可以声明为只能存放某一类的信件。默认情况下,Mailboxes是无类型的,这意味着Mailboxes可以发送和接收任何不同类型的信件。
邮箱声明的语法是:
Mailbox是一个SystemVerilog内置类,自然也提供了许多内置的方法:
1、new ()
创建一个mailbox,函数原型是:
会返回一个mailbox句柄,默认bound是0,表示unbounded mailbox。
2、num ()
返回mailbox中信件的个数,函数原型是:
3、put ()
blocking put(按照FIFO顺序),如果mailbox满了会阻塞进程,函数原型是:
4、try_put ( )
non-blocking put(按照FIFO顺序),如果mailbox满了不会阻塞进程,会返回值0。函数原型是:
5、get ()
blocking get(按照FIFO顺序),如果mailbox是空的,会一直blocking进程。函数原型是:
6、try_get ( )
non-blocking get(按照FIFO顺序),如果mailbox是空的,不会阻塞进程,会返回值0。函数原型是:
7、peek ( )
peek()不同于get(),peek会复制mailbox中的信件,而不会将信件从mailbox中删除。函数原型是:
如果mailbox是空的,会一直block进程。
8、try_peek (),不过多言说,non-block peek。函数原型是:
示例:
仿真log:
上面这个例子首先声明了一个mailbox “mbox”,然后例化深度为4。
后面两个并行的进程“DMA_write”和“CPU_read” 。从打印log来看并不存在两个进程之间的冲突。
参数化Mailbox
如果希望在mailbox put和get时进行类型检查,可以显式地声明mailbox的类型。
仿真log:
相关推荐:
推荐阅读
2023-03-20
2022-10-10
2023-01-10
2022-08-01
2023-06-07