日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

【轉(zhuǎn)帖】VHDL的testbench的編寫

 zhangquanling 2012-03-04

大多數(shù)硬件設(shè)計(jì)人員對(duì)verilog的testbench比較熟悉,那是因?yàn)関erilog被設(shè)計(jì)出來(lái)的目的就是為了用于測(cè)試使用,也正是因?yàn)檫@樣verilog的語(yǔ)法規(guī)則才被設(shè)計(jì)得更像C語(yǔ)言,而verilog發(fā)展到后來(lái)卻因?yàn)樗咏麮語(yǔ)言的語(yǔ)法規(guī)則,設(shè)計(jì)起來(lái)更加方便,不像VHDL那也死板嚴(yán)密,所以verilog又漸漸受到硬件設(shè)計(jì)者們的青睞。但其實(shí)VHDL在最開始也是具有測(cè)試能力的,而且它的語(yǔ)法嚴(yán)密,但我們同樣可以用它來(lái)編寫我們的測(cè)試文件。

下面以一個(gè)8bit計(jì)數(shù)器為例子給出個(gè)簡(jiǎn)單的testbench模板及注釋:

      

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;

entity tb_CNT is
end tb_CNT ;

architecture testbench of tb_CNT is
--Component Declaration for the Unit Under Test(UUT)
component MY_CNT
port(
CLK,RESET:
in std_logic;
D_IN:
in std_logic_vector(7 downto 0);
LOAD:
in std_logic;
CE :
in std_logic;
UPDW:
in std_logic;
Q_OUT:
out std_logic_vector(7 downto 0)
);
end component;

--Inputs
signal CLK: std_logic := '0';
signal RESET: std_logic := '0';
signal D_IN: std_logic_vector(7 downto 0):=(others =>'0');
signal LOAD: std_logic := '0';
signal CE: std_logic := '0';
signal UPDW: std_logic := '0';
--Outputs
signal Q_OUT: std_logic_vector(7 downto 0);
constant CLK_period: TIME:=1ns;
begin
--例化計(jì)數(shù)器模塊
UUT: MY_CNT
port map(
CLK
=> CLK,
RESET
=>RESET,
D_IN
=>D_IN,
LOAD
=>LOAD,
CE
=>CE,
UPDW
=>UPDW,
Q_OUT
=>Q_OUT
);
--時(shí)鐘實(shí)現(xiàn)模塊
--上面定義了CLK period時(shí)間常量來(lái)表示時(shí)鐘周期
--以下通過(guò)一個(gè)process來(lái)實(shí)現(xiàn)時(shí)鐘
CLK_process:
process
begin
CLK
<= '0';
wait for CLK_period/2;
CLK
<= '1';
wait for CLK_period/2;
end process;
--其它信號(hào)量的控制
--時(shí)序邏輯的仿真的時(shí)間單位都為CLK周期來(lái)實(shí)現(xiàn)的
--所以將時(shí)鐘周期定義為常量是個(gè)很方便的做法

stim_proc:
process
begin
--hold reset state for 100ms.
wait for 100ms;

wait for CLK_period*10;
--insert stimulus here.
end process;
end testbench;

通過(guò)編寫testbench來(lái)仿真和通過(guò)拖波形來(lái)仿真,最大的好處就是,當(dāng)測(cè)試數(shù)據(jù)無(wú)比龐大時(shí),可以簡(jiǎn)易得通過(guò)testbench中的算法來(lái)實(shí)現(xiàn),而另一個(gè)更為重要的方面就是,可以通過(guò)testbench對(duì)數(shù)據(jù)文件進(jìn)行讀寫操作,從而簡(jiǎn)化我們的仿真工作。

首先介紹下時(shí)間控制語(yǔ)句——wait:(其實(shí)wait語(yǔ)句是通過(guò)控制仿真的兩種狀態(tài)——執(zhí)行和掛起,來(lái)控制時(shí)間的)

1.wait——無(wú)線等待;語(yǔ)法【wait;】,類似于Verilog中的¥Stop

2.wait on——敏感信號(hào)量變化;語(yǔ)法【wait on 信號(hào);】,表示當(dāng)信號(hào)發(fā)生變化的時(shí)候,仿真開始繼續(xù)執(zhí)行,從而結(jié)束掛起狀態(tài)

3.wait until——條件滿足;語(yǔ)法【wait until 表達(dá)式】,表達(dá)式為一個(gè)布爾表達(dá)式,表示當(dāng)表達(dá)式為“真”時(shí),仿真繼續(xù)執(zhí)行,結(jié)束掛起狀態(tài)

4.wait for——時(shí)間控制;語(yǔ)法【wait for 時(shí)間表達(dá)式】,例:【wait for 30ns;】

VHDL也提供了文件I/O的操作,以下簡(jiǎn)單介紹在我們大部分情況下如何通過(guò)VHDL來(lái)進(jìn)行文件操作。

--File process
file_process:
process
file file_out: text is out "data_out.txt";
file file_in : text;
variable fstatus: FILE_OPEN_STATUS;
--定義文件狀態(tài)指示變量,一般有OPEN OK, STATUS ERROR, NAME ERROR, MODE ERROR 四種狀態(tài);
variable count: integer:=5;
--定義integer 型寫入數(shù)據(jù);
variable stringdata:string (5 downto 1):="whwhn";
--定義string 型寫入數(shù)據(jù);
variable vectordata: bit_vector(5 downto 0):="001000";
--定義bit_vector 型寫入數(shù)據(jù);
variable value:std_logic_vector(3 downto 0):="1111";
--定義std_logic_vector型的寫入數(shù)據(jù);
variable stddata:std_logic;
variable BUFO:LINE;
begin
--file_open(fstatus,file_out,"data_out.txt",write_mode);
file_open(fstatus,file_in,"data_in.txt",read_mode);

file類型:文件句柄,用于定義文件。語(yǔ)法1【file 文件變量名:text is 讀取或者寫入類型 “文件名”;】text——文件類型為文本類型,讀取類型為in,寫入類型為out;語(yǔ)法2【file 文件變量名:text;】只是定義了文件變量名,并沒有給賦予初值。

用第二種方式定義文件變量則需要用到函數(shù)file_open();語(yǔ)法【file_open(文件狀態(tài)指示,文件變量,“文件名”,讀寫狀態(tài));】如上圖實(shí)例。

LINE類型:如下圖,為std庫(kù)中TEXTIO文件中的定義


--LINE類型:為std庫(kù)中TEXTIO文件中的定義
for i in 0 to 29 loop
readline (file_in,BUF0);
read(BUF0,stddata);
LOAD
<= stddata;
wait for CLK_period;
end loop;

LINE 為存取類型的變量,它表示該變量是指向字符串的指針,它是TEXTIO 中所有操作的基本單元。讀文件時(shí),先按行(LINE)讀出一行數(shù)據(jù),再對(duì)LINE 操作來(lái)讀取各種數(shù)據(jù)類型的數(shù)據(jù);寫文件時(shí), 先將各種的數(shù)據(jù)類型組合成LINE,再將LINE 寫入文件。在用戶使用時(shí), 必須注意只有變量才可以是存取類型, 而信號(hào)則不能是存取類型。

TEXTIO還定義了一些基本的文件操作過(guò)程:

【READLINE(文件變量,行變量);】從指定的文件中讀取一行。

【READ(行變量,數(shù)據(jù)變量);】從一行中讀取一個(gè)數(shù)據(jù)。

【W(wǎng)RITELINE(文件變量,行變量);】將行變量中數(shù)據(jù)寫入到指定文件。

【W(wǎng)RITE(行變量,數(shù)據(jù)變量);】將數(shù)據(jù)寫入到一行中。

【W(wǎng)RITE(行變量,數(shù)據(jù)變量,起始位置,字符數(shù));】比上個(gè)過(guò)程多了起始位置和字符數(shù)的指定。

按 Ctrl+C 復(fù)制代碼

上圖事例為循環(huán)從數(shù)據(jù)文件中讀取出數(shù)據(jù),賦值給信號(hào)量。

按 Ctrl+C 復(fù)制代碼

上圖事例為了說(shuō)明行變量與各個(gè)變量之間的轉(zhuǎn)換,行變量可與任何變量類型進(jìn)行轉(zhuǎn)換,并且原樣輸出到指定文件中。

另外再推薦個(gè)語(yǔ)句:ASSERT——斷言語(yǔ)句。它和VC中的_TRACE語(yǔ)句一樣,在調(diào)試程序中非常有用非常方便。

assert是一個(gè)調(diào)試仿真時(shí)的專用語(yǔ)法,他可以判斷一個(gè)boolean變量,如果該變量為假就輸出一個(gè)用戶指定的信息到終端(控制臺(tái)),用戶可以附帶輸出信息的嚴(yán)格等級(jí),從低到高依次是:note,warning,error,failure,可以讓用戶區(qū)分信息的類型。同樣assert語(yǔ)句也是不能被綜合的。

assert可以是同步語(yǔ)句(在process外),此時(shí)assert后面的任何變量變化都會(huì)引起assert語(yǔ)句判斷一次。

assert還可以是順序語(yǔ)句,此時(shí)assert存在于process中。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多