做ASIC驗證的童鞋們可以學學SystemVerilog DPI,它允許Verilog代碼直接調用C或者C++子程序,且比Verilog PLI簡單。與PLI的比較可參考如下文章:
中文:http://www.moditek.com/expofile/stuart-pli-dpi.pdf
英文:http://www.sutherland-hdl.com/papers/2004-SNUG-paper_Verilog_PLI_versus_SystemVerilog_DPI.pdf
最近使用DPI搭了個基於NIST標准的RM以驗證硬件實現后的加密模塊blockcipher,import到testbench中的是Crypto++ Library里不同模式(ECB、CBC等)的加密函數,這樣便可將DUT輸出和RM輸出進行compare了。
初學者一般可以用cadence自帶的例子進行學習,例子在cadence工具的安裝目錄/cadence/INCISIV111/doc/dpiEngrNtbk下,有個dpiEngrNtbkp.pdf簡單介紹了各個例子是如何運行的。
在運行cadence自帶的dpi的實例時,按照pdf說明,有“一步式”(irun)和“四步式”(ncvlog, ncelab, gcc, ncsim)兩種運行方式。“四步式”的時候,有時會出錯,遇到下面的提示:
Unable to load the default library libdpi. ./libdpi.so: cannot open shared object file:No such file or directory.
顯然是c語言文件生成的so文件沒有被ncsim正確load,那么問題出在哪兒呢?
問題出現在gcc的編譯選項上!linux服務器一般是64位的,因此用gcc編譯出來的.so共享庫也是64位的,而dpi這個程序本身是32位的,因此程序運行后找不到.so共享庫。只要在pdf上的gcc編譯選項加上"-m32",應該就可以了,如下:
gcc -m32 -fPIC -shared -o libdpi.so adder.c -I $CDS_INST_DIR/tools/inca/include($CDS_INST_DIR為Cadence INCISIV的安裝目錄)
這里簡單把相應仿真命令羅列一下。
“一步式”的命令如下:
irun -sv top.v adder.c
“四步式”的命令如下:
1 ncvlog -sv top.v 2 ncelab -access+RWC work.topincident 3 gcc -m32 -fPIC -shared -o libdpi.so adder.c -I $CDS_INST_DIR/tools/inca/include 4 ncsim work.top
更多DPI請參考:http://www.doulos.com/knowhow/sysverilog/tutorial/dpi/ 以及SystemVerilog LRM。