VHDL與Verilog硬體描述語言TestBench的編寫

2021-12-21 FPGA之家

點擊藍字關注我們FPGA之家-中國最好最大的FPGA純工程師社群

VHDL與Verilog硬體描述語言在數字電路的設計中使用的非常普遍,無論是哪種語言,仿真都是必不可少的。而且隨著設計複雜度的提高,仿真工具的重要性就越來越凸顯出來。在一些小的設計中,用TestBench來進行仿真是一個很不錯的選擇。VHDL與Verilog語言的語法規則不同,它們的TestBench的具體寫法也不同,但是應包含的基本結構大體相似,在VHDL的仿真文件中應包含以下幾點:實體和結構體聲明、信號聲明、頂層設計實例化、提供激勵;Verilog的仿真文件應包括:模塊聲明、信號聲明、頂層設計實例化、提供激勵。大致思想都是相似的。

  簡單的說,TestBench就是一種驗證手段,從軟體層面對設計的硬體電路進行仿真。具體來講,一般是在你的仿真文件裡,產生激勵信號,作用於被仿真的設計文件DUT(Design Under Test),產生相應的輸出,然後根據輸出信號檢驗設計的電路是否存在問題或者存在哪些問題。

  下面以FPGA板中驅動流水燈的一段程序為例,簡單介紹一下兩種語言的TestBench的編寫。

1 module led_run(clk,rst,led);
2 input clk,rst;
3 output reg [7:0] led;
4 reg [25:0] clk_cnt;
5 reg clk_tmp;
6 reg [3:0] temp;
7
8 always@(posedge clk or negedge rst)
9 begin
10 if(!rst)
11 begin
12 clk_cnt<=26'd0;
13 clk_tmp<=1'b1;
14 end
15 else
16 begin
17 if(clk_cnt==26'b11111111111111111111111111)
18 begin
19 clk_cnt<=26'd0;
20 clk_tmp<=~clk_tmp;
21 end
22 else
23 clk_cnt<=clk_cnt+1'b1;
24 end
25 end
26
27 always@(posedge clk_tmp or negedge rst)
28 begin
29 if(!rst)
30 temp<=4'd15;
31 else
32 temp<=temp+1'b1;
33 end
34
35 always@(temp)
36 begin
37 case(temp)
38 4'd0 :led<=8'b11111110;
39 4'd1 :led<=8'b11111100;
40 4'd2 :led<=8'b11111000;
41 4'd3 :led<=8'b11110000;
42 4'd4 :led<=8'b11100000;
43 4'd5 :led<=8'b11000000;
44 4'd6 :led<=8'b10000000;
45 4'd7 :led<=8'b00000000;
46 4'd8 :led<=8'b00000001;
47 4'd9 :led<=8'b00000011;
48 4'd10:led<=8'b00000111;
49 4'd11:led<=8'b00001111;
50 4'd12:led<=8'b00011111;
51 4'd13:led<=8'b00111111;
52 4'd14:led<=8'b01111111;
53 4'd15:led<=8'b11111111;
54 default:;
55 endcase
56 end
57
58 endmodule

  上面是一段流水燈的代碼,控制8位流水燈依次點亮,再依次熄滅。第一個always語句完成分頻功能,第二個always語句用於計數,共16個值,第三個always語句根據計數的值選擇LED燈的狀態。其中clk、rst分別為時鐘和復位信號,led為驅動流水燈的輸出信號。接下來針對這一設計編寫其TestBench文件。

1 /************TestBench*************/
2 module tb_led_run;
3 reg clk,rst;
4 wire led;
5
6 initial
7 begin
8 rst=1;
9 #30 rst=0;
10 #40 rst=1;
11 end
12
13 initial
14 begin
15 clk=1;
16 forever #20 clk=~clk;
17 end
18
19 led_run led1(.clk(clk),.rst(rst),.led(led));
20 endmodule

  由於只需要時鐘和復位信號即可,故在其仿真文件並不複雜,建立測試模塊,進行信號聲明,在兩個initial中分別提供clk和rst信號,最後進行例化。當然注意一點,在仿真時要把分頻模塊去掉,或者將分頻係數改小,否則仿真時不容易觀察波形。下面是在Modelsim中仿真得到的波形(分頻模塊改為2分頻)。

  總結起來,Verilog的TestBench有著相對固定的寫法:

module test_bench;
埠聲明語句

initial
begin
產生時鐘信號
end

initial
begin
提供激勵源
end

例化語句
endmodule

  最主要的是在initial語句中進行激勵的生成,這要根據具體的設計來分析。

 

  下面對比介紹VHDL語言TestBench的寫法。同樣的功能,驅動流水燈,VHDL的程序如下:

1 LIBRARY IEEE;
2 USE IEEE.STD_LOGIC_1164.ALL;
3 USE IEEE.STD_LOGIC_UNSIGNED.ALL;
4
5 ENTITY led_run IS
6 PORT(clk:in std_logic;
7 rst:in std_logic;
8 led:out std_logic_vector(7 downto 0):="11111111" );
9 END led_run;
10
11 ARCHITECTURE arc_led_run OF led_run IS
12 signal temp:std_logic_vector(3 downto 0);
13 signal clk_cnt:std_logic_vector(25 downto 0);
14 signal clk_tmp:std_logic:='1';
15 BEGIN
16 divider:PROCESS(clk,rst)
17 BEGIN
18 if(rst='0') then
19 clk_cnt<="00000000000000000000000000";
20 elsif(clk'event and clk='1') then
21 clk_cnt<=clk_cnt+1;
22 if(clk_cnt="11111111111111111111111111") then
23 clk_cnt<="00000000000000000000000000";
24 clk_tmp<=NOT clk_tmp;
25 end if;
26 end if;
27 END PROCESS;
28
29 PROCESS(clk_tmp,rst)
30 BEGIN
31 if(rst='0') then
32 temp<="1111"; --all the led off
33 elsif(clk_tmp'event and clk_tmp='1') then
34 temp<=temp+1;
35 end if;
36 END PROCESS;
37
38 PROCESS(temp)
39 BEGIN
40 case temp is
41 when"0000"=>led<="11111110";
42 when"0001"=>led<="11111100";
43 when"0010"=>led<="11111000";
44 when"0011"=>led<="11110000";
45 when"0100"=>led<="11100000";
46 when"0101"=>led<="11000000";
47 when"0110"=>led<="10000000";
48 when"0111"=>led<="00000000";
49 when"1000"=>led<="00000001";
50 when"1001"=>led<="00000011";
51 when"1010"=>led<="00000111";
52 when"1011"=>led<="00001111";
53 when"1100"=>led<="00011111";
54 when"1101"=>led<="00111111";
55 when"1110"=>led<="01111111";
56 when"1111"=>led<="11111111";
57 when others=>NULL;
58 end case;
59 END PROCESS;
60
61 END arc_led_run;

  根據語法要求,首先聲明庫,接著定義實體和結構體。在結構體中用三個進程(PROCESS)分別實現分頻、計數、流水燈狀態分配的功能,功能相當於上面Verilog程序中的三個always語句。接下來寫TestBench文件:

1 TestBench--
2 LIBRARY IEEE;
3 USE IEEE.STD_LOGIC_1164.ALL;
4
5
6 ENTITY tb_led_run IS --空實體
7 END tb_led_run;
8
9
10 ARCHITECTURE arc_tb_led_run OF tb_led_run IS --結構體
11
12 COMPONENT led_run IS --元件聲明
13 PORT(clk:in std_logic;
14 rst:in std_logic;
15 led:out std_logic_vector(7 downto 0));
16 END COMPONENT;
17
18 signal clk,rst:std_logic;
19 signal led:std_logic_vector(7 downto 0);
20 constant clk_period:time:=5 ns;
21
22 BEGIN
23
24 DUT:led_run PORT MAP(clk=>clk,rst=>rst,led=>led); --元件例化
25
26 clk_gen:PROCESS
27 BEGIN
28 clk<='1';
29 wait for clk_period/2;
30 clk<='0';
31 wait for clk_period/2;
32 END PROCESS;
33
34 tb:PROCESS
35 BEGIN
36 rst<='0';
37 wait for 12 ns;
38 rst<='1';
39 wait;
40 END PROCESS;
41
42 END arc_tb_led_run;

  在這個TestBench中同樣只需要提供clk和rst信號,分別在兩個進程實現,Modelsim中的仿真結果如下(同樣在仿真的時候將分頻係數改為2):

  總結一下,VHDL的TestBench寫法也有相對固定的格式:

library ieee; --庫聲明
use ieee.std_logic_1164.all;

entity test_bench is --測試平臺文件的空實體(不需要埠定義)
end test_bench;

architecture tb_behavior of test_bench is --結構體
component entity_under_test --被測試元件的聲明
port(
list-of-ports-theri-types-and-modes
);
end component;

begin
instantiation:entity_under_test port map --元件例化
(
port-associations
);

process() --產生時鐘信號
……
end process;

process() --產生激勵源
……
end process;

end tb_behavior;

  相對與Verilog語言來說,VHDL的TestBench除了自身的庫聲明以及Entity和Architecture之外,還需要進行元件的聲明,即將被測試的設計聲明為一個元件,然後對其例化。在激勵的產生方面與Verilog思路相同。  

  從上面的程序可以看出,Verilog語言相對比較隨意一些,從C語言編程中繼承了多種操作符和結構;而VHDL的語法則比較嚴謹,有固定的格式。但在功能的實現上二者大同小異。比如Verilog中的always語句,在VHDL中可以找到PROCESS與之對應,當然更多的是不同。兩種語言均可在不同的抽象層次對電路進行描述:系統級、算法級、寄存器傳輸級、邏輯門級和開關電路級,但是VHDL更擅長系統級,而Verilog更方便底層描述。在學習硬體描述語言的時候不妨對比學習一下,相信會對電路設計的理解更加深一層。


歡迎大家加入全國最大最強的FPGA微信技術群,這個群體擁有數萬工程師、一群熱愛技術的工程師,這裡的FPGA工程師相互幫助,相互分享,技術氛圍濃厚!趕緊叫上小夥伴一起加入吧!

           

           用手指按住就可以加入FPGA全國技術群哦!

國內最好的Xilinx和altera晶片供應商之一!

平臺自營,進口原裝品質保證!

持續供應多家軍工研究所和上市公司!

最好的FPGA晶片價格和最好的售後服務!

擁有業內最頂尖的服務口碑!

全球頂尖供應商質量標準背書!

XILINX全系列訂貨或者現貨優勢!

XCVU9P-2FLGB2104I   200PCS

XCVU9P-2FLGA2104I   500PCS

XCVU13P-2FLGB2104I  300PCS

XC7K325T-2FFG900I   1500PCS

XC7K325T-2FFG676I  950PCS

XC7K160T-2FFG676I   850PCS

XC7VX690T-2FFG1927I  到貨

XC7VX690T-2FFG1761I  到貨

更多賽靈思型號需求請諮詢我們!謝謝!掃碼二維碼即可!

                     

FPGA技術群官方鳴謝品牌:Xilinx、 intel(Altera)、microsemi(,Actel)、LattIC e,Vantis,Quicklogic,Lucent等對技術群的支持!

相關焦點

  • Verilog代碼轉VHDL代碼經驗總結
    語言和VHDL語言是兩種不同的硬體描述語言,但並非所有人都同時精通兩種語言,所以在某些時候,需要把Verilog代碼轉換為VHDL代碼。你已經習慣某種語言,也發現語言不是學習FPGA時需要考慮的問題,它僅僅是硬體描述語言工具而已。可是,當你發現一份和你使用語言不同的代碼作為參考時,你又開始想:我以後的工作是不是要二種語言都會,這樣工作才會得心應手?事實上,兩種語言之間是可以相互轉換的。
  • 編寫高效的測試設計(testbenches)
    一般測試設計使用工業標準的VHDL或verilog硬體描述語言來編寫。測試設計調用功能設計,然後仿真。複雜的測試設計完成一些附加的功能----如它們包含邏輯來為設計決定適當的設計激勵或比較實際結果和預期結果。  後續的章節說明了一個非常穩定的測試設計的結構,並且提供了一個自較驗測例子----它將自動比較實際結果和測試設計的預期結果。
  • 簡談FPGA Verilog testbench
    大家好,又到了每日學習的時間了,今天我們來聊一聊FPGA中測試文件編寫的相關知識,聊一聊激勵仿真。        對於testbench而言,埠應當和被測試的module一一對應。        $dumpfile和$dumpvar是verilog語言中的兩個系統任務,可以調用這兩個系統任務來創建和將指定信息導入VCD文件.        對於fsdb文件來說,對應的命令是fsdbDumpfile,dumpfsdbvars        (什麼是VCD文件?
  • 例說Verilog HDL和VHDL區別,助你選擇適合自己的硬體描述語言
    如果你搜索Verilog和VHDL的區別,你會看到很多討論這場HDL語言戰爭的區別頁面
  • FPGA開發分析一個testbench
    分析Xilinx提供的testbench可以為我們編寫自己的testbench提供很好的參考。FIFO的RTL代碼和testbench代碼放在ISEexamples\fifo_ver_131和fifo_vhd_131下。
  • FPGA中的testbench
    testbench就是對寫的FPGA文件進行測試的文件,可以是verilog也可以是VHDL。verilog和VHDL的國際標準裡面有很多不能被綜合實現的語句,比如initial,forever,repeat,延時語句#1等等,這些語句就是用來測試的時候使用的。運行環境一般是ise或者vivado或者quartus自帶的仿真工具,或者如modelsim一樣的第三方仿真工具。
  • 十天學會FPGA之三——testbench的寫法
    廢話不多說直接上乾貨,testbench就是對寫的FPGA文件進行測試的文件,可以是verilog也可以是VHDL
  • vhdl語言和c語言區別大嗎?差異性體現在哪兒
    1987 年底,VHDL被 IEEE 和美國國防部確認為標準硬體描述語言。VHDL主要用於描述數字系統的結構,行為,功能和接口。除了含有許多具有硬體特徵的語句外,VHDL的語言形式和描述風格與句法是十分類似於一般的計算機高級語言。
  • Cordic算法(sinx,cosx)的Verilog實現
    在數字電路中,加減法和移位操作耗費資源少且處理速度快,所以cordic算法在硬體中容易實現,而且能起到提高處理速度,降低資源消耗的功能。在某些特殊情況,比如asic開發,現有的編譯軟體自帶的IP核是不能使用的,比如我最近需要做的東西,需要的信號發生器(正弦波發生器)就只能自己使用verilog進行實現。
  • Verilog 最全經驗總結(建議收藏)
    如果是在ModelSim中作為單獨的模塊仿真,那麼在模塊輸出的時候,不能使用force命令將其設為高阻態,而是使用release命令將總線釋放掉很多初學者在寫testbench進行仿真和驗證的時候,被inout雙向口難住了。仿真器老是提示錯誤不能進行。下面是我個人對inout埠寫testbench仿真的一些總結,並舉例進行說明。
  • VHLD語言
    掌握VHDL語言的語法2.        學習VHDL語言的建模(可綜合部分的編寫),以及測試文件(testbench)的編寫  注釋語言單行注釋多行注釋Verilog//.../*.設計者編寫的所有的文件都會映射到該庫。
  • Verilog RTL數字電路設計
    Verilog語言從C語言中繼承了多種操作符和結構,與C語言相比最大的特點是並行性 ,主要用於從算法級、RTL級、門級、開關級四個層面對數字系統進行建模。什麼是硬體描述語言?顧名思義就是描述硬體的語言,它用文本的形式來描述電子系統硬體結構和行為,是一種用形式化方法來描述數字電路和系統的語言。
  • FPGA程式語言——verilog語法
    用Verilog HDL描述的電路設計就是該電路的Verilog HDL模型也稱為模塊。Verilog HDL既是一種行為描述的語言也是一種結構描述的語言。這也就是說,無論描述電路功能行為的模塊或描述元器件或較大部件互連的模塊都可以用Verilog語言來建立電路模型。如果按照一定的規矩編寫,功能行為模塊可以通過工具自動地轉換為門級互連模塊。Verilog模型可以是實際電路的不同級別的抽象。
  • Verilog開源仿真工具Icarus Verilog的工作原理
    編譯編譯就是從接收命令行參數開始,到預處理(verilog宏展開,文件include,條件編譯),Verilog語法解析(關鍵字識別、語法解析),最後轉換成內部的數據結構(就是用各種class、結構體,如module、net、scope、generate、statement、expression等)的過程。簡單的講,就是實別Verilog文件,轉成內部的資料庫。
  • Verilog 裡面,always,assign和always@(*)區別
    2.如果沒有@,那就是不會滿足特定條件才執行,而是執行完一次後立馬執行下一次,一直重複執行,比如testbench裡面產生50Mhz的時鐘就(假設時間尺度是1ns)可以寫成 一般always@(*)是指裡面的語句是組合邏輯的。*代替了敏感變量。
  • DUT 和 testbench 是如何連接的
    總體來說,接口就是在 testbench 這邊定義了訪問的 DUT 的管腳的集合,通過對接口中管腳信號的操作,來實現對 DUT 的管腳的操作, 這樣能夠實現驗證平臺和待測模塊的分離。驗證工程師和設計工程師只要定義好接口關係,就可以分別開展工作。
  • verilog語言與c語言的區別
    VHDL語言 C語言   Verilog HDL是一種硬體描述語言(HDL:Hardware Description Language),以文本形式來描述數字系統硬體的結構和行為的語言,用它可以表示邏輯電路圖、邏輯表達式,還可以表示數字邏輯系統所完成的邏輯功能。
  • FPGA 入門到精通系列2:verilog基礎3-verilog代碼復用(generate、function)
    一直以來寫verilog代碼,特別是寫算法,比如圖像處理,總感覺寫的是軟體C語言的按照周期展開的計算邏輯,雖然很多都是ctrl+c和ctrl
  • FPGA之程式語言verilog
    1、硬體描述語言HDL(Hardware Description Language)硬體描述語言(HDL)是一種用形式化方法來描述數字電路和系統的語言