進行數(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)境進行交互。
通俗來講,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 經(jīng)常使用的功能:
PLI 的發(fā)展主要經(jīng)歷了 3 代。
第一代被稱為任務/函數(shù)(Task/Function)接口,簡稱 TF 接口。TF 接口包含一套 C 語言函數(shù)庫,均以 tf_ 為前綴,定義在 veriuser.h 中。這些 C 函數(shù)一般稱為 TF 子程序,主要包括用戶自定義任務和函數(shù)、實用函數(shù)、回調(diào)機制和數(shù)據(jù)寫輸出。
第二代被稱為存取(Access)接口,簡稱 ACC 接口。ACC 接口中的函數(shù)均以 acc_ 為前綴,定義在 acc_user.h 中。ACC 子程序主要用于訪問和修改 Verilog 描述的多種對象。ACC 庫函數(shù)是 TF 庫函數(shù)的疊加,而非替換。
一般 PLI 接口特指是 TF 和 ACC 接口。
第三代被稱為過程接口(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 最大的弱點還是對仿真器的支持并不友好。
作為 Verilog 的擴展,2003 年 SystemVerilog 標準發(fā)布,支持更多形式的仿真。
DPI 接口(Direct Procee Interface)成為軟件與 SystemVerilog 交互的接口,目前占主流。
一般情況下,使用 PLI 的 TF 和 ACC 接口就能滿足仿真需求了。本章只對 TF 和 ACC 接口進行簡單介紹。其他接口待那個少年學成之日,再一一分享給大家。
通過編寫系統(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 接口完成用戶自定義系統(tǒng)任務的基本流程如下所示。
下面以簡單的系統(tǒng)任務 $hello_w3cschool 為例進行說明。該系統(tǒng)任務被調(diào)用時,會輸出一行字符串 "Hello w3cschool!"。
用 C 語言描述的打印程序如下所示,文件命名為 hello_w3cschool.c 。
為說明 PLI 使用的一般流程,此程序并沒有調(diào)用 TF/ACC 子程序。
#include "stdio.h" //不包含 PLI 庫子程序
int hello_w3cschool(){
printf("Hello w3cschool! \n");
}
以 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 中以系統(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
對 RTL 和 編寫的 PLI 中間文件進行編譯。表明要鏈接 PLI 庫中的表文件時,需要用 "-P" 參數(shù)指定。例如該仿真中應該在 VCS 命令行中增加如下參數(shù)(注意相對路徑):
-P ../tb/hello_w3cschool.tab hello_w3cschool.o
仿真結果中可以看到打印的信息,截圖如下。
點擊這里下載源碼
更多建議: