基本testbench寫法

1. 給模塊取一個名字(可任意取,一般在仿真模塊後加"_test")

    例如:

        module myDesign_test;

          /*/////////*/

        endmodule

2. 定義變量類型

   將輸入信號定義爲reg類型的;將輸出信號定義爲wire類型的;

3. 例化模塊,並將輸入的信號和2中定義的信號進行關聯。

   例如:

myDesign myDesignuut(.rst(rst),

                                      .clk(clk),

                                      .data_in(data_in),

                                         ...........

                                      .data_out(data_out) );

4. 產生時鐘模塊

   根據需要產生一個或多個時鐘。一般先定義時鐘週期爲一個常量。

   例如:

    Parameter CYCLE = 100;

    always   #(CYCLE) clk = ~clk;//定義系統時鐘

    always @(clk) clk2 = ~clk2;//二分頻

        -----各種生成時鐘的方法就不說了

5. 時鐘控制和reset信號的控制

一般放在initial模塊裏,跟據具體需要對reset信號進行編輯;並注意時鐘信號的初始化,否則無法產生正常的時鐘信號(若不初始化,clk可能默認爲x狀態,~x狀態仍爲x,即不會產生時鐘驅動)。

例如:

   initial

begin

clk = 0;

clk2 = 0;

.............//時鐘相關信號初始化

rst = 0;

#(3*CYCLE);

rst = 1;

#(CYCLE);

rst = 0;

......//根據需要對整個系統的復位信號進行設計,要有清晰的時序觀念

end

6. 初始化文件操作

基本的文件操作包括讀和寫,將它們寫在一個initial中(僅關心文件的打開和關閉,不進行仿真過程中的寫操作)。

讀操作需要一個採用ROM格式寫的文件,和一個ROM單元:

例如:

      reg[10:0] my_rom [2:0];

      $readmemb("my_rom_file.txt",my_rom);

寫操作需要一個文件句柄,還要注意仿真結束前關閉文件操作。

例如:

integer fid;

fid = $fopen("resut.txt");

.........

#(1000000*CYCLE);

$fclose(fid);

7. 控制信號和輸出結果的編程

根據具體的實例對控制信號進行編程,並採樣其輸出結果,分多個initial模塊進行。要形成很強的時序觀念,並儘量使每個initial模塊結構相對單一。此時大多調用文件寫操作保存仿真結果。

例如:

.......

      $fdisplay(fid,"%b",data_out);

      .......

8.結束testbench程序的運行

用$stop 或$finish結束程序的運行,另起一個initial。

例如:

         initial

        begin

              #(1000000*CYCLE);

             $ stop;

        end

/++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章