Verilog PLI簡(jiǎn)介

2022-05-20 14:38 更新

進(jìn)行數(shù)字設(shè)計(jì)時(shí),經(jīng)常會(huì)遇到特殊的情況,Verilog 中的任務(wù)和函數(shù)已經(jīng)不能滿足仿真需求,需要自定義一些系統(tǒng)任務(wù)和函數(shù)。編程語(yǔ)言接口(PLI, Program Language Interface)提供了一套接口子程序,用于訪問(wèn)設(shè)計(jì)內(nèi)部的數(shù)據(jù)結(jié)構(gòu),并可以提取仿真環(huán)境信息。用戶可以調(diào)用這些子程序,自定義系統(tǒng)任務(wù)和系統(tǒng)函數(shù),與設(shè)計(jì)內(nèi)部數(shù)據(jù)以及 Verilog 仿真器環(huán)境進(jìn)行交互。

PLI 功能

通俗來(lái)講,Verilog PLI 提供了一套 C 語(yǔ)言函數(shù), 設(shè)計(jì)人員可以調(diào)用這些集成函數(shù)編寫軟件 C 程序。RTL 編譯時(shí),將編寫的軟件程序也集成到仿真環(huán)境中。仿真運(yùn)行時(shí),通過(guò)系統(tǒng)任務(wù)調(diào)用的方式,就可以動(dòng)態(tài)的去訪問(wèn)仿真中的數(shù)據(jù)結(jié)構(gòu)。這種訪問(wèn)是雙向的,不僅可以從仿真器的數(shù)據(jù)結(jié)構(gòu)中讀取信息, 還能修改數(shù)據(jù)結(jié)構(gòu)的信息。

PLI 的功能是十分強(qiáng)大的,其用途只局限于設(shè)計(jì)人員的想象力。

  • PLI 允許用戶用 C 編寫自定義的系統(tǒng)任務(wù)和函數(shù),可以完成用 Verilog 不能完成的復(fù)雜操作。
  • 一些應(yīng)用軟件,例如文件讀寫工具,延遲計(jì)算工具,也可以用 PLI 編寫。
  • PLI 可提取設(shè)計(jì)信息,例如訪問(wèn)層次、互連情況、以及特定類型的邏輯元件數(shù)量等。
  • PLI 可用于編寫專用的輸出顯示程序,例如一些專用的波形觀測(cè)器,生成一些邏輯互連、層次、數(shù)據(jù)波形等信息。
  • PLI 可完成繁瑣的監(jiān)測(cè)任務(wù)或激勵(lì)任務(wù)。
  • PLI 能控制仿真的過(guò)程,例如暫停、退出,便于調(diào)試。
  • PLI 還可以擴(kuò)展的用途有,RAM/ROM程序下載工具,功耗分析,CModel 接口, 協(xié)同仿真環(huán)境……

這里總結(jié)下 PLI 經(jīng)常使用的功能:

  1. 實(shí)現(xiàn) CModel 與 Verilog 模型的共同仿真。對(duì)于比較復(fù)雜的系統(tǒng),開發(fā)者經(jīng)常需要先制作一個(gè)能夠正常工作的用 C 語(yǔ)言描述的模型,然后逐模塊地將其改寫為 Verilog 表述。
  2. 產(chǎn)生測(cè)試激勵(lì),或直接進(jìn)行驗(yàn)證。對(duì)于數(shù)據(jù)量比較大的輸入激勵(lì),或比較復(fù)雜的控制輸入,以及特定環(huán)境下的數(shù)據(jù)驗(yàn)證,PLI 實(shí)現(xiàn)比 Verilog 更具有優(yōu)勢(shì)。
  3. 捕獲仿真過(guò)程和結(jié)果,并以用戶易于接受的方式輸出。例如一些編解碼的模塊,使用用戶自定義的顯示效果,更容易調(diào)試。
  4. 軟硬件聯(lián)合仿真。例如設(shè)計(jì)中包含 CPU 實(shí)體,可以將軟件編譯成機(jī)器碼加載到相應(yīng)的 ROM中進(jìn)行聯(lián)合仿真。

PLI 版本

PLI 的發(fā)展主要經(jīng)歷了 3 代。

1985-TF 接口

第一代被稱為任務(wù)/函數(shù)(Task/Function)接口,簡(jiǎn)稱 TF 接口。TF 接口包含一套 C 語(yǔ)言函數(shù)庫(kù),均以 tf_ 為前綴,定義在 veriuser.h 中。這些 C 函數(shù)一般稱為 TF 子程序,主要包括用戶自定義任務(wù)和函數(shù)、實(shí)用函數(shù)、回調(diào)機(jī)制和數(shù)據(jù)寫輸出。

1989-ACC 接口

第二代被稱為存取(Access)接口,簡(jiǎn)稱 ACC 接口。ACC 接口中的函數(shù)均以 acc_ 為前綴,定義在 acc_user.h 中。ACC 子程序主要用于訪問(wèn)和修改 Verilog 描述的多種對(duì)象。ACC 庫(kù)函數(shù)是 TF 庫(kù)函數(shù)的疊加,而非替換。

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

1995-VPI 接口

第三代被稱為過(guò)程接口(Verilog Process Interface),簡(jiǎn)稱 VPI 接口。VPI 子程序是 TF 和 ACC 子程序功能的合集,定義在 vpi_user.h 中。

相對(duì)于 PLI 子程序又多又亂,VPI 尤顯精煉。由于 PLI 誕生之初,沒(méi)有統(tǒng)一的標(biāo)準(zhǔn),完全是在實(shí)踐中發(fā)展,導(dǎo)致常用的 PLI 庫(kù)函數(shù)有近百個(gè),寫程序時(shí)基本都要查手冊(cè)。

而 VPI 是根據(jù)一定的標(biāo)準(zhǔn)統(tǒng)籌規(guī)劃制定的,融入了很多面向?qū)ο蟮乃枷?,?kù)函數(shù)精簡(jiǎn)度遠(yuǎn)超 PLI。但是 VPI 結(jié)構(gòu)比較復(fù)雜,不容易上手。VPI 最大的弱點(diǎn)還是對(duì)仿真器的支持并不友好。

2003-SystemVerilog 與 DPI

作為 Verilog 的擴(kuò)展,2003 年 SystemVerilog 標(biāo)準(zhǔn)發(fā)布,支持更多形式的仿真。

DPI 接口(Direct Procee Interface)成為軟件與 SystemVerilog 交互的接口,目前占主流。

一般情況下,使用 PLI 的 TF 和 ACC 接口就能滿足仿真需求了。本章只對(duì) TF 和 ACC 接口進(jìn)行簡(jiǎn)單介紹。其他接口待那個(gè)少年學(xué)成之日,再一一分享給大家。

PLI 使用

通過(guò)編寫系統(tǒng)任務(wù)和系統(tǒng)函數(shù), 用戶能夠用 PLI 和 C 程序擴(kuò)展 Verilog 語(yǔ)言。這些用戶定義的系統(tǒng)任務(wù)和函數(shù)的名稱必須以美元符號(hào) "$" 開頭。此時(shí) Verilog 里面的任務(wù)相當(dāng)于一個(gè)子程序。當(dāng)調(diào)用任務(wù)時(shí),仿真器的執(zhí)行流程跳轉(zhuǎn)到子程序,完成任務(wù)后執(zhí)行流程返回。Verilog 任務(wù)并不返回?cái)?shù)值,但是可以有輸入、輸出和雙向的形參。

Verilog 里面的函數(shù)跟大多數(shù)語(yǔ)言里面的函數(shù)一樣。 當(dāng)調(diào)用函數(shù)時(shí),它運(yùn)行一套指令,然后返回一個(gè)數(shù)值給調(diào)用它的指令。

PLI 流程

使用 PLI 接口完成用戶自定義系統(tǒng)任務(wù)的基本流程如下所示。


下面以簡(jiǎn)單的系統(tǒng)任務(wù) $hello_w3cschool 為例進(jìn)行說(shuō)明。該系統(tǒng)任務(wù)被調(diào)用時(shí),會(huì)輸出一行字符串 "Hello w3cschool!"。

PLI 編寫系統(tǒng)任務(wù)

用 C 語(yǔ)言描述的打印程序如下所示,文件命名為 hello_w3cschool.c 。

為說(shuō)明 PLI 使用的一般流程,此程序并沒(méi)有調(diào)用 TF/ACC 子程序。

#include "stdio.h" //不包含 PLI 庫(kù)子程序
int hello_w3cschool(){
        printf("Hello w3cschool! \n");
}

PLI 連接仿真器

以 VCS 使用為例,編譯或創(chuàng)建 VCS 編譯時(shí)需要的與 C 相關(guān)的文件。

對(duì)上述 hello_w3cschool.c 進(jìn)行簡(jiǎn)單的編譯,輸出 hello_w3cschool.o 文件。注意相對(duì)路徑。

gcc -c ../tb/hello_w3cschool.c

創(chuàng)建 VCS 可識(shí)別的鏈接 table 文件,文件命名為 hello_w3cschool.tab, 內(nèi)容如下。

$hello_w3cschool call=hello_w3cschool

Verilog 調(diào)用系統(tǒng)任務(wù)

在 Verilog 中以系統(tǒng)任務(wù)調(diào)用的方式調(diào)用 $hello_w3cschool,描述如下。

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

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

Verilog 編譯仿真

對(duì) RTL 和 編寫的 PLI 中間文件進(jìn)行編譯。表明要鏈接 PLI 庫(kù)中的表文件時(shí),需要用 "-P" 參數(shù)指定。例如該仿真中應(yīng)該在 VCS 命令行中增加如下參數(shù)(注意相對(duì)路徑):

-P ../tb/hello_w3cschool.tab hello_w3cschool.o

仿真結(jié)果中可以看到打印的信息,截圖如下。


點(diǎn)擊這里下載源碼


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)