VHDL TestBench基礎(轉)

TestBench的主要目標是:

  • 實例化DUT-Design Under Test
  • 爲DUT產生激勵波形
  • 產生參考輸出,並將DUT的輸出與參考輸出進行比較
  • 提供測試經過或失敗的指示

TestBench產生激勵的三種方式:git

  • 直接在testbench中產生
  • 從矢量中讀入
  • 從單獨的激勵文件中讀入

比較流行的作法是使用matlab產生激勵文件,由testbench讀入該激勵文件並將激勵饋送到DUT,DUT產生的相應輸出以文件的形式存儲,由matlab讀取並與理想的響應做比較。算法

下面以一個簡單的同步加法器爲例,分析不一樣形式的testbench的寫法。post

1. 簡單的TestBench

簡單的testbench只適合於相對比較簡單的設計。如圖1-1所示,在testbench中只是簡單的實例化了一個DUT,激勵在testbench中產生。可見這種方式的testbench可重用性比較差。測試

clip_image002

圖1-1 簡單的testbenchspa

clip_image004

圖1-2 DUT VHDL代碼設計

簡單的testbench代碼如圖1-3所示。blog

clip_image006

clip_image008

clip_image010

圖1-3 簡單的testbench 代碼ip

仿真結果如圖1-4所示。get

clip_image012

圖1-4 仿真結果同步

2. 具備獨立激勵源的testbench

將激勵源做爲一個文件在testbench中進行實例化,比較適合於具備複雜輸入和簡單輸出的設計。如圖2-1所示。

clip_image014clip_image016

圖2-1 具備獨立激勵源的testbench

在本例中,DUT的激勵源爲一個計數器。相應的VHDL代碼以下:

clip_image018

圖2-2 激勵源代碼

編寫完成激勵源的VHDL碼後,還須要在testbench中進行實例化,方法與實例化DUT的方法一致。相應的testbench代碼以下:

clip_image020

clip_image022

clip_image024

圖2-3 具備獨立激勵源的testbench代碼

3. 使用TextIO的testbench

當設計的輸入輸出都比較複雜時,尤爲是在作複雜的算法仿真時,須要產生多種形式的激勵輸入,還要對仿真結果輸出作複雜的分析時,使用TextIO的testbench具備最高的效率。在使用TextIO的testbench中,爲DUT從輸入文件讀取激勵輸入,激勵信號通過DUT處理後寫入到輸出文件中。其原理如圖3-1所示。

clip_image026

圖3-1 使用TextIO的testbench原理框圖

在本例中,咱們將Matlab產生的兩個激勵輸入文件加載到testbench中,在輸入到DUT以前先進行類型轉換,而後按照時鐘節拍將數據一個一個的加載到DUT的輸入端口,再按照時鐘節拍從DUT輸出端口將數據寫入到輸出文件,固然在寫入輸入文件以前也要先進行類型轉換。如圖3-2所示。

clip_image028

圖3-2 針對本例的testbench原理框圖

Matlab產生加法器兩個輸入激勵的代碼以下,激勵輸入爲範圍在0~7之間的隨機數,最後保存到txt文件中供testbench讀取。

clip_image030

圖3-3 激勵產生m代碼

使用TextIO的testbench代碼以下:

clip_image032

clip_image034

clip_image036

clip_image038

clip_image040圖3-4 testbench代碼

仿真結果如圖3-5所示。

clip_image042

圖3-5 仿真結果

下面咱們對於如何在TestBench中使用TextIO作一個小結。

(1).首先須要聲明TextIO的包集

clip_image044

(2).而後在process中聲明輸入、輸出文件

clip_image046

(3).接着聲明讀寫文件的行變量

clip_image048

(4).再聲明用於保存行變量中值的數據變量

clip_image050

(5).最後進行文件的讀寫,在讀文件以前須要判斷文件是否已經被讀到末尾。讀文件時,先從文件中按行讀出一行數據,再將行中的數據讀到數據變量中。寫文件時,先將數據變量組合成一行,再將行變量中的數據寫入文件。須要注意的是隻有variable型纔是文件存取類型,不能使用signal型。

clip_image052

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

相關文章
相關標籤/搜索