進(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)行交互。
通俗來(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ì)人員的想象力。
這里總結(jié)下 PLI 經(jīng)常使用的功能:
PLI 的發(fā)展主要經(jīng)歷了 3 代。
第一代被稱為任務(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ù)寫輸出。
第二代被稱為存取(Access)接口,簡(jiǎn)稱 ACC 接口。ACC 接口中的函數(shù)均以 acc_ 為前綴,定義在 acc_user.h 中。ACC 子程序主要用于訪問(wèn)和修改 Verilog 描述的多種對(duì)象。ACC 庫(kù)函數(shù)是 TF 庫(kù)函數(shù)的疊加,而非替換。
一般 PLI 接口特指是 TF 和 ACC 接口。
第三代被稱為過(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ì)仿真器的支持并不友好。
作為 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é)成之日,再一一分享給大家。
通過(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 接口完成用戶自定義系統(tǒng)任務(wù)的基本流程如下所示。
下面以簡(jiǎn)單的系統(tǒng)任務(wù) $hello_w3cschool 為例進(jìn)行說(shuō)明。該系統(tǒng)任務(wù)被調(diào)用時(shí),會(huì)輸出一行字符串 "Hello w3cschool!"。
用 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");
}
以 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 中以系統(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
對(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)擊這里下載源碼
更多建議: