Verilog PLI簡介

2022-05-20 14:38 更新

進(jìn)行數(shù)字設(shè)計(jì)時,經(jīng)常會遇到特殊的情況,Verilog 中的任務(wù)和函數(shù)已經(jīng)不能滿足仿真需求,需要自定義一些系統(tǒng)任務(wù)和函數(shù)。編程語言接口(PLI, Program Language Interface)提供了一套接口子程序,用于訪問設(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 功能

通俗來講,Verilog PLI 提供了一套 C 語言函數(shù), 設(shè)計(jì)人員可以調(diào)用這些集成函數(shù)編寫軟件 C 程序。RTL 編譯時,將編寫的軟件程序也集成到仿真環(huán)境中。仿真運(yùn)行時,通過系統(tǒng)任務(wù)調(diào)用的方式,就可以動態(tài)的去訪問仿真中的數(shù)據(jù)結(jié)構(gòu)。這種訪問是雙向的,不僅可以從仿真器的數(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ì)信息,例如訪問層次、互連情況、以及特定類型的邏輯元件數(shù)量等。
  • PLI 可用于編寫專用的輸出顯示程序,例如一些專用的波形觀測器,生成一些邏輯互連、層次、數(shù)據(jù)波形等信息。
  • PLI 可完成繁瑣的監(jiān)測任務(wù)或激勵任務(wù)。
  • PLI 能控制仿真的過程,例如暫停、退出,便于調(diào)試。
  • PLI 還可以擴(kuò)展的用途有,RAM/ROM程序下載工具,功耗分析,CModel 接口, 協(xié)同仿真環(huán)境……

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

  1. 實(shí)現(xiàn) CModel 與 Verilog 模型的共同仿真。對于比較復(fù)雜的系統(tǒng),開發(fā)者經(jīng)常需要先制作一個能夠正常工作的用 C 語言描述的模型,然后逐模塊地將其改寫為 Verilog 表述。
  2. 產(chǎn)生測試激勵,或直接進(jìn)行驗(yàn)證。對于數(shù)據(jù)量比較大的輸入激勵,或比較復(fù)雜的控制輸入,以及特定環(huán)境下的數(shù)據(jù)驗(yàn)證,PLI 實(shí)現(xiàn)比 Verilog 更具有優(yōu)勢。
  3. 捕獲仿真過程和結(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)接口,簡稱 TF 接口。TF 接口包含一套 C 語言函數(shù)庫,均以 tf_ 為前綴,定義在 veriuser.h 中。這些 C 函數(shù)一般稱為 TF 子程序,主要包括用戶自定義任務(wù)和函數(shù)、實(shí)用函數(shù)、回調(diào)機(jī)制和數(shù)據(jù)寫輸出。

1989-ACC 接口

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

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

1995-VPI 接口

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

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

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

2003-SystemVerilog 與 DPI

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

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

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

PLI 使用

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

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

PLI 流程

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


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

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

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

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

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

PLI 連接仿真器

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

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

gcc -c ../tb/hello_w3cschool.c

創(chuàng)建 VCS 可識別的鏈接 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 編譯仿真

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

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

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


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


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號