0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

SystemVerilog中的Semaphores

芯片驗證工程師 ? 來源:芯片驗證工程師 ? 作者:芯片驗證工程師 ? 2022-12-12 09:50 ? 次閱讀

SystemVerilog中Semaphore(旗語)是一個多個進(jìn)程之間同步的機(jī)制之一,這里需要同步的原因是這多個進(jìn)程共享某些資源。

舉一個場景:SoC中的,CPUDMA都希望去訪問相同地址的內(nèi)存空間。實際的情況可能是CPU的訪問覆蓋DMA的訪問,或者相反。

簡而言之,這其中存在著沖突,這也是SystemVerilog中Semaphore的應(yīng)用場景。

如果CPU訪問某個地址,CPU會先鎖住這塊地址空間,等到CPU訪問完成才會解鎖,這個互斥鎖可以通過Semaphore來實現(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拿到互斥鎖后,再讀取這些值。因為無法保證開始時刻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

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10699

    瀏覽量

    209352
  • Verilog
    +關(guān)注

    關(guān)注

    28

    文章

    1333

    瀏覽量

    109713
  • System
    +關(guān)注

    關(guān)注

    0

    文章

    163

    瀏覽量

    36744
  • dma
    dma
    +關(guān)注

    關(guān)注

    3

    文章

    552

    瀏覽量

    99927

原文標(biāo)題:SystemVerilog中的Semaphores

文章出處:【微信號:芯片驗證工程師,微信公眾號:芯片驗證工程師】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    SystemVerilog的Virtual Methods

    SystemVerilog多態(tài)能夠工作的前提是父類的方法被聲明為virtual的。
    發(fā)表于 11-28 11:12 ?626次閱讀

    SystemVerilog的“const”類屬性

    SystemVerilog可以將類屬性聲明為常量,即“只讀”。目的就是希望,別人可以讀但是不能修改它的值。
    發(fā)表于 11-29 10:25 ?2007次閱讀

    SystemVerilog的聯(lián)合(union)介紹

    SystemVerilog ,聯(lián)合只是信號,可通過不同名稱和縱橫比來加以引用。
    的頭像 發(fā)表于 10-08 15:45 ?1090次閱讀
    <b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的聯(lián)合(union)介紹

    systemverilog學(xué)習(xí)教程

    systemverilog的一些基本語法以及和verilog語言之間的區(qū)別。
    發(fā)表于 04-01 14:24

    Semaphores_Mutexes

    Semaphores_Mutexes
    發(fā)表于 01-25 10:34

    SystemVerilog Assertion Handbo

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    發(fā)表于 07-22 14:08 ?188次下載

    SystemVerilog的斷言手冊

    SystemVerilog Assertion Handbook1 ROLE OF SYSTEMVERILOG ASSERTIONSIN A VERIFICATION METHODOLOGY
    發(fā)表于 07-22 14:12 ?20次下載

    SystemVerilog$cast的應(yīng)用

    SystemVerilog casting意味著將一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型。在將一個變量賦值給另一個變量時,SystemVerilog要求這兩個變量具有相同的數(shù)據(jù)類型。
    的頭像 發(fā)表于 10-17 14:35 ?2580次閱讀

    SystemVerilog的操作方法

    SystemVerilog提供了幾個內(nèi)置方法來支持?jǐn)?shù)組搜索、排序等功能。
    的頭像 發(fā)表于 10-31 10:10 ?2500次閱讀

    SystemVerilog可以嵌套的數(shù)據(jù)結(jié)構(gòu)

    SystemVerilog除了數(shù)組、隊列和關(guān)聯(lián)數(shù)組等數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)還可以嵌套。
    的頭像 發(fā)表于 11-03 09:59 ?1465次閱讀

    SystemVerilog的package

    SystemVerilog packages提供了對于許多不同數(shù)據(jù)類型的封裝,包括變量、task、function、assertion等等,以至于可以在多個module中共享。
    的頭像 發(fā)表于 11-07 09:44 ?1099次閱讀

    SystemVerilog的struct

    SystemVerilog“struct”表示相同或不同數(shù)據(jù)類型的集合。
    的頭像 發(fā)表于 11-07 10:18 ?2226次閱讀

    SystemVerilog的Shallow Copy

    SystemVerilog的句柄賦值和對象復(fù)制的概念是有區(qū)別的。
    的頭像 發(fā)表于 11-21 10:32 ?771次閱讀

    帶你了解SystemVerilog的關(guān)聯(lián)數(shù)組

    SystemVerilog,我們知道可以使用動態(tài)數(shù)組實現(xiàn)數(shù)組元素個數(shù)的動態(tài)分配,即隨用隨分
    的頭像 發(fā)表于 06-09 09:46 ?6757次閱讀
    帶你了解<b class='flag-5'>SystemVerilog</b><b class='flag-5'>中</b>的關(guān)聯(lián)數(shù)組

    Systemverilog的Driving Strength講解

    systemverilog,net用于對電路連線進(jìn)行建模,driving strength(驅(qū)動強(qiáng)度)可以讓net變量值的建模更加精確。
    的頭像 發(fā)表于 06-14 15:50 ?1259次閱讀
    <b class='flag-5'>Systemverilog</b><b class='flag-5'>中</b>的Driving Strength講解