<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] ## 前言 ` `在linux下做FPGA開發驗證模塊功能時我們需要仿真,但是我們使用IDE工具會拉低效率,因為無論是quartus還是xilinx的開發工具,其設計本來就比較全面,運行的時候有很多東西都在運行,如果我們只需要仿真一個簡單的模塊,有可能整套走下來需要幾分鐘,源文件更改后再次仿真又要耗時幾分鐘,因此會影響我們的效率。 ` `這個時候我們可以使用iverilog這塊輕量級的綜合工具來做好這個工作,搭建好環境后反復調試將會很節約時間。 ## 準備工作 ` `首先我們需要安裝必要的工具。我的環境是deepin15.11。 * 安裝iverilog ``` sudo apt-get install iverilog ``` * 安裝查看波形的工具GTKwave ``` sudo apt-get install gtkwave ``` ` `linux下的verilog編輯器推薦使用**VS Code**,VS Code是一款非常好用的編輯器,基本各種語言使用中都可以得到很好的體驗。一款編輯器,搞定linux下大部分開發。注意要支持verilog語法,請到VSCode的插件中搜索verilog然后選擇一款進行安裝。 ![](https://img.kancloud.cn/a3/f3/a3f35242e2a051b8ee61a327e56c8c60_902x528.png) ![](https://img.kancloud.cn/22/34/223400bdb79160dc5a47e9f629744773_499x428.png) ## 基本參數說明 Icarus Verilog編譯器主要包含3個工具: * iverilog:用于編譯verilog和vhdl文件,進行語法檢查,生成可執行文件 * vvp:根據可執行文件,生成仿真波形文件 * gtkwave:用于打開仿真波形文件,圖形化顯示波形 在終端輸入`iverilog`回車,可以看到常用參數使用方法的簡單介紹: ![](https://img.kancloud.cn/91/f3/91f32daaf4d930f04f0981211aec6ddc_721x360.png) ### 參數 -o ` `這是比較常用的一個參數了,和GCC中-o的使用幾乎一樣,用于指定生成文件的名稱。如果不指定,默認生成文件名為a.out。如:`iverilog -o test test.v`。 ### 參數 -y ` `用于指定包含文件夾,如果top.v中調用了其他的的.v模塊,top.v直接編譯會提示 ~~~ led_demo_tb.v:38: error: Unknown module type: led_demo 2 error(s) during elaboration. *** These modules were missing: led_demo referenced 1 times. *** ~~~ ` `找不到調用的模塊,那么就需要指定調用模塊所在文件夾的路徑,支持相對路徑和絕對路徑。 ` `如:`iverilog -y D:/test/demo led_demo_tb.v` ` `如果是同一目錄下:`iverilog -y ./ led_demo_tb.v`,另外,iverilog還支持Xilinx、Altera、Lattice等FPGA廠商的仿真庫,需要在編譯時通過-y參數指定庫文件的路徑,詳細的使用方法可以查看官方用戶指南: [https://iverilog.fandom.com/wiki/User\_Guide](https://iverilog.fandom.com/wiki/User_Guide) ### 參數-I ` `如果程序使用`include語句包含了頭文件路徑,可以通過-i參數指定文件路徑,使用方法和-y參數一樣。 ` `如:`iverilog -I D:/test/demo led_demo_tb.v` ### 參數-tvhdl ` `verilog還支持把verilog文件轉換為VHDL文件,如`iverilog -tvhdl -o out_file.vhd in_file.v` ## 仿真流程 ### 綜合 ` `通過`iverilog -o tb tp_counter.v counter.v`命令,對源文件和仿真文件,進行語法規則檢查和編譯。由于本示例比較簡單,只有1個文件,如果調用了多個.v的模塊,可以通過前面介紹的-y參數指定源文件的路徑,否則編譯報錯。如果源文件都在同同一個目錄,可以直接通過`./`絕對路徑的方式來指定。 ` `如果編譯成功,會在當前目錄下生成名稱為tb的文件。 ![](https://img.kancloud.cn/c6/4b/c64bc664714caf763f84dc08551b1d29_773x482.png) ### 生成波形文件 ` `使用`vvp -n tb -lxt2`命令生成lxt波形文件,運行之后,會在當前目錄下生成.lxt文件。 ![](https://img.kancloud.cn/5a/fa/5afa5ad43f464194793cb8fb3d95d7db_813x84.png) ` `如果沒有生成,需要檢查testbench文件中是否添加了如下幾行: ``` initial begin $dumpfile("tb.lxt"); $dumpvars(0, counter); end ``` ### 使用GTKwav查看波形 ` `使用命令`gtkwave tb.lxt`,可以在圖形化界面中查看仿真的波形圖 ![](https://wcc-blog.oss-cn-beijing.aliyuncs.com/img/iverilog/gtkwave.gif) ![](https://img.kancloud.cn/de/5c/de5cc1956e77bfc68c7ecceb87f60251_1022x635.png) ![](https://img.kancloud.cn/8a/69/8a690087655457a9e7fe2f0df9e35580_1184x497.png) verilog轉換為VHDL ` `雖然VHDL和Verilog都誕生于20世紀80年代,而且都屬于硬件描述語言(HDL),但是二者的語法特性卻不一樣。Icarus Verilog 還有一個小功能就是支持把使用Verilog語言編寫的.v文件轉換為VHDL語言的.vhd文件。 ` `如把led_demo.v文件轉換為VHDL文件led_demo.vhd,使用命令`iverilog -tvhdl -o led_demo.vhd led_demo.v`。 ### VHDL文件編譯和仿真 ` `如果你還和編譯Verilog一樣,使用`iverilog led_dmeo.v`來編譯VHDL文件的話,那么會提示有語法錯誤,這是正常的,因為Verilog和VHDL是不同的語法規則,不能使用Verilog的標準來檢查VHDL文件的語法。需要添加`-g2012`參數來對VHDL文件進行編譯,如`iverilog -g2012 led_demo.vhd`,和Verilog一樣,同樣也支持Testbech文件的編譯和仿真,當然需要編寫對應的VHDL Testbench文件。 ## 搭建工程 ` `開始搭建工程,首先新建一個文件夾,并在VS Code中打開該文件夾。 * step1:建立verilog模塊文件“counter.v” ``` `timescale 1ns/1ps module counter( input clk, input rst_n, output reg [4:0] ocnt ); always@(posedge clk or negedge rst_n) if (!rst_n) begin ocnt <= 5'd0; end else ocnt <= ocnt + 5'd1; endmodule ``` * step2:建立testbech文件"top_counter.v" ``` //`include "counter.v" `timescale 1ns/1ps module tp_counter; reg clk; reg rst_n; wire [4:0]od; counter counter ( .rst_n (rst_n), .clk (clk), .ocnt(od) ); localparam CLK_PERIOD = 2; always #(CLK_PERIOD/2) clk=~clk; initial begin $dumpfile("tb.lxt"); //生成lxt的文件名稱 $dumpvars(0, counter); //tb中實例化的仿真目標實例名稱 end initial begin #1 rst_n<=1'bx;clk<=1'bx; #(CLK_PERIOD*3) rst_n<=1; #(CLK_PERIOD*3) rst_n<=0;clk<=0; repeat(5) @(posedge clk); rst_n<=1; repeat(64) @(posedge clk); $dumpflush; $stop; end endmodule ``` ` `注意testbench文件中有幾行iverilog編譯器專用的語句,如果不加的話后面不能生成lxt文件。 ``` initial begin $dumpfile("tb.lxt"); //生成lxt的文件名稱 $dumpvars(0, counter); //tb中實例化的仿真目標實例名稱 end ``` * step3:編寫makefile文件 ` `采用makefile的方式,可以在我么第一次搭建好工程之后,之后進行綜合的時候方便一些。我們可以使用`make`命令就能進行綜合仿真,一步到位。 ` `該工程的makefile文件如下: ``` tb: tp_counter.v counter.v iverilog -o tb tp_counter.v counter.v vvp -n tb -lxt2 clean: rm -rf tb tb.lxt2 ``` * step4:編寫運行腳本“run.sh”,方便直接查看波形 ``` #!/bin/bash make gtkwave tb.lxt ``` ` `為腳本添加運行權限 ``` chmod +x tb.lxt ``` * step5:開始仿真 ` `上述文件都準備好后,我們可以使用`make`命令來綜合工程并生成波形文件,若出現錯誤,在終端將會有相應的提示。 ` `沒有錯誤后,在終端輸入`./run.sh`將會再次進行綜合一次,并在gtkwave中打開波形文件。然后就可以使用上面查看波形的方法查看信號。 ## $dumpfile() $ dumpvars()的用法 ` `$dumpfile和$dumpvar是verilog語言中的兩個系統任務,可以調用這兩個系統任務來創建和將指定信息導入VCD文件. (什么是VCD文件? 答:VCD文件是在對設計進行的仿真過程中,記錄各種信號取值變化情況的信息記錄文件。EDA工具通過讀取VCD格式的文件,顯示圖形化的仿真波形,所以,可以把VCD文件簡單地視為波形記錄文件.)下面分別描述它們的用法并舉例說明之。 ` `$dumpfile系統任務:為所要創建的VCD文件指定文件名。 ` `舉例("//"符號后的內容為注釋文字): ``` initial $dumpfile ("myfile.dump"); //指定VCD文件的名字為myfile.dump,仿真信息將記錄到此文件 ``` ` `$dumpvar系統任務:指定需要記錄到VCD文件中的信號,可以指定某一模塊層次上的所有信號,也可以單獨指定某一個信號。 ` `典型語法為$dumpvar(level, module\_name); 參數level為一個整數,用于指定層次數,參數module則指定要記錄的模塊。整句的意思就是,對于指定的模塊,包括其下各個層次(層次數由level指定)的信號,都需要記錄到VCD文件中去。 ```verilog 舉例: initial $dumpvar (0, top); //指定層次數為0,則top模塊及其下面各層次的所有信號將被記錄 initial $dumpvar (1, top); //記錄模塊實例top以下一層的信號 //層次數為1,即記錄top模塊這一層次的信號 //對于top模塊中調用的更深層次的模塊實例,則不記錄其信號變化 initial $dumpvar (2, top); //記錄模塊實例top以下兩層的信號 //即top模塊及其下一層的信號將被記錄 ``` ` `假設模塊top中包含有子模塊module1,而我們希望記錄top.module1模塊以下兩層的信號,則語法舉例如下: ``` initial $dumpvar (2, top.module1); //模塊實例top.module1及其下一層的信號將被記錄 ``` ` `假設模塊top包含信號signal1和signal2(注意是變量而不是子模塊), 如我們希望只記錄這兩個信號,則語法舉例如下: ``` initial $dumpvar (0, top.signal1, top.signal2); //雖然指定了層次數,但層次數是不影響單獨指定的信號的 //即指定層次數和單獨指定的信號無關 ``` ` `我們甚至可以在同一個$dumpvar的調用中,同時指定某些層次上的所有信號和某個單獨的信號,假設模塊top包含信號signal1,同時包含有子模塊module1,如果我們不但希望記錄signal1這個獨立的信號,而且還希望記錄子模塊module1以下三層的所有信號,則語法舉例如下: ``` initial $dumpvar (3, top.signal1, top.module1); //指定層次數和單獨指定的信號無關 //所以層次數3只作用于模塊top.module1, 而與信號 top.signal1無關 ``` ` `上面這個例子和下面的語句是等效的: ``` initial begin $dumpvar (0, top.signal1); $dumpvar (3, top.module1); end $dumpvar的特別用法(不帶任何參數): initial $dumpvar; //無參數,表示設計中的所有信號都將被記錄 ``` > 最后,我們將$dumpfile和$dumpvar這兩個系統任務的使用方法在下面的例子中綜合說明,假設我們有一個設計實例,名為i\_design,此設計中包含模塊module1,模塊module1下面還有很多層次,我們希望對這個設計進行仿真,并將仿真過程中模塊module1及其以下所有層次中所有信號的變化情況,記錄存儲到名為mydesign.dump的VCD文件中去,則例示如下: initial begin ` `$dumpfile ("mydesign.dump"); //指定VCD文件名為mydesign.dump ` `$dumpvar (0, i_design.module1); //記錄i_design.module1模塊及其下面層次中所有模塊的所有信號 end 最后提供一個iverilog搭建好的模板:https://gitee.com/yuan_hp/iverilog_template.git
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看