在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜全文
查看: 3721|回复: 7

[原创] verilog中PLI中传参数和返回值

[复制链接]
发表于 2011-3-21 17:56:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
近来想研究下verilog中pli的问题,
一个简单的打印可以成功实现,但是一个稍微复杂点,带有参数和返回值的应用就失败了,请高手指教

我的例子是
testbench:
`timescale 1ns/1ns
module tb;
reg [7:0] a, b;
reg [7:0] c;
initial begin
        a = 1;
        b = 2;
        #9;
        a = 3;
        b = 5;
end
initial begin
        $display(" a is %0h, b is %0h, c is %h", a, b, c);
        #1;
        $display(" a is %0h, b is %0h, c is %h", a, b, c);
        $sum(a,b);
        $hello;
        #10;
        $display(" a is %0h, b is %0h, c is %h", a, b, c);
end
endmodule

pli tab 文件
$sum     call=sum  acc=rw:*
$hello   call=hello acc=rw:*

cpp 文件:
#include <stdio.h>
#include "acc_user.h"
/*
int sum (int a, int b)
{
        int sum;
        sum = a +b ;
        
}
*/
extern "C" {
void hello ()
{
        printf ( "hello world!\n");
        printf ( "it is cpp\n");
}
int sum (int a, int b)
{
        int sum;
        sum = a + b;
        printf("a is %0d\n", a);
        printf("b is %0d\n", b);
        printf("sum is %0d\n", sum);
        return sum;
}
}

仿真结果是
a is 1, b is 2, c is xx
a is 1, b is 2, c is xx
a is 0
b is 3
sum is 3
hello world!
it is cpp
a is 3, b is 5, c is xx

明显C没有拿到a,b的值。另外怎样返回一个值到verilog,
 楼主| 发表于 2011-3-21 17:57:48 | 显示全部楼层
请大侠指点
最好能给出详细的code。
谢谢!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-22 14:02:39 | 显示全部楼层
没有人知道吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2011-3-29 14:13:50 | 显示全部楼层
这帖子沉了?
难道就没有做verilog的PLI开发的?
回复 支持 反对

使用道具 举报

发表于 2011-5-7 11:14:50 | 显示全部楼层
好象没有把sum值assign给C, 是不是要用: c=$sum(a,b);
回复 支持 反对

使用道具 举报

发表于 2025-8-9 17:35:09 | 显示全部楼层
不是这样玩的。
回复 支持 反对

使用道具 举报

发表于 前天 10:02 | 显示全部楼层
使用PLI/VPI的话,其实就是用C自定义系统函数,并在Verilog空间调用,你需要将C空间的普通函数与Verilog空间的自定义系统函数也就是"$"打头的非内建函数联系起来,两种方式:
1. 使用pli.tab文件,在pli.tab文件中至少给出自定义系统函数名和与该自定义系统函数绑定的主调函数名;
2. 不使用pli.tab文件,那么你需要在C空间中实现此绑定:至少定义助调函数xxx_calltf,可选的是定义xxx_compiletf等函数,xxx_compiletf函数实现对自定义系统函数的传入参数格式检查,上下文正确与否的检查等,xxx_calltf函数实现主要的逻辑;你还要定义注册函数,将自定义系统函数名和xxx_calltf/xxx_compiletf进行绑定,最后定义入口vlog_startup_routines。将C编译成pli.so就可以和Verilog空间的编译文件进行链接生成simv。
回复 支持 反对

使用道具 举报

发表于 前天 10:11 | 显示全部楼层
回到你的代码中,你在Verilog空间中调用$sum(a,b),有两个参数a和b,但在C空间中是看不到这两个参数的。实际上在C空间中xxx_calltf和xxx_compiletf这两个与$sum绑定的两个关键函数其参数一般是固定的PLI_BYTE8* user_data,C空间是无法直接看到a和b这两个Verilog空间的参数的。C空间中xxx_calltf是通过vpiHandle这个句柄来间接获取Verilog空间的参数的,一般处理流程中xxx_calltf先通过vpiSystfCall获取$sum这个自定义系统函数的句柄,再通过vpiArgument获取$sum的参数列表,再通过vpi_scan遍历各个参数,再根据参数的实际类型(比如,参数是verilog module instance实例,wire信号名,字符串等)做进一步处理。对应到你的代码,a和b是普通信号,那么在C中需要用到s_vpi_value结构体,vpi_get_value()函数和vpi_put)value()等函数来进行取值和赋值操作。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-9-18 03:17 , Processed in 0.015064 second(s), 3 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表