基于C++TCL PLI聯(lián)合仿真下的芯片驗證方法研究
2 腳本層關(guān)鍵技術(shù)
編寫(xiě)激勵源數據屬于驗證過(guò)程的腳本層,為了高效地生成數據,使用TCL腳本語(yǔ)言實(shí)現。TCL與C/C++等編譯性語(yǔ)言的最大區別是當TCL語(yǔ)言編寫(xiě)好之后不用通過(guò)軟件編譯就可以直接運行,運行一行就是“解釋”一行,“解釋”的過(guò)程通過(guò)TCL解釋器完成。TCL擁有一個(gè)固有的核心命令集,同時(shí)還具有和C/C++語(yǔ)言類(lèi)似的控制結構,如if控制、循環(huán)控制和switch控制等,并支持過(guò)程的定義和調用,對數組和字符串等簡(jiǎn)單數據結構也提供了支持,然而TCL標準庫提供的命令可能不會(huì )滿(mǎn)足需要.這時(shí)要針對某一特定應用領(lǐng)域對TCL語(yǔ)言的核心命令集合進(jìn)行擴展,加入適合于自己使用的擴展命令。
擴展TCL命令主要采用編寫(xiě)二進(jìn)制程序包的方法,二進(jìn)制程序包本身并不嵌入TCL解釋器,而是一些用C/C++編寫(xiě)的擴展命令的集合。任何標準的TCL解釋器都可以用加載的方法使用二進(jìn)制程序包中的擴展命令,Modelsim仿真工具集成了TCL解釋器。擴展一個(gè)TCL命令大致可以分為兩步:編寫(xiě)擴展命令對應的C/C++過(guò)程和注冊命令。TCL擴展命令的函數原型為:int Tcl_CmdProc(ClientData,Tcl_In-terp *interp,int argc,char *argv[]),參數clientData由TCL調用者傳人,其值在注冊擴展函數時(shí)設置;參數interp也由TCL調用者傳入,是指向解釋器結構的指針;參數argc和argv與標準C語(yǔ)言的命令行參數argc,argv的含義類(lèi)似,其中argc是被調用參數的個(gè)數,argv[0]是被調用的命令本身,argv[argc]是NULL,而argv[1]到argv[argc-1]才是真正的參數。編寫(xiě)好的擴展命令還需要注冊,如果注冊成功就可以在TCL解釋器中使用了,注冊過(guò)程在初始化函數中進(jìn)行,TCL注冊函數原型為T(mén)cl_CreateCommand(Tcl_Interp*interp,char *cmdName,Tcl_CmdProc *proc,Client-Data clientData,Tcl_CmdDeleteProc *deleteProc),cmd-Name是解釋器中使用的命令名,proc為編寫(xiě)的擴展函數名。需要注意的是TCL初始化函數的名稱(chēng)必須是首字母大寫(xiě)的DLL文件主文件名+一個(gè)下劃線(xiàn)+首字母大寫(xiě)的Init組成。
3 時(shí)序層關(guān)鍵技術(shù)
編寫(xiě)發(fā)送器和接收器屬于驗證過(guò)程的時(shí)序層,時(shí)序層也包括被例化的設計模塊。腳本層生成的激勵數據是用TCL語(yǔ)言編寫(xiě)的,而發(fā)送器和接收器是使用硬件描述語(yǔ)言Verilog編寫(xiě),為了實(shí)現兩種語(yǔ)言的數據傳遞,需要使用PLI接口編程語(yǔ)言完成兩者的結合,從而達到將激勵數據正確傳送到設計模塊和參考模型以及收集設計模塊輸出數據的目的,完成仿真這一過(guò)程。PLI函數對應發(fā)送器和接收器中調用的任務(wù),它使用C++語(yǔ)言擴展,在Verilog代碼中使用,主要包括四個(gè)C++函數:calltf,cheektf,sizetf,misctf函數,一般情況下只需要編寫(xiě)其中的三個(gè)函數checktf,misctf和calltf函數。編寫(xiě)完這三個(gè)函數之后,要注冊PLI函數對應的Verilog代碼中使用的系統任務(wù)或函數,提供每個(gè)系統任務(wù)和函數的名字以及相應的回調函數,使用結構體s_tfeell在C++代碼中來(lái)注冊PLI函數。
calltf函數在仿真運行時(shí)被調用,即仿真執行到發(fā)送器或接收器中定義好的PLI任務(wù)時(shí),就會(huì )調用該任務(wù)對應的calltf函數;checktf函數在仿真開(kāi)始運行前被仿真器調用,換句話(huà)說(shuō),在仿真時(shí)刻0,這個(gè)函數可以由仿真器的編譯器調用,checktf函數的主要目的是校驗一個(gè)系統/任務(wù)是否被正確使用和加載環(huán)境設置命令;misctf函數在仿真運行時(shí)的各種混雜事件情況下被調用,根據PLI函數調用變量的屬性選擇相應的處理策略。
PLI函數要實(shí)現的具體功能在calltf函數中編寫(xiě),在這個(gè)函數中可以通過(guò)使用tf_getp(n)和tf_putp(n,val-ue)函數讀取時(shí)序層的數據和對時(shí)序層的數據賦值,其中n表示變量的位置,value表示變量要賦的值。如果時(shí)序層的數據為數組類(lèi)型,使用tf_nodeinfo()函數讀取和修改Verilog內存數組和變量數組中的內容。當調用tf_nodeinfo()函數來(lái)訪(fǎng)問(wèn)Verilog數組中的值時(shí),函數將返回一個(gè)指向仿真數據結構中數組實(shí)際存儲空間的指針。一旦PLI應用獲得了該指針,數組中的值在仿真過(guò)程中既可以被讀取也可以被修改。要訪(fǎng)問(wèn)數組,并不需要每次都調用tf_nodeinfo()函數,只需要保存好初次調用tf_nodeinfo()獲得的數組指針,tf_nodeinfo()需要在系統函數/任務(wù)調用時(shí)在參數中指定一個(gè)選定的單元。
評論