加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Systemverilog中DPI使用指南--4

(2011-11-15 13:10:00)
标签:

杂谈

分类: ASIC
 

1.1.1 示例1

import "DPI" function void mydisplay(int a[2][2],logic b[4]);

void mydisplay(int a[2][2],svLogic b[4])

svLogic占用一个字节。C中的0123分别对应Verilog中的01zx

1.1.2 Chandle

// SystemVerilog side, test.sv

program p1;

chandle memory;

import "DPI" function chandle int_new(int size);

import "DPI" function void put_int_data(int size, chandle memory);

initial begin

int size = 10;

$display("SV: call DPI to allocate memory for %0d int",size);

memory = int_new(size);

$display("SV: call DPI to  initialize the memory for %0d int",size);

put_int_data(size,memory);

end

endprogram

#include <svdpi.h>

#include <stdlib.h>

#include <stdio.h>

int i;

void * int_new(int size) {

int *memory;

memory = (int *)malloc(size*sizeof(int));

printf("C/C++: allocate memory for %0d int in int_new\n",size);

return memory;

}

void put_int_data(int size,void* memory) {

int *temp;

temp = (int *) memory;

for(i=0;i<size;i++) {

temp[i]=i;

printf("C/C++: memory[%0d] is set to %0d\n",i,temp[i]);

  }

}

1.2 Packed Array Data Type Mapping

svBitVecVal表示2状态的值。svLogicVecVal表示4状态的值。这些值按照32位的数组来组织。

1.2.1 示例1

// SystemVerilog side, test.sv

program p1;

   logic[63:0] a;

   import "DPI" function void mydisplay(logic[63:0] a);

   initial begin

      a[31:0] = 32'b0;

      a[63:32] = 32'hffff_ffff;

      mydisplay(a);

   end

endprogram

#include <svdpi.h>

void mydisplay(const svLogicVec32 a[2]) {

   printf("a[0]=%x\n",a[0].d);

   printf("a[1]=%x\n",a[1].d);

}

1.2.2 示例2

// SystemVerilog side, test.sv

program p1;

   integer i;

   import "DPI" function void mydisplay(integer i);

   initial begin

      i = 32'h0000_0101;

      $display("SV: %h",i);

      mydisplay(i);

      i = 32'h0000_zzxx;

      $display("SV: %h",i);

      mydisplay(i);

   end

endprogram

#include <svdpi.h>

void mydisplay(svLogicVec32 *i) {

      io_printf("C: i.d is %d\n",i->d);

io_printf("C: i.c is %d\n",i->c);

}

1.2.3 示例3

Packed Struct

// SystemVerilog side, test.sv

program p1;

   typedef struct packed {bit[1:0] a; bit b; bit c;} ps;

   import "DPI" function void mydisplay(ps p);

   initial begin

      ps val1;

      val1 = 4'hb;

      mydisplay(val1);

   end

endprogram

#include <svdpi.h>

void mydisplay(svBitVec32 p) {

   printf("p is %x\n",p);

}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有