乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

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

       zhangquanling 2012-03-04

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

      下面以一個(gè)8bit計(jì)數(shù)器為例子給出個(gè)簡單的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í)間常量來表示時(shí)鐘周期
      --以下通過一個(gè)process來實(shí)現(xiàn)時(shí)鐘
      CLK_process:
      process
      begin
      CLK
      <= '0';
      wait for CLK_period/2;
      CLK
      <= '1';
      wait for CLK_period/2;
      end process;
      --其它信號量的控制
      --時(shí)序邏輯的仿真的時(shí)間單位都為CLK周期來實(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;

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

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

      1.wait——無線等待;語法【wait;】,類似于Verilog中的¥Stop

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

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

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

      VHDL也提供了文件I/O的操作,以下簡單介紹在我們大部分情況下如何通過VHDL來進(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類型:文件句柄,用于定義文件。語法1【file 文件變量名:text is 讀取或者寫入類型 “文件名”;】text——文件類型為文本類型,讀取類型為in,寫入類型為out;語法2【file 文件變量名:text;】只是定義了文件變量名,并沒有給賦予初值。

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

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


      --LINE類型:為std庫中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ù),再對LINE 操作來讀取各種數(shù)據(jù)類型的數(shù)據(jù);寫文件時(shí), 先將各種的數(shù)據(jù)類型組合成LINE,再將LINE 寫入文件。在用戶使用時(shí), 必須注意只有變量才可以是存取類型, 而信號則不能是存取類型。

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

      【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è)過程多了起始位置和字符數(shù)的指定。

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

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

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

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

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

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

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

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

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

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多