Verilog的一些簡單語法

一、變量

    Verilog HDL有線網型和寄存器型兩種類型的變量,每種類型都有在電路中的實際意義。

    1.線網型變量:
    它相當於硬件電路中的各種物理連接,其特點是輸出的值緊跟隨輸入值進行變化。

     wire型變量最經常被用到,對於wire型變量有兩種賦值方式:(1).直接將變量連接到模塊的輸出端。(2).第二種方式是使用assign持續賦值語句進行賦值。

    例:

wire[7:0] input_data;
assign input_data[7:4]=4b'0000

    2.寄存器型變量

    寄存器表示一個抽象的數據存儲單元,可以通過賦值語句改變寄存器內存儲的值。

    寄存器只能在always和initial過程語句中被賦值,而在未被賦值之前,寄存器的缺省值爲X。

    always語句的語法結構:always @(sensitive_table)    其中,sensitive_table稱作敏感列表,其中包含always內部操作的一個或多個觸發條件。

    不同於assign語句只有一行代碼,always語句中可以包含多行代碼。

    注意:同一個reg變量不能在多個不同的always裏賦值,如果進行同時的賦值,就相當於對同一變量進行並行的操作會出現錯誤。

二、賦值方式

     賦值方式可以簡單分爲兩種:阻塞賦值(=)和非阻塞賦值(<=)。

     阻塞的賦值方式主要在順序代碼塊中實現。如果在順序代碼塊中使用阻塞賦值語句,如果這一句沒有執行完成,則最後面的語句都不會被執行;如果在順序代碼塊中使用非阻塞賦值,則執行這一語句的同時,並不會阻礙下一句代碼的執行。而且,如果後一個語句涉及到前面一個語句執行前變量的數值。非阻塞賦值是Verilog作爲硬件描述語言與普通程序語言的一個重大區別。

    事實上,阻塞在硬件電路中是無法實現的。在經過電路綜合後所用的語句都是非阻塞賦值。

    在一般的書寫習慣中,assign中使用”=“而always中寫”<=“。

三、函數與任務

    在verilog中函數與任務的作用主要是爲了減少主模塊的代碼量。

    1.函數的聲明格式:

    例:

function[15:0] circle(input[7:0] diameter);
begin
    circle=(24'd201*{16'h0,diameter}*{16'h0,diameter})/256;
end
endfunction

    函數只有一個輸出值,在()中定義的皆爲輸入變量。   

注意事項:(1).函數定義只能在模塊中完成,不能在過程塊中。

 (2).函數至少要有一個輸入端口;不能包含輸出端口和雙向端口;

 (3).在函數結構中不能使用時間控制語句(#、wait),不能使用disable中止語句。

 (4).函數的結構體中不能出現過程塊語句(always)。

 (5).函數可以調用函數,不能調用任務。

 (6).函數調用可以在任務塊或assign中出現。

 (7).函數調用語句不能單獨出現,必須爲賦值語句的右端操作數。

    !!在Verilog中函數的變量地址爲競態分佈,如果想要進行多次調用必須在function關鍵字後加automatic關鍵字使得任務成爲可重複使用。

   例:

function automatic[15:0] circle(input[7:0] diameter);
begin
    circle=(24'd201*{16'h0,diameter}*{16'h0,diameter})/256;
end
endfunction

  2.任務

    任務的功能要比函數強大

   任務可以有多個輸入信號與多個輸出信號,甚至可以沒有輸入和輸出。

   

task task_name(ports_list);
begin
     ....
end

   不同於函數的調用,任務的調用是在代碼裏單獨一行進行書寫。

  注意:(1).任務的輸入輸出端口和雙向端口的數量不受限制,甚至可以沒有輸入輸出以及雙向端口;

  (2).在任務定義的描述語句中,可以使用出現不可綜合操作符合語句(使用最爲頻繁的就是延遲控制語句),但這樣會造成該任務不可綜合;

  (3).在任務中既可以調用其他任務或函數,也可以調用本身;

  (4).在任務定義結構內不能出現initial和always過程塊;

  (5).可以在任務中中斷正在執行的任務,但其是不可綜合的;當任務被中斷後,程序流程將返回到調用任務的地方繼續向下執行;

  (6).任務調用語句只能出現在過程塊之中;

  (7).任務調用語句和一條普通的行爲描述語句的處理方法一致;

  (8).當被調用輸入輸出或雙向端口時,任務調用語句必須包含端口名列表,且信號端口順序和類型必須和任務定義結構中的順序和類型一致;需要說明的是,任務的輸出端口必須和寄存器類型的數據變量對應;

  (9).綜合任務只能實現組合邏輯,也就是說,調用可綜合任務的時間爲“0”;而在面向仿真的任務中可以帶有時序控制,如時延,因此面向仿真的任務的調用時間不爲“0”。

 3.函數與任務的共同點與區別(借用參考書的定義)

  

四、生成塊

https://blog.csdn.net/daijingxin/article/details/102730596

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