01
testbench是什么
廢話不多說直接上干貨,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)單明了的給出過或者不過的信息就好了。請(qǐng)大家寫仿真文件的時(shí)候盡量做到這點(diǎn)。
03
testbench運(yùn)行順序之謎
首先,跟大家解釋一點(diǎn),所有testbench本質(zhì)上都是串行執(zhí)行,因?yàn)樵?a href="http://www.delux-kingway.cn/v/tag/132/" target="_blank">CPU環(huán)境下,沒有可靠并行執(zhí)行的能力。所有并行的語(yǔ)句,比如兩個(gè)always模塊,fork join語(yǔ)句塊,都是軟件模擬并行執(zhí)行的。所以老一點(diǎn)的編譯器,信號(hào)定義要在initial語(yǔ)句前面,initial的信號(hào)要先有初始值后面的語(yǔ)句才能從給定初值開始執(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后面沒有@!沒有@的時(shí)候always代表永遠(yuǎn)循環(huán)執(zhí)行begin end之間的語(yǔ)句,如果有@,后面一定要加時(shí)鐘,代表時(shí)鐘邊沿來(lái)到的時(shí)候順序執(zhí)行begin end里面的語(yǔ)句。沒有@的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)椤罢妗保匍_始執(zhí)行后面的語(yǔ)句。
關(guān)于verilog測(cè)試激勵(lì)的語(yǔ)法請(qǐng)打開,里面有所有的仿真激勵(lì):
打開菜鳥教程——資料下載——選擇“verilog最經(jīng)典中文教程”
另外提一句:學(xué)verilog要知道verilog語(yǔ)句的執(zhí)行順序和機(jī)制,生成的對(duì)應(yīng)時(shí)序,哪些語(yǔ)句可綜合哪些不可綜合。這是最基礎(chǔ)的要求。
05
其實(shí)看了之前的鏈接大部分大家應(yīng)該都能看明白了,現(xiàn)在只揀之前沒講的代碼講。
-
FPGA設(shè)計(jì)
+關(guān)注
關(guān)注
9文章
428瀏覽量
26642 -
交換機(jī)
+關(guān)注
關(guān)注
21文章
2660瀏覽量
100214 -
VHDL語(yǔ)言
+關(guān)注
關(guān)注
1文章
113瀏覽量
18106 -
PWM模塊
+關(guān)注
關(guān)注
0文章
14瀏覽量
9463
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
怎樣在Verilog寫的testbench測(cè)試VHDL模塊??
testbench設(shè)置的問題
LFSR testbench V1.2
Writing Testbench
![Writing <b class='flag-5'>Testbench</b>](https://file.elecfans.com/web2/M00/48/AD/pYYBAGKhtBaAeRAvAABeG8WsfMQ336.jpg)
testbench怎么寫_testbench經(jīng)典教程VHDL
![<b class='flag-5'>testbench</b>怎么寫_<b class='flag-5'>testbench</b>經(jīng)典教程VHDL](https://file1.elecfans.com//web2/M00/A7/01/wKgZomUMQcGAGhWWAAAN7PTmfKM041.jpg)
簡(jiǎn)單的Testbench設(shè)計(jì)
Verilog testbench總結(jié)
典型的UVM Testbench架構(gòu)
![典型的UVM <b class='flag-5'>Testbench</b>架構(gòu)](https://file1.elecfans.com/web2/M00/88/7F/wKgaomRq0gaAMHrGAAA5QCvxGv8490.png)
Verilog Testbench怎么寫 Verilog Testbench文件的編寫要點(diǎn)
![Verilog <b class='flag-5'>Testbench</b>怎么寫 Verilog <b class='flag-5'>Testbench</b>文件的編寫要點(diǎn)](https://file1.elecfans.com/web2/M00/8E/96/wKgZomTIjpeARrzRAAAZ25L62A4515.png)
Testbench的基本組成和設(shè)計(jì)規(guī)則
![<b class='flag-5'>Testbench</b>的基本組成和設(shè)計(jì)規(guī)則](https://file1.elecfans.com/web2/M00/A2/94/wKgaomTxRYaAdMYrAAAUREisue0897.jpg)
編寫高效Testbench的指南和示例
![編寫高效<b class='flag-5'>Testbench</b>的指南和示例](https://file1.elecfans.com/web2/M00/0A/72/wKgZomcgmb-AdWI4AAA2OcTRjRg055.png)
評(píng)論