SystemVerilog中Semaphore(旗語)是一個多個進(jìn)程之間同步的機(jī)制之一,這里需要同步的原因是這多個進(jìn)程共享某些資源。
舉一個場景:SoC中的,CPU和DMA都希望去訪問相同地址的內(nèi)存空間。實(shí)際的情況可能是CPU的訪問覆蓋DMA的訪問,或者相反。
簡而言之,這其中存在著沖突,這也是SystemVerilog中Semaphore的應(yīng)用場景。
如果CPU訪問某個地址,CPU會先鎖住這塊地址空間,等到CPU訪問完成才會解鎖,這個互斥鎖可以通過Semaphore來實(shí)現(xiàn)。在CPU鎖住這個塊地址空間期間,DMA是無法訪問的。
semaphore的相關(guān)用法如下:
1、聲明一個旗語。
semaphore semaphore_name;
2、聲明旗語中互斥鎖的個數(shù),默認(rèn)是0。
function new (int keyCount = 0);
3、獲取互斥鎖,默認(rèn)是1。
task get (int keyCount = 1);
4、回收互斥鎖,默認(rèn)是1.
function void put (int keyCount = 1);
5、獲取互斥鎖,默認(rèn)是1。和get()的區(qū)別是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 endtask endmodule
上面的例子中有兩個并行的進(jìn)程DMA_write和CPU_read。
一開始DMA拿到互斥鎖后,寫入4次。后面CPU拿到互斥鎖后,再讀取這些值。因?yàn)闊o法保證開始時刻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
審核編輯:湯梓紅
-
cpu
+關(guān)注
關(guān)注
68文章
10863瀏覽量
211782 -
Verilog
+關(guān)注
關(guān)注
28文章
1351瀏覽量
110101 -
System
+關(guān)注
關(guān)注
0文章
165瀏覽量
36949 -
dma
+關(guān)注
關(guān)注
3文章
561瀏覽量
100587
原文標(biāo)題:SystemVerilog中的Semaphores
文章出處:【微信號:芯片驗(yàn)證工程師,微信公眾號:芯片驗(yàn)證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論