做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。