Verilog的基本語法

      模塊是設計的基本單元,在Verilog中包括行爲建模(用於綜合和仿真)和結構建模(用於綜合)

       在Verilog中,begin和end充當了C語言中大括號的角色,在這兩個關鍵詞之間是程序的內容部分;

      模塊基本結構:module   module_name(Portlist);//注意此處有分號

                           endmodule   //注意此處沒有分號

       端口聲明:input、output、inout表示端口數據流的方向;

                      端口的數據寬度:[width:0];    後面緊跟着端口名;

                       示例:

                             input [7:0] port1;

                             聲明瞭一個端口數據寬度爲8位,名爲port1的輸入端口。

     

         數據類型有網絡數據類型(表示進程間的物理連接)和寄存器數據類型(表示暫時存儲的變量,但不一定表示硬件電路中的物理寄存器),wire和tri都表示一個節點,但是tri表示三態節點,supply0表示邏輯0,supply1表示邏輯1;寄存器類型的變量只能在進程聲明、任務或者功能中賦值reg型變量,不能是邏輯門的輸出或者assign語句的輸出;wire數據類型可以是input、output和inout中的任意一種,但是,寄存器類型的端口只能是output類型;

         在Verilog中默認的數據爲32位的十進制數;數字可以爲sized和unsized兩種類型,一般來說最好要指明數字的寬度、進制,這裏的寬度是指將其轉化爲二進制數後數據的寬度,`d表示十進制,`b表示二進制,`h表示十六進制,`o表示八進制,如果爲負數,則在最前面加符負號,舉例:-8`h89表示數據寬度爲8的負的十六進制數,爲sized的類型,可以在數字中間加”_“,提高程序的可讀性;

         操作符:+、- 、*、/、&、^、|、!、&&、||、>、<、>=、<=、==、!=、>>、<<、?:、{}等;

         連續賦值語句:assign,左手側必須是ret數據類型,右手側可以是net、寄存器或者函數的調用,每當右手側的操作數發生變化時就會立即更新左手側的net型數據,在賦值號左側加上#(time)可以模型邏輯提供仿真延遲,但不會綜合成具體的硬件電路;

        進程賦值:initial模塊:用於初始化仿真的行爲聲明,監視、波形和其他進程,會被仿真器忽略,在整個仿真中只執行一次,且是順序執行;always模塊:用於行爲聲明,來描述電路的功能;每個always和initial模塊代表不同的進程,進程之間並行從仿真時間0開始,而進程內的語句順序執行,注意:always模塊和initial模塊不能嵌套;

       在進程內部有兩類賦值語句,阻塞賦值和非阻塞賦值,阻塞賦值(=)按照模塊中指定的順序執行,有先後順序之分,而非阻塞賦值(<=)是併發執行,無先後之分;在進程中儘量要避免阻塞賦值這種方式,因爲執行過程不好控制。這兩種賦值語句的左手側必須是reg寄存器類型;

       在Verilog綜合後的電路中有兩種電路類型,組合電路和時序電路,都是用always語句來說明要實現的功能,組合電路對組合邏輯中使用的所有輸入敏感,而時序邏輯電路對時鐘及控制信號敏感,要注意區分,舉例:

                always@(a or b or c)會被編譯器綜合成組合邏輯電路,

                always@(posedge clk or negedge clk)會被編譯器綜合成時序邏輯電路,always@後面的括號中的內容叫做敏感信號列表,只要敏感信號一變化就會執行後面的內容;

       行爲聲明:行爲聲明有三種,一種是用if·····else來表示,另一種用case語句來表示,這兩種表達方式有很大的區別,當使用if·····else語句時,內部的條件語句是順序評估的,有先後順序依次執行;而case語句先對執行條件進行分析評估,然後沒有優先級的執行相應的內部語句,來完成相應的功能,default關鍵詞是默認的執行狀況。這兩種語句必須放在always或者initial模塊中;因此當自己的模塊功能需要設置優先級時就用if·····else語句,否則就用case語句,執行效率最優化原則;還有一個循環聲明,用於重複運算,如:forever、while、for和repeat,這幾種語句都是用來仿真的,forever語句會無限次的執行,而repeat可以指定執行次數,例如:repeat(8),while和for語句會按照條件是否成立來選擇性的執行,注意,在C語言中for循環中的計數變量是可以改變的,而在Verilog中,其內部的計數變量是不可以改變的,一般在電路實現時不用for循環,因爲它會生成很多鎖存器,並且會將語句展開,浪費FPGA的邏輯資源;

         case語句一般被譯成複用器,而if·····else語句一般被譯成選擇器;另外還有兩種case的變形形式,casez和casex,casez語句不關心z處代表的值,而casex語句會不關心z和x處的值,但一定要注意所有的case形式內部的各條件必須是唯一的表達式,不能有歧義,確保在某種狀況下只有一個條件是正確的,且一定要加上default這種默認的狀況,否則會生成鎖存器,影響電路的功能實現;

未完待續~~~

 

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