SystemVerilog中的Semaphores

systemverilog中semaphore(旗语)是一个多个进程之间同步的机制之一,这里需要同步的原因是这多个进程共享某些资源。
举一个场景:soc中的,cpu和dma都希望去访问相同地址的内存空间。实际的情况可能是cpu的访问覆盖dma的访问,或者相反。
简而言之,这其中存在着冲突,这也是systemverilog中semaphore的应用场景。
如果cpu访问某个地址,cpu会先锁住这块地址空间,等到cpu访问完成才会解锁,这个互斥锁可以通过semaphore来实现。在cpu锁住这个块地址空间期间,dma是无法访问的。
semaphore的相关用法如下:
1、声明一个旗语。
semaphore semaphore_name;  
2、声明旗语中互斥锁的个数,默认是0。
function new (int keycount = 0);  
3、获取互斥锁,默认是1。
task get (int keycount = 1);  
4、回收互斥锁,默认是1.
function void put (int keycount = 1);  
5、获取互斥锁,默认是1。和get()的区别是try_get ( )是non-blocking的。
function int try_get (int keycount = 1);  
semaphore示例:
module sema; bit [7:0] mem [0:3]; int i, data; semaphore s1; initial begin s1 = new (1); //create semaphore with 1 key fork dma_write; cpu_read; join end task dma_write; if (s1.try_get(1)) //non-blocking. locks (gets) $display($stime,,, dma gets a key from semaphore); else wait (s1.try_get(1)); //dma writes data for (i=0; i < 4; i++) begin mem[i] = $urandom; $display($stime,,, dma write[%0d] = %0d,i,mem[i]); end #5; //do something else s1.put(1); //dma releases (puts) the key $display($stime,,, dma puts the key into semaphore); endtask task cpu_read; #0; s1.get (1); //wait to get the key - blocking $display($stime,,, cpu gets the key from semaphore); //cpu reads data for (i=0; i < 4; i++) begin data = mem[i]; $display($stime,,, cpu read[%0d] = %0d,i,data); end endtaskendmodule  
上面的例子中有两个并行的进程dma_write和cpu_read。
一开始dma拿到互斥锁后,写入4次。后面cpu拿到互斥锁后,再读取这些值。因为无法保证开始时刻dma先拿到互斥锁,还是cpu拿到互斥锁,所以加上了#0。
仿真log:
0 dma gets a key from semaphore 0 dma write[0] = 36 0 dma write[1] = 129 0 dma write[2] = 9 0 dma write[3] = 99 5 dma puts the key into semaphore 5 cpu gets the key from semaphore 5 cpu read[0] = 36 5 cpu read[1] = 129 5 cpu read[2] = 9 5 cpu read[3] = 99 v c s s i m u l a t i o n r e p o r t  


阿里巴巴专项投资于高端智能纯电汽车项目
国产操作系统完成对龙芯平台的适配 将打破“缺芯少魂”的局面
由室温超导材料研究,看功率放大器在材料测试领域中的应用
IIC-China 2010参展商展前专访:上海华桑电子
对于定时开关而言,它最高可以带动多大功率的电器
SystemVerilog中的Semaphores
SDL-109A-T1信号中断放大器参数介绍
中压进线保护装置
三大运营商今年将在5G方面的投入有望超过400亿元
改进的高速印制电路板布线实践指南
应用于MIPI C-PHY v1.0-三线共模SDMM0906系列
中国移动携手华为助力解放军总医院成功完成了全国首例5G远程手术
路向何方?后工业时代台湾电子业转型实录
AI全球最具影响力学者榜单 中国学者占比9.3%位于第二梯队
红米Note 4X首发当天!你抢到了吗?京东好评度百分之百
SystemVerilog中的类的赋值
NE555时基集成电路的实验与制作,NE555 introduction
华东师大研发可伸缩离子导电水凝胶传感器,可应用于人体运动监测中
光电耦合器电路图大全(可控硅/稳压电路/隔离耦合电路详解)
QPA2225 Ka波段0.4瓦GaN驱动放大器QORVO