一、變量
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.函數與任務的共同點與區別(借用參考書的定義)
四、生成塊