Verilog PLI簡介

2022-05-20 14:38 更新

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

PLI 功能

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

PLI 的功能是十分強大的,其用途只局限于設計人員的想象力。

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

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

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

PLI 版本

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

1985-TF 接口

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

1989-ACC 接口

第二代被稱為存取(Access)接口,簡稱 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)一的標準,完全是在實踐中發(fā)展,導致常用的 PLI 庫函數(shù)有近百個,寫程序時基本都要查手冊。

而 VPI 是根據(jù)一定的標準統(tǒng)籌規(guī)劃制定的,融入了很多面向對象的思想,庫函數(shù)精簡度遠超 PLI。但是 VPI 結構比較復雜,不容易上手。VPI 最大的弱點還是對仿真器的支持并不友好。

2003-SystemVerilog 與 DPI

作為 Verilog 的擴展,2003 年 SystemVerilog 標準發(fā)布,支持更多形式的仿真。

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

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

PLI 使用

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

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

PLI 流程

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


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

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

用 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 相關的文件。

對上述 hello_w3cschool.c 進行簡單的編譯,輸出 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)任務

在 Verilog 中以系統(tǒng)任務調(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 中間文件進行編譯。表明要鏈接 PLI 庫中的表文件時,需要用 "-P" 參數(shù)指定。例如該仿真中應該在 VCS 命令行中增加如下參數(shù)(注意相對路徑):

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

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


點擊這里下載源碼


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號