我想和verilog交流一下。我发现Verilog PLI可以解决我的问题。我阅读这个网站是为了学习http://www.asic-world.com/verilog/pli1.html#How_it_Works。但是我仍然不能使用printf函数。我使用ncverilog作为verilog编译器。我所做的是打击。我不能有一个成功的编译这个。它说它找不到函数。有人能告诉我怎么解决我的问题吗。谢谢=)
C代码:hello.C

#include<stdio.h>
void hello(){
   printf("HELLO");
}

制作库:
gcc hello.c -fPIC -shared -o hello.so

verilog代码:test.v
module test();
   initial begin
      $hello;
      #10 $finish;
   end
endmodule

verilog命令:
ncverilog test.v +access+r -v hello.so

最佳答案

VPI(物价指数2.0)
你好,vpi.c:

#include<stdio.h>
#include <vpi_user.h>
void hello(){
   printf("HELLO");
}

void register_hello()
{
    s_vpi_systf_data data;
    data.type      = vpiSysTask; //vpiSysFunc;
//  data.sysfunctype = vpiSysFuncInt; // return type if type is Func
    data.tfname    = "$hello";
    data.calltf    = hello;
    data.compiletf = 0;
    data.sizetf    = 0;
    data.user_data = 0;
    vpi_register_systf(&data);
}

命令:
gcc hello_vpi.c -fPIC -shared -o hello_vpi.so
ncverilog test.v +access+r -loadvpi ./hello_vpi.so:register_hello

PLI 1.0要求在s_tfcell veriusertfs[]中定义verilog中使用的所有C方法。Ncverilog需要一个额外的引导方法,该方法返回一个类型p_tf_cell,该方法定义一个静态s_tfcell veriusertfs[]。下面是一个例子:
验证用户c:
#include "veriuser.h"
#include "acc_user.h"

extern void hello();

#define user_task          1
#define user_function      2

p_tfcell my_boot() {
  s_tfcell veriusertfs[] = {
    /* {user_function/usertask, (int)data, pli_checkp, pli_sizep, pli, ?, verilog_name, ? } */
    {usertask, 0, 0, 0, hello, 0, "$hello", 1},
    {0}  // last entry must be 0
  };
  return(veriusertfs);
}

命令:
gcc hello.c veriuser_nc.c -fPIC -shared -o hello_pli.so
ncverilog test.v +access+r -loadpli1 ./hello_pli.so:my_boot

VCS需要一个tab文件而不是引导方法。此处仅简单介绍:http://www.asic-world.com/verilog/pli2.html#Linking_With_Simulator
另一种方法是使用SystemVerilog DPI,它没有与PLI/VPI相同的包装/翻译层。
#include "svdpi.h"添加到hello.c的头部。我只是更改共享对象的名称以标识库类型(不是必需的)。gcc hello.c -fPIC -shared -o hello_dpi.so
verilog代码:test.sv
module test();
   import "DPI-C" pure function void hello();
   // DPI methods are treated as verilog task/function after import, including scope access
   initial begin
      hello(); // dpi doesn't have a $
      #10 $finish;
   end
endmodule

verilog命令:
ncverilog -sv test.sv +access+r -sv_lib hello_dpi.so

DPI的文件在IEEE std 1800-2012§35中。直接编程接口。PLI/VPI包含在第36条中,但不包括模拟器规定的要求。有关DPI的更多说明和教程,请查看http://en.wikipedia.org/wiki/SystemVerilog_DPIhttp://www.doulos.com/knowhow/sysverilog/tutorial/dpi/

关于c - 如何使用Verilog PLI通过ncverilog编译器与c通信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20044001/

10-13 04:23