基于VCS使用VPI+PLI/DPI在verilog中调用C程序进行cover property驱动的仿真控制

本文介绍一种在verilog中,运用PLI+VPI机制调用C程序获得cover property的覆盖情况从而控制仿真的方法,其中的C程序,可以接受传参,且可以有返回值,仿真器选择的VCS。

  1. 编写C程序
    #include <stdio.h>
    #include "vpi_user.h"
    //使用PLI有两种机制:TF/ACC机制,或者VPI机制
    
    //void hello_calltf(int user_data, int reason)
    //{
    //    int var,result;
    //    var = tf_getp(1);//取$hello调用时的第一个参数传递值
    //    result = var;
    //    tf_putp(0, result);//实际返回值
    //    0;
    //}
    
    void get_cover_cnt_calltf(int user_data, int reason)
    {
        vpiHandle hd;
        hd=vpi_handle_by_name(tf_getcstringp(1),Null);//根据string获取句柄
        //从第一个形参获取传入的property层级路径名,
        //注意使用bind时,property的层级路径是在被bind的instance下面,如:top.xxx.assert_module.cover_name
        tf_putp(0,vpi_get(vpiAssertSuccessCovered,hd);//获取此property的success次数
        0;
    }

     

  2. 建立链接,下面两种方式任选其一即可
    1. tab模式,编写xxx.tab文件,内容参考:
      $hello size=32 call=get_cover_cnt_calltf    //如果期望调用的C程序有返回值,则必须声明size=xxx,PLI视其为function,否则视其为task(无返回值)

       

    2. 注册模式,麻烦,略。
  3. 仿真选项
    vcs hello.c -P xxx.tab +vpi ...
  4. 在平台中调用即可获得所传property的覆盖情况:

    var=$hello("top.xxx.assert_module.property_inst_name");

     

大功告成!

参考资料:

hello world

Verilog PLI Tutorial


上面的方法不好用,现在都是用DPI机制了,可以参考SV绿皮书C语言部分,只需两步:

1.C程序部分修改:

int get_cover_cnt_calltf(char *cp_name)
{
    vpiHandle hd;
    hd=vpi_handle_by_name(cp_name,Null);//根据string获取句柄
    //从第一个形参获取传入的property层级路径名,
    //注意使用bind时,property的层级路径是在被bind的instance下面,如:top.xxx.assert_module.cover_name
     return vpi_get(vpiAssertSuccessCovered,hd);//获取此property的success次数
}

2.SV部分修改:

import "DPI-C" function int get_cover_cnt_call_tf(input string cp_name);//使用sv语法

...
get_cover_cnt_call_tf("top.xxx.cp_name");//注意没有$符号

 

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值