【问题标题】:how to use verilog PLI communicate with c by ncverilog compiler如何使用verilog PLI通过ncverilog编译器与c通信
【发布时间】:2013-12-01 09:06:53
【问题描述】:

我想用verilog交流c。我发现 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

【问题讨论】:

  • 请将实际的错误消息添加到您的问题中。

标签: c compiler-construction communication verilog


【解决方案1】:

VPI (PLI 2.0)

hello_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[]。这是一个例子:

veriuser_nc.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 需要一个选项卡文件而不是引导方法。此处略作介绍: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/

【讨论】:

  • 你给出的代码是TF/ACC代码,这是古老的历史——它是PLI 1.0,而不是VPI/PLI 2.0。等效的 VPI 类型是 s_vpi_systf_data。 VPI 好多了——现在写 TF/ACC 代码是个错误。
猜你喜欢
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-02
相关资源
最近更新 更多