01
testbench是什么
廢話不多說(shuō)直接上干貨,testbench就是對(duì)寫的FPGA文件進(jìn)行測(cè)試的文件,可以是verilog也可以是VHDL。
verilog和VHDL的國(guó)際標(biāo)準(zhǔn)里面有很多不能被綜合實(shí)現(xiàn)的語(yǔ)句,比如initial,forever,repeat,延時(shí)語(yǔ)句#1等等,這些語(yǔ)句就是用來(lái)測(cè)試的時(shí)候使用的。運(yùn)行環(huán)境一般是ise或者vivado自帶的仿真工具,或者如modelsim一樣的第三方仿真工具。
02
testbench測(cè)試的機(jī)制是什么
任何一個(gè)設(shè)計(jì)好的模塊(比如第一講的PWM產(chǎn)生模塊),都有輸入和輸出,此模塊是否滿足要求就是看給定滿足要求的輸入,是否能夠得到滿足要求的輸出。所以testbench的測(cè)試機(jī)制就是 :用各種verilog或者VHDL語(yǔ)法,產(chǎn)生滿足條件的激勵(lì)信號(hào)(也就是對(duì)被模塊的輸入),同時(shí)對(duì)模塊的輸出進(jìn)行捕捉,測(cè)試輸出是否滿足要求 。如下圖,產(chǎn)生激勵(lì)輸出驗(yàn)證模塊兩個(gè)模塊都屬于testbench,最好的輸出驗(yàn)證模塊最終只需要給一個(gè)pass和fail的答案出來(lái)就可以了。不管是用一個(gè)信號(hào)表示pass和fail還是用$display()函數(shù)打印,最終簡(jiǎn)單明了的給出過(guò)或者不過(guò)的信息就好了。請(qǐng)大家寫仿真文件的時(shí)候盡量做到這點(diǎn)。
03
testbench運(yùn)行順序之謎
首先,跟大家解釋一點(diǎn),所有testbench本質(zhì)上都是串行執(zhí)行,因?yàn)樵?a href="http://www.xsypw.cn/v/tag/132/" target="_blank">CPU環(huán)境下,沒(méi)有可靠并行執(zhí)行的能力。所有并行的語(yǔ)句,比如兩個(gè)always模塊,fork join語(yǔ)句塊,都是軟件模擬并行執(zhí)行的。所以老一點(diǎn)的編譯器,信號(hào)定義要在initial語(yǔ)句前面,initial的信號(hào)要先有初始值后面的語(yǔ)句才能從給定初值開(kāi)始執(zhí)行。所以大家寫testbench的時(shí)候,要注意,最好先定義信號(hào),再寫initial語(yǔ)句,后面的語(yǔ)句交換順序不影響,軟件可以識(shí)別并按照IEEE標(biāo)準(zhǔn)的順序去執(zhí)行。
如果一個(gè)模塊里面想用并行執(zhí)行語(yǔ)句用fork join語(yǔ)句,順序執(zhí)行用begin end語(yǔ)句。initial語(yǔ)句可以寫多個(gè),都是并行執(zhí)行的,當(dāng)兩個(gè)信號(hào)在initial沖突的時(shí)候,會(huì)先執(zhí)行前面的initial的值。
04
常用testbench語(yǔ)句總結(jié)
時(shí)鐘產(chǎn)生——always begin clk = 0; #1 clk = 1; #1; end 。注意這里的always后面沒(méi)有@!沒(méi)有@的時(shí)候always代表永遠(yuǎn)循環(huán)執(zhí)行begin end之間的語(yǔ)句,如果有@,后面一定要加時(shí)鐘,代表時(shí)鐘邊沿來(lái)到的時(shí)候順序執(zhí)行begin end里面的語(yǔ)句。沒(méi)有@的always語(yǔ)句不可綜合。
時(shí)間軸設(shè)置——'timescale 仿真時(shí)間單位/時(shí)間精度; 比如`timescale 1ns / 1ps;代表仿真的時(shí)間軸單位是1ns,仿真工具仿真的最大精度只到1ps內(nèi)的邏輯變化。
延時(shí)語(yǔ)句——#n; 代表延時(shí)n個(gè)時(shí)間軸單位。比如之前定義了`timescale 1ns / 1ps;如果后面寫 #3;就代表延時(shí)3ns而不是延時(shí)3ps。
初始化——initial begin a=0; #100; a=1; end。testbench在運(yùn)行起來(lái)之后,第一個(gè)進(jìn)入初始化語(yǔ)句,并且只執(zhí)行一次停在最后一句,然后才是后面的語(yǔ)句。由于begin end里面的語(yǔ)句是串行執(zhí)行的,所以這句話代表a低電平100ns后永遠(yuǎn)為高。復(fù)位信號(hào)常常這樣產(chǎn)生。
系統(tǒng)函數(shù)——**stop;代表運(yùn)行到這一句停止仿真,**dispaly("pass");代表在命令行顯示pass這串字符。
等待語(yǔ)句——wait(條件表達(dá)式) 語(yǔ)句/語(yǔ)句塊; 語(yǔ)句塊可以是串行塊(begin…end)或并行塊(fork…join)。當(dāng)邏輯表達(dá)式為“真”時(shí),語(yǔ)句塊立即得到執(zhí)行;否則,暫停進(jìn)程并等待,直到邏輯表達(dá)式變?yōu)椤罢妗保匍_(kāi)始執(zhí)行后面的語(yǔ)句。
關(guān)于verilog測(cè)試激勵(lì)的語(yǔ)法請(qǐng)打開(kāi),里面有所有的仿真激勵(lì):
打開(kāi)菜鳥(niǎo)教程——資料下載——選擇“verilog最經(jīng)典中文教程”
另外提一句:學(xué)verilog要知道verilog語(yǔ)句的執(zhí)行順序和機(jī)制,生成的對(duì)應(yīng)時(shí)序,哪些語(yǔ)句可綜合哪些不可綜合。這是最基礎(chǔ)的要求。
05
其實(shí)看了之前的鏈接大部分大家應(yīng)該都能看明白了,現(xiàn)在只揀之前沒(méi)講的代碼講。
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
26517 -
交換機(jī)
+關(guān)注
關(guān)注
21文章
2640瀏覽量
99640 -
VHDL語(yǔ)言
+關(guān)注
關(guān)注
1文章
113瀏覽量
18006 -
PWM模塊
+關(guān)注
關(guān)注
0文章
14瀏覽量
9437
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論