DPI
systemverilog提供DPI(Direct Programming Interface),这是一个直接编程接口,可以使得SV和其它的外部语言进行交互,外部的语言包括C,C++,systemC。
其它语言的实现方法,可以在SV中调用,称为import method。而其它语言执行SV实现的方法,成为export method。故导入导出都是针对SV而言。SV可以和其他的语言通过参数的传递和返回来传输数据。
import declaration的用法如下:
import “DPI-C” function int calc_parity(input int a);
export declaration的用法如下:
export “DPI” my_function= function myfunction
// SystemVerilog File
module dpi_tb;
import "DPI-C" function void c_method();
initial begin
$display("Before calling C Method");
c_method();
$display("After calling C Method");
end
endmodule
#include <stdio.h>
#include <stdlib.h>
extern void c_method()
{
printf(" Hello Wordld....!\n");
}
执行结果如下,
如果想在C中运行SV,代码修改如下:
执行结果如下:
结构体
sv提供的结构体可以把多种类型的数据组合在一起,这样就可以把他们看成一个整体。其语法如下,使用typedef可以更好的声明结构体变量,其中packed是可以选择的。
typedef struct packed{
type_1 var_1;
type_2 var_2;
type_3 var_3;
} struct_name;
module struct_tb;
typedef struct packed{
bit [7:0] addr ;
bit valid ;
bit [31:0] data ;
} mem_pkt;
mem_pkt pkt;
initial begin
//initializing struct
pkt = '{8'h6, 1'b1, 32'hC001_0FAB};
$display("pkt = %p", pkt);
//Change the struct field value
pkt.addr = 8'h8;
$display("pkt = %p", pkt);
//Change the struct field value
pkt.data = 32'hFFF0_0FFF;
$display("pkt = %p", pkt);
end
endmodule
在上面的例子中,结构体的初始化采用单引号加大括号实现的,访问结构体的变量可以通过.操作符,若想打印整个结构体,可以通过%p。执行结果如下:
同时是组织数据,数组是相同类型的数据集合,而struct可以包含不同的类型。
enum
将变量赋值给枚举类型是非法的,需要进行类型转换。
其执行结果如下:(报错了)
解决办法是我们可以通过$cast函数把常数4转化位枚举变量。
执行结果如下:
需要指出的是枚举类型还可以指定logic,bit和int类型,我们只需在enum后增加修饰就可以。
语法完结
systemverilog的语法学习到这里结束了,后期会多多阅读学习别人写的SV代码。加油,星夜赶路人!!!