目录
当前位置: 首页 > 教程 > Verilog >

8.1 Verilog PLI 简介

精华
小牛编辑
192浏览
2023-03-14

进行数字设计时,经常会遇到特殊的情况,Verilog 中的任务和函数已经不能满足仿真需求,需要自定义一些系统任务和函数。编程语言接口(PLI, Program Language Interface)提供了一套接口子程序,用于访问设计内部的数据结构,并可以提取仿真环境信息。用户可以调用这些子程序,自定义系统任务和系统函数,与设计内部数据以及 Verilog 仿真器环境进行交互。

PLI 功能

通俗来讲,Verilog PLI 提供了一套 C 语言函数, 设计人员可以调用这些集成函数编写软件 C 程序。RTL 编译时,将编写的软件程序也集成到仿真环境中。仿真运行时,通过系统任务调用的方式,就可以动态的去访问仿真中的数据结构。这种访问是双向的,不仅可以从仿真器的数据结构中读取信息, 还能修改数据结构的信息。

PLI 的功能是十分强大的,其用途只局限于设计人员的想象力。

  • PLI 允许用户用 C 编写自定义的系统任务和函数,可以完成用 Verilog 不能完成的复杂操作。
  • 一些应用软件,例如文件读写工具,延迟计算工具,也可以用 PLI 编写。
  • PLI 可提取设计信息,例如访问层次、互连情况、以及特定类型的逻辑元件数量等。
  • PLI 可用于编写专用的输出显示程序,例如一些专用的波形观测器,生成一些逻辑互连、层次、数据波形等信息。
  • PLI 可完成繁琐的监测任务或激励任务。
  • PLI 能控制仿真的过程,例如暂停、退出,便于调试。
  • PLI 还可以扩展的用途有,RAM/ROM程序下载工具,功耗分析,CModel 接口, 协同仿真环境……

这里总结下 PLI 经常使用的功能:

  • (1) 实现 CModel 与 Verilog 模型的共同仿真。对于比较复杂的系统,开发者经常需要先制作一个能够正常工作的用 C 语言描述的模型,然后逐模块地将其改写为 Verilog 表述。
  • (2) 产生测试激励,或直接进行验证。对于数据量比较大的输入激励,或比较复杂的控制输入,以及特定环境下的数据验证,PLI 实现比 Verilog 更具有优势。
  • (3) 捕获仿真过程和结果,并以用户易于接受的方式输出。例如一些编解码的模块,使用用户自定义的显示效果,更容易调试。
  • (4) 软硬件联合仿真。例如设计中包含 CPU 实体,可以将软件编译成机器码加载到相应的 ROM中进行联合仿真。

PLI 版本

PLI 的发展主要经历了 3 代。

1985-TF 接口

第一代被称为任务/函数(Task/Function)接口,简称 TF 接口。TF 接口包含一套 C 语言函数库,均以 tf_ 为前缀,定义在 veriuser.h 中。这些 C 函数一般称为 TF 子程序,主要包括用户自定义任务和函数、实用函数、回调机制和数据写输出。

1989-ACC 接口

第二代被称为存取(Access)接口,简称 ACC 接口。ACC 接口中的函数均以 acc_ 为前缀,定义在 acc_user.h 中。ACC 子程序主要用于访问和修改 Verilog 描述的多种对象。ACC 库函数是 TF 库函数的叠加,而非替换。

一般 PLI 接口特指是 TF 和 ACC 接口。

1995-VPI 接口

第三代被称为过程接口(Verilog Process Interface),简称 VPI 接口。VPI 子程序是 TF 和 ACC 子程序功能的合集,定义在 vpi_user.h 中。

相对于 PLI 子程序又多又乱,VPI 尤显精炼。由于 PLI 诞生之初,没有统一的标准,完全是在实践中发展,导致常用的 PLI 库函数有近百个,写程序时基本都要查手册。

而 VPI 是根据一定的标准统筹规划制定的,融入了很多面向对象的思想,库函数精简度远超 PLI。但是 VPI 结构比较复杂,不容易上手。VPI 最大的弱点还是对仿真器的支持并不友好。

2003-SystemVerilog 与 DPI

作为 Verilog 的扩展,2003 年 SystemVerilog 标准发布,支持更多形式的仿真。

DPI 接口(Direct Procee Interface)成为软件与 SystemVerilog 交互的接口,目前占主流。

一般情况下,使用 PLI 的 TF 和 ACC 接口就能满足仿真需求了。本章只对 TF 和 ACC 接口进行简单介绍。其他接口待那个少年学成之日,再一一分享给大家。

PLI 使用

通过编写系统任务和系统函数, 用户能够用 PLI 和 C 程序扩展 Verilog 语言。这些用户定义的系统任务和函数的名称必须以美元符号 "$" 开头。此时 Verilog 里面的任务相当于一个子程序。当调用任务时,仿真器的执行流程跳转到子程序,完成任务后执行流程返回。Verilog 任务并不返回数值,但是可以有输入、输出和双向的形参。

Verilog 里面的函数跟大多数语言里面的函数一样。 当调用函数时,它运行一套指令,然后返回一个数值给调用它的指令。

PLI 流程

使用 PLI 接口完成用户自定义系统任务的基本流程如下所示。

下面以简单的系统任务 $hello_xnip 为例进行说明。该系统任务被调用时,会输出一行字符串 "Hello Xnip!"。

PLI 编写系统任务

用 C 语言描述的打印程序如下所示,文件命名为 hello_c

为说明 PLI 使用的一般流程,此程序并没有调用 TF/ACC 子程序。

实例

#include "stdio.h" //不包含 PLI 库子程序
int hello_xnip ( ) {
        printf ( "Hello Xnip! \n" ) ;
}

PLI 连接仿真器

以 VCS 使用为例,编译或创建 VCS 编译时需要的与 C 相关的文件。

对上述 hello_c 进行简单的编译,输出 hello_o 文件。注意相对路径。

gcc -c ../tb/hello_c

创建 VCS 可识别的链接 table 文件,文件命名为 hello_tab, 内容如下。

$hello_xnip call=hello_xnip

Verilog 调用系统任务

在 Verilog 中以系统任务调用的方式调用 $hello_xnip,描述如下。

实例

`timescale 1ns / 1ps
module test ;
    initial begin
      # 10 ;
     $hello_xnip ;
    end

    initial begin
      forever begin
          # 100 ;
          if ( $time >= 10000 )   $finish ;
      end
    end
endmodule

Verilog 编译仿真

对 RTL 和 编写的 PLI 中间文件进行编译。表明要链接 PLI 库中的表文件时,需要用 "-P" 参数指定。例如该仿真中应该在 VCS 命令行中增加如下参数(注意相对路径):

 
-P ../tb/hello_tab hello_o

仿真结果中可以看到打印的信息,截图如下。

本章节源码下载

Download

最后更新:

类似资料

  • 译序 不懂数据库的全栈工程师不是好架构师 —— Vonng ​ 现今,尤其是在互联网领域,大多数应用都属于数据密集型应用。本书从底层数据结构到顶层架构设计,将数据系统设计中的精髓娓娓道来。其中的宝贵经验无论是对架构师,DBA、还是后端工程师、甚至产品经理都会有帮助。 ​ 这是一本理论结合实践的书,书中很多问题,译者在实际场景中都曾遇到过,读来让人击节扼腕。如果能早点读到这本书,该少走多少弯路啊!

  • 模块(也被称为 “task plugins” 或 “library plugins”)是在 Ansible 中实际在执行的.它们就 是在每个 playbook 任务中被执行的.你也可以仅仅通过 ‘ansible’ 命令来运行它们. 让我们回顾一下我们是如何通过命令行来执行三个不同的模块: ansible webservers -m service -a "name=httpd state=star

  • 译者的话 这是一本很经典的Python入门教材,也是一本很适合初学者的编程入门书籍。网上有过一些翻译,不过我觉得都还是自己动手来尝试一下,这样更有利于深入了解和体验,所以就再造轮子了。 作者的话 这是Think Python这本书的第二版,本次使用的是Python3,与Python2有很多不同,这些不同之处会有标注。如果你用Python2的话,还是建议你去阅读上一个版本。 读者可以到亚马逊购买本书

  • 不同于传统 Shell 书籍,本书并未花大篇幅去介绍 Shell 语法,而是以面向“对象” 的方式引入大量的实例介绍 Shell 日常操作,“对象” 涵盖数值、逻辑值、字符串、文件、进程、文件系统等。这样有助于学以致用,并在用的过程中提高兴趣。也可以作为 Shell 编程索引,在需要的时候随时检索。 介绍 项目首页:http://www.tinylab.org/open-shell-book 代码

  • MongoDB 是一个开源的文档类型数据库,它具有高性能,高可用,可自动收缩的特性。MongoDB能够避免传统的ORM映射从而有助于开发。 文档 在MongoDB中,一行纪录就是一个文档,它是一个由键值对构成的数据结构,MongoDB文档与JSON对象类似。键的值可以包含其他的文档,数组,文档数组。 { "_id" : ObjectId("54c955492b7c8eb21818bd09")

  • 为什幺写这个框架? 利用协程特性以同步方式来编写异步代码,增强可读性。 将swoole的异步特性与传统框架的MVC相结合。 可以用作api也可以用作http server,rpc server. 目前实现了以Zookeeper、Redis、Mysql为注册中心的服务化治理. 如何使用,与传统框架的区别? 框架基本使用与传统框架基本一致,路由,控制器,服务层,数据层。 在异步调用的地方需要以yiel