c model 与 sv 交互时需要定义一对函数,函数中的变量需要一一对应。因此,总结一下c/c++端的变量与systemverilog端的变量对应关系。
SV type | C equivalent | |
byte | char | |
short int | short int | |
int | int | |
long int | long int | |
real | double | |
string | char* | |
string[n] | char* | |
chandle | void* | |
bit | svBit/unsigned char | |
bit[n:0] | svBitVec32 | //packed 数组 |
logic | svLogic/unsigned char | |
reg | svLogic | |
logic[n:0] | svLogicVec32 | |
reg[n:0] | svLogicVec32 | |
int[] | svOpenArrayHandle | |
byte[l | svOpenArrayHandle | |
shortint[] | svOpenArrayHandle | |
longint[] | svOpenArrayHandle | |
bit[n:0] array[] | svOpenArrayHandle | //packed unpacked 混合数组 |
logic[n:0] array[] | svOpenArrayHandle | //packed unpacked 混合数组 |
其中svOpenArrayHandle较为复杂,需要调用库函数对其处理。
以 bit[36:0] arr [] 为示例:
sv中:
import "DPI-C" task show(input bit[36:0] arr []); //for learn
sv中调用部分代码:
arr = new[26];
for(i = 0;i<26;i++)begin
automatic int j = i;
arr[j] ='h1_0000_0000 + (j<<16);
end
show(arr);
c/c++中:
void show(const svOpenArrayHandle h){
int i;
svBitVec32 arr[SV_CANONICAL_SIZE(37)];
for(i = svLow(h,1);i<=svHigh(h,1);i++){
svBitPackedArrRef ptr = (svBitPackedArrRef)svGetArrElemPtr1(h,i);
svGetBitVec32(arr,ptr,37);
printf("%x\t",arr[1]);
printf("%x\n",arr[0]);
}
}
输出: