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]);
}
}
输出:



本文介绍了C/C++与SystemVerilog之间的变量映射规则,重点讲解了SVtypeCequivalent类型和SVOpenArrayHandle的使用,通过实例展示了如何在两者间传递和处理不同类型的数组,如bitvector和开放数组。
727

被折叠的 条评论
为什么被折叠?



