sv中义引入了直接编程接口dpi(direct programming interface),他能更简单的连接C,C++,或者其他非verilog语言。一旦声明或者使用import语句导入了一个C子程序,就可以调用它。C代码也可以很方便的调用verilog中的子程序。应用场景主要体现在:
(1)我们知道,在模块级乃至子系统级的验证,使用SV就完全够用了,而在更上面的层级,例如系统级,多采用大量的C代码组成。那么为了完成测试用例从子系统到系统级的复用,我们最好在子系统级开始就有意识地建立支持C测试的环境,并且使用一些基于C的测试用例,这样才能使得整体具有更好的复用性。
(2)处理器的需要。子系统测试时,不一定本身自带了处理器的硬件实例(Verilog编写的),因此在构建子系统时还要考虑如何模拟外部处理器对子系统的访问行为。
sv与c之间传递的最基本的数据类型就是int类型,他是一个双状态,32位的数据类型。下面举一个例子怎么在sv中调用C的子程序。
例:调用factory()函数
import "DPI-C" function int factory(input int i);
program automatic test;
initial begin
for(int i =1;i<10;i++) begin
$display("%0d = %0d ",i,factory(i));
end
end
endprogram
使用时的注意事项有:
SV和C之间的数据类型不是完全一致的,所以肯定需要转换,对应关系如下:
值得注意的是有些映射关系并不完全准确,例如bit映射的svbit,而svbit又会映射为unsigned char类型,但这样一来容易在变量的高位写入非法的数据值?。
在C的一侧,如果需要引用sv中的函数,则只需要extern void sv_function();就可以了
?本文参考:DPI-C SV与C语言数据类型映射-CSDN博客?