真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SV中怎么調(diào)用C函數(shù)

這篇文章給大家介紹SV中怎么調(diào)用C函數(shù),內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

成都創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供新賓網(wǎng)站建設(shè)、新賓做網(wǎng)站、新賓網(wǎng)站設(shè)計、新賓網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、新賓企業(yè)網(wǎng)站模板建站服務(wù),10年新賓做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。

第一種方式并不是嚴格意義上的SV和C的對接,只是通過命令行執(zhí)行了C程序。比如我們寫了一個hello world的c程序:

int main(){

       printf(“hello world!\n”);

return 0;

 

}

我們將其編譯為可執(zhí)行文件gcc -o hello hello.c

我們就可以在我們的SV函數(shù)中直接執(zhí)行:

function void exe();

       $system(“./hello”);

Endfunction

除了這個方式,SV還提供了和C/C++直接的接口DPI。DPI接口允許用戶用C編寫程序,并和SV實現(xiàn)對接,也可以用SV寫程序,將SV程序?qū)С龅絚中。二者實現(xiàn)了相互調(diào)用。如何要在SV中使用自己定義的C函數(shù),需要在SV中導(dǎo)入函數(shù)。比如:

module Bus(input In1, output Out1);
  import "DPI" function void slave_write(input int address,
                                         input int data);
  export "DPI" function write;  // Note – not a function prototype

  // This SystemVerilog function could be called from C
  function void write(int address, int data);
    // Call C function
    slave_write(address, data); // Arguments passed by copy
  endfunction
  ...
endmodule

C中為:

#include "svdpi.h"
extern void write(int, int);    // Imported from SystemVerilog
void slave_write(const int I1, const int I2)

  buff[I1] = I2;
  ...
}

C函數(shù)slave_write在SV中被調(diào)用,其有兩個參量 address和data。在C函數(shù)中通常要包含兩個頭文件:svdpi.h和svdpi_src.h。

C和SV的數(shù)據(jù)類型有以下幾種對應(yīng)關(guān)系:

SV中怎么調(diào)用C函數(shù)  

我們需要注意SV和C之間參量傳遞有兩種方式,一種是值傳遞,比如byte-char,shortint-short int等,另外一種方式是通過指針傳遞,比如在SV中packed和unpacked的數(shù)組,是通過引用傳遞到C的,那么C中就使用指針來進行接收。比如bit[n:0]作為packed數(shù)組,傳遞到C中是用svBitVecVal*來接收的,svBitVecVal是一個宏定義,實際上就是32bit數(shù)據(jù)。在這里需要注意的是,n bit的SV數(shù)據(jù)在C中是以32bit數(shù)據(jù)存放的,按照小端排列。比如bit[127:0] a,對應(yīng)的C中數(shù)據(jù)svBitVecVal* b,有以下對應(yīng)關(guān)系:

a[31:0] = b[0]

a[63:32] = b[1]

這點初學者很容易掉坑里,我一開始在傳遞這個變量的時候以為是一個svBitVecVal存儲1bit數(shù)據(jù)。在SV測的多維數(shù)據(jù)也都可以在C中使用1維指針接收,比如有以下函數(shù):

Void write(svBitVecVal* data){

}

SV中可以為:

Import “DPI-C” function void write(bit[127:0] data[16][16]);

這樣在C中讀寫data數(shù)據(jù)的時候就需要通過指針來確認數(shù)據(jù)位置。指針指向了數(shù)據(jù)data的第一個32bit數(shù)據(jù),即data[0][0][31:0],之后數(shù)據(jù)往后增加指針即可得到。

對于unpacked的數(shù)組數(shù)據(jù),在C中可以使用指針直接訪問,但是在packed中的數(shù)據(jù),卻只允許使用定義的函數(shù)來讀寫。這些函數(shù)有:

svBit svGetSelectBit(const svBitPackedArrRef s, int i);

svLogic svGetSelectLogic(const svLogicPackedArrRef s, int i);

void svPutSelectBit(svBitPackedArrRef d, int i, svBit s);

void svPutSelectLogic(svLogicPackedArrRef d, int i, svLogic s);

 

/* canonical <-- actual */

void svGetPartSelectBit(svBitVec32* d, const svBitPackedArrRef s, int i,

int w);

svBitVec32 svGetBits(const svBitPackedArrRef s, int i, int w);

svBitVec32 svGet32Bits(const svBitPackedArrRef s, int i); // 32-bits

unsigned long long svGet64Bits(const svBitPackedArrRef s, int i); // 64-bits

void svGetPartSelectLogic(svLogicVec32* d, const svLogicPackedArrRef s, int i,

int w);

/* actual <-- canonical */

void svPutPartSelectBit(svBitPackedArrRef d, const svBitVec32 s, int i,

int w);

void svPutPartSelectLogic(svLogicPackedArrRef d, const svLogicVec32 s, int i,

int w);

除了可以向C中傳遞固定維度數(shù)組,還可以傳遞不固定維度數(shù)組,即動態(tài)數(shù)據(jù)。在C中通過svOpenArrayHandle來獲取這些數(shù)據(jù),這些數(shù)據(jù)的操作也需要通過一些函數(shù),不能直接操作。比如以下函數(shù)可以獲得動態(tài)數(shù)組的位置:

int svLeft(const svOpenArrayHandle h, int d);

int svRight(const svOpenArrayHandle h, int d);

int svLow(const svOpenArrayHandle h, int d);

int svHigh(const svOpenArrayHandle h, int d);

比如定義一個數(shù)組bit[3:0] data[3:9],那么

svLeft(data, 1)是3,svRight(data, 1)是9。

在SV中有如下形式:

Import “DPI-C” function void write(bit[3:0] data[])

C中為:

Void write(svOpenArrayHandle data)

   

關(guān)于SV中怎么調(diào)用C函數(shù)就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


網(wǎng)站欄目:SV中怎么調(diào)用C函數(shù)
網(wǎng)址分享:http://weahome.cn/article/gpesoj.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部