美文网首页工作生活
dpi-c的一个例子

dpi-c的一个例子

作者: Poisson_Lee | 来源:发表于2019-06-29 15:25 被阅读0次

c程序文件名float_function.c

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <float.h>
#include "svdpi.h"

#ifndef UFLOAT_H
#define UFLOAT_H
union UFLOAT {
  float f;
  int    u;
}
#endif

double powtwo(double in) {
  return pow(2.0, in);
}

int intpowtwo(int in) {
  union UFLOAT u_in;
  union UFLOAT u_out;
  u_in.u = in;
  u_out.f = pow(2.0, u_in.f);
  return u_out.u;
}

sv程序文件名dpi_test.sv

program dpi_test();
  import "DPI-C" function real powtwo(intput real in);
  import "DPI-C" function int intpowtwo(input int in);

initial begin
  bit[31:0]  result_bin;
  real      result_float;
  bit[31:0]  exp_bin[$];
  real        exp_float[$];
  
  exp_bin.push_back(32'h3f80_0000);
  exp_bin.push_back(32'h3f00_0000);
  exp_bin.push_back(32'h4000_0000);
  exp_bin.push_back(32'hbf80_0000);
  exp_bin.push_back(32'hbf00_0000);
  exp_bin.push_back(32'hc000_0000);

  exp_float.push_back(1.0);
  exp_float.push_back(0.5);
  exp_float.push_back(2.0);
  exp_float.push_back(-1.0);
  exp_float.push_back(-0.5);
  exp_float.push_back(-2.0);

foreach(exp_bin[i]) begin
  result_float = powtwo(exp_float[i]);
  $display("2^was  %f is %f", exp_float[i], result_float);
  result_bin = intpowtwo(exp_bin[i]);
  $display("2^was  %h is %f", exp_bin[i], result_bin);
  $display("====================");
end

end
endprogram

vcs执行命令
vcs -full64 -sverilog -R float_function.c dpi_test.sv

说明一下这个例子。
sv的rm中有时需要调用C的程序,但是sv和c的数据类型不是完全一一对应的。
sv中用到最多的数据类型是bit[31:0],bit[15:0]等bit向量型数据,但C中没有对应的数据类型。
现在在sv要实现一个功能,是2^x,其中x是浮点数,返回值也是浮点数,但是在sv里的浮点数是IEEE754里的数据格式,不是0.5,而是32‘h3f00_0000(以单精度为例),即验证环境里的数据是bit[31:0]类型数据根据IEEE754来表示浮点数。
现在打算用c中的库函数pow,但是这个函数的输入输出类型是double,比如输入0.5,输出1.414214,如果直接将sv中的32‘h3f00_0000入C的pow程序,显然pow会把这个数当成很大的一个数。
如何实现转换呢?这里我通过采用C中的联合类型的数据结构,因为sv中德数据已经是32bit的数据形式了,在C中,int型数据是32bit的,所以我在C程序中实现一个intpowtwo的函数,输入输出都是int型,即32bit的数据,在测试程序中,在这个函数里的声明两个UFLOAT型变量,分别处理输入和输出数据的格式转换。从而得到了我想要的结果。

Screenshot 2019-06-29 at 3.37.43 PM.png

相关文章

  • dpi-c的一个例子

    c程序文件名float_function.c sv程序文件名dpi_test.sv vcs执行命令vcs -ful...

  • 2.1 dpi/uvm_hdl.svh

    import "DPI-C" context function int uvm_hdl_check_path(st...

  • 一个死锁的例子

    先举个栗子。 产生死锁的原因主要是: 系统资源不足 资源分配不当 推进顺序不合适 产生死锁的四个必要条件: 互斥:...

  • 一个getBoundingClientRect()的例子

    最近发现一个问题,MouseEvent.clientX、MouseEvent.clientY获取到的坐标点是以当前...

  • 一个负面例子

    那一下午,我们都在外面,而我更在她们之外。 她们是我的初中同学,我们一直都持有联系,断断续续。那天是lj同学的结...

  • 一个例子

    每两周的一个周四是一个比较特别的日子,争执,妥协,痛苦,火花,所有的一切都是为了一个更好的产品。一天下来有点筋疲力...

  • condition一个不错的例子

    https://www.cnblogs.com/evertriely/p/4912573.html

  • 一个系统调用的例子

    我们经常利用各种 shell 命令(比如,cat,head),以及各种编程语言中IO方法(比如 go 中的 iou...

  • 一个Android Socket的例子

    一个Android Socket的例子: www.cnblogs.com/devinzhang/archive/2...

  • 一个典型的MVVM例子

    发现此例子很好的展示了MVVM的模式,并且很容易理解。附上GitHub地址:https://github.com/...

网友评论

    本文标题:dpi-c的一个例子

    本文链接:https://www.haomeiwen.com/subject/vojpcctx.html