TestBench的主要目標是:
- 實例化DUT-Design Under Test
- 為DUT產生激勵波形
- 產生參考輸出,並將DUT的輸出與參考輸出進行比較
- 提供測試通過或失敗的指示
TestBench產生激勵的三種方式:
- 直接在testbench中產生
- 從矢量中讀入
- 從單獨的激勵文件中讀入
比較流行的做法是使用matlab產生激勵文件,由testbench讀入該激勵文件並將激勵饋送到DUT,DUT產生的相應輸出以文件的形式存儲,由matlab讀取並與理想的響應作比較。
下面以一個簡單的同步加法器為例,分析不同形式的testbench的寫法。
1. 簡單的TestBench
簡單的testbench只適合於相對比較簡單的設計。如圖1-1所示,在testbench中只是簡單的實例化了一個DUT,激勵在testbench中產生。可見這種方式的testbench可重用性比較差。
圖1-1 簡單的testbench
圖1-2 DUT VHDL代碼
簡單的testbench代碼如圖1-3所示。
圖1-3 簡單的testbench 代碼
仿真結果如圖1-4所示。
圖1-4 仿真結果
2. 具有獨立激勵源的testbench
將激勵源作為一個文件在testbench中進行實例化,比較適合於具有復雜輸入和簡單輸出的設計。如圖2-1所示。
圖2-1 具有獨立激勵源的testbench
在本例中,DUT的激勵源為一個計數器。相應的VHDL代碼如下:
圖2-2 激勵源代碼
編寫完成激勵源的VHDL碼后,還需要在testbench中進行實例化,方法與實例化DUT的方法一致。相應的testbench代碼如下:
圖2-3 具有獨立激勵源的testbench代碼
3. 使用TextIO的testbench
當設計的輸入輸出都比較復雜時,尤其是在做復雜的算法仿真時,需要產生多種形式的激勵輸入,還要對仿真結果輸出做復雜的分析時,使用TextIO的testbench具有最高的效率。在使用TextIO的testbench中,為DUT從輸入文件讀取激勵輸入,激勵信號經過DUT處理后寫入到輸出文件中。其原理如圖3-1所示。
圖3-1 使用TextIO的testbench原理框圖
在本例中,我們將Matlab產生的兩個激勵輸入文件加載到testbench中,在輸入到DUT之前先進行類型轉換,然后按照時鍾節拍將數據一個一個的加載到DUT的輸入端口,再按照時鍾節拍從DUT輸出端口將數據寫入到輸出文件,當然在寫入輸入文件之前也要先進行類型轉換。如圖3-2所示。
圖3-2 針對本例的testbench原理框圖
Matlab產生加法器兩個輸入激勵的代碼如下,激勵輸入為范圍在0~7之間的隨機數,最后保存到txt文件中供testbench讀取。
圖3-3 激勵產生m代碼
使用TextIO的testbench代碼如下:
仿真結果如圖3-5所示。
圖3-5 仿真結果
下面我們對於如何在TestBench中使用TextIO做一個小結。
(1).首先需要聲明TextIO的包集
(2).然后在process中聲明輸入、輸出文件
(3).接着聲明讀寫文件的行變量
(4).再聲明用於保存行變量中值的數據變量
(5).最后進行文件的讀寫,在讀文件之前需要判斷文件是否已經被讀到末尾。讀文件時,先從文件中按行讀出一行數據,再將行中的數據讀到數據變量中。寫文件時,先將數據變量組合成一行,再將行變量中的數據寫入文件。需要注意的是只有variable型才是文件存取類型,不能使用signal型。
TextIO包集中定義了一些常用的文件操作過程:
readline(file_var, line_var);
--用於從文件file_var中讀取一行數據保存到line_var中
read(line_var, data_var);
--用於從line_var中讀取數據保存到data_var中
writeline(file_var, line_var);
--用於將line_var寫入到file_var中
write(line_var, data_var);
--用於將data_var寫入到line_var中
endfile(file_var)
--判斷file_var是否已經到文件末尾
4. Ref
[1] TKT-1210 Digital design Ⅱ,Lect5 VHDL Test Bench