三、13【Verilog HDL】编程语言接口(PLI)-自定义系统任务

前言

参考书籍:《Verilog HDL 数字设计与综合》第二版,本文档为第13章的学习笔记。

简介

在设计时,经常遇到通过定义自己的系统任务和函数才能实现设计目标。为了做到这一点,设计者需要与表示设计的内部数据结构以及Verilog仿真器的仿真环境进行交互。

编程语言接口(PLI)提供了一组接口子程序,用于访问(读写)内部的数据表示,并可以提取仿真环境信息。用户定义自己的系统任务和函数可以通过这组预定义的PLI接口子程序来创建。

PLI范围较广,这里对于PLI的细节不做过多的解释,只是致力于不懂的人能够对PLI有一个基本认识。关于细节请参考IEEE Standard Verilog Hardware Descripyion Language文档。

PLI的发展经历

  1. 任务/函数(tf_)子程序,可以进行用户自定义的任务和函数、实用函数、回调机制和把数据写到输出设备。
  2. 存储(acc)子程序,可以直接再Verilog内部数据结构中进行面向对象的数据存储。
  3. Verilog过程接口(vpi_)子程序,是(tf_)和(acc_)的扩展。

初步认识

理解PLI任务是如何应用于Verliog仿真中,一个使用PLI子程序的规范仿真流程。

  • 用户自定义系统任务:用户在进行设计描述+激励是不仅可以使用标准的语言进行描述,也可以启动用户自定义的系统任务来对用户自定义系统任务进行调用与访问。
  • 用户自定义C子程序:用户的自定义的系统任务都会被链接到一个用户自定义的C子程序上。该子程序上以PLI接口子程序标准库的方式实现,且代码可以通过C编译器编译。C子程序可以通过PLI接口进行一下操作:
  1. 读取内部数据结构
  2. 修改内部数据结构
  3. 存储仿真环境

这样就可以在不理解内部数据结构的前提下,对其进行访问。所有Verilog仿真器均适应。

一、PLI的用途

  • 可用于定义其他系统任务和函数。如:监控任务、激励任务、调试任务等
  • 可编写一些硬件上的应用软件,如:翻译器和延迟计算工具
  • 可提取设计信息,如:层次、互连、扇出以及特定类型逻辑元件的数目
  • 可编写专用或自定义的输出显示子程序,波形观察器可用其生成波形、逻辑互联和源代码浏览
  • 可编写仿真用的激励子程序,激励可以是自动生成或者其他激励转化而来
  • 普通的基于Verilog的应用软件可以用PLI子程序编写

二、PLI任务的连接和调用

设计者可以通过使用PLI库子程序来编写自定义的系统任务。Verilbing编译器需要链接用户自定义的系统任务,才能够连接到用户自定义C函数。

这里举一个简单的输出"Hello Verilog World"的用户自定义任务的C子程序。

#include "veriuser.h"     //添加io_printf的头文件(声明处)
int hello_verilog()
{
    io_printf("Hello Verilog World")
}

2.1 PLI任务连接

        在Verilog代码中,无论任务$hello_verilog什么时候被调用,C子程序的hello_verilog都必须执行。执行后的新任务就会一直存在,只要代码调用,仿真器就会自动连接到PLI的C子程序。虽然不同仿真器连接方式不同,但是连接过程的基本原理仍然相同。

        在连接最后阶段,生成了一个包含$hello_verilog新系统任务的特殊的二进制可执行文件。

2.2 PLI任务的调用

      调用当时和其他系统任务的调用类似

  一旦用户自定义任务被连接到Verilog仿真器中,这样就可以被调用

module hello_top
initial
    $hello_verilog;
endmodule

2.3 PLI任务的添加与调用流程

 三、内部数据表示

每个模块被看作一组对象类型,其是Verilog中定义的元素,如:

  • 模块实例、模块端口、模块的端到端路径以及模块之间的路径
  • 顶层模块
  • 原语实例和原语端口(terminal)
  • 线网(wire)、寄存器(reg)、参数类型(parameter和specparam)
  • 整型、实践型和实型变量
  • 时序检查
  • 命名实践

每个集合包含模块的所有元素,PLI库子程序可以遍历整个内部表示。 

四、PLI库子程序

用户自定义C子程序是用PLI库子程序编写的,PLI库子程序有两大类:存取子程序和实用子程序,其中vpi_子程序是以上两大类的扩展,这里不对其进行详解。

4.1 存储子程序(acc_)

通常成为acc子程序

acc_ 的功能

  • 从内部数据结构的相关项读取特定对象信息
  • 把特定对象的信息写入内部数据结构的有关项

acc_ 的特点

  • 存储子程序总是以前缀acc_开头
  • 使用时,开头必须调用子程序acc_initialize(),来初始化环境;退出时,用户自定义子程序acc_close()
  • 调用时必须在C程序中添加它的头文件acc_user.h
  • 存储子程序(acc_)使用句柄的概念来访问对象。句柄是预定义的指向设计中特定对象的数据类型。对象句柄标识符由关键词handle声明。 handle  top_handle;

acc_ 的类型

  • 句柄子程序。将句柄返回设计中的对象,句柄子程序名字前缀acc_handle_开头
  • 后继子程序。将句柄返回设计中特定类型对象集合中的下一个对象,acc_next
  • 值变链接(VCL)。可从监视对象值变化的对象列表中添加和深处对象,acc_vcl
  • 取值(fetch)。能够提取对象的内部信息,acc_fetch
  • 使用存取子程序。执行和存取子程序相关的杂项操作,acc_initialize();acc_close()
  • 修改子程序。可以修改内部数据结构。

4.2 实用子程序(tf_)

tf_ 的功能

用于在Verilog与用户C子程序边界的两个方向上传输数据。

tf_ 的特征

  • 总是以前缀tf_开头
  • 必须包含头文件:veriuser.h

tf_ 的类型

  • 获取Verilog系统调用任务的信息
  • 获取参数列表信息
  • 获取参数值
  • 把参数新值回传给调用它的系统任务
  • 监视参数值的改变
  • 获取仿真时间和被调度事件的信息
  • 执行日常管理维护任务
  • 执行long类型的算数运算
  • 显示信息
  • 挂起、终止、保存和恢复仿真

以上只是对PLI的概念及内容做了一个大体的介绍,至于深入学习大家请参考,语法原文档。 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追逐者-桥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值