verilog知識點(二)
五、賦值語句和塊語句
5.1 賦值語句
在Verilog HDL中,訊號有兩種賦值方式:非阻塞賦值和阻塞賦值;
(1)非阻塞賦值(b<=a)
在語句塊中,非阻塞賦值語句所賦的變數值不能立即就為下面的語句所用;
塊結束後才能完成這次賦值操作,而所賦的變數值時上一次賦值得到的;
在編寫可綜合的時序邏輯模組時,這是最常用的賦值方法;
(2)阻塞賦值(b=a)
賦值語句執行完後,塊才結束;
b的值在賦值語句執行完後立即就改變的;
在時序邏輯中使用時,可能會產生意想不到的結果。
在Verilog中,always程式塊中的reg型訊號都採用非阻塞賦值方式,always塊內的下一條語句執行後,b不等於a,而是保持原來的值,always塊結束後才進行賦值。
5.2 塊語句
在Verilog HDL中,塊語句有兩種:
(1)begin_end 通常用來標示順序執行的語句,用它來標示的塊稱為順序塊。
順序塊有以下特點:
塊內的語句按順序執行,即只有上面一條語句執行完後下面的語句才能執行;
每條語句的延遲時間是相對前一條語句的模擬時間而言的;
直到最後一條語句執行完,程式流程控制才跳出該語句塊。
(2)fork_join 通常用來標示並行執行的語句,用它來標示的塊稱為並行塊。
並行塊有以下特點:
塊內語句是同時執行的,即程式流程控制一進入到該並行塊,塊內語句則開始同時並行地執行;
塊內每條語句的延遲時間是相對於程式流程控制進入到塊內的模擬時間的;
延遲時間是用來給賦值語句提供執行時序的;
當按時間時序排序在最後的語句執行完成後或一個disable語句執行時,程式流程控制跳出該程式塊。
5.3 塊名
在Verilog HDL中,每一個塊可以取一個名字,塊名加在關鍵詞begin或fork後面即可。
可以在塊內定義區域性變數,即只在塊內使用的變數;
可以允許塊被其他語句呼叫,如disable語句;
在verilog中,所有的變數都是靜態的,即所有的變數都只有一個唯一的儲存地址,因此進入或跳出並不影響儲存在變數內的值。
六、迴圈語句
在Verilog HDL中,有4種類型的迴圈語句。
(1)forever語句:連續的執行語句
常用來產生週期性的波形,用來做模擬測試訊號。它與always語句不同之處在於不能獨立寫在程式中,而必須寫在initial塊中。
(2)repeat語句:連續執行一條語句n次
(3)while語句:執行一條語句直到某個條件不滿足,如果一開始條件就不滿足(為假),則語句一次也不被執行。
(4)for語句:第一步先給控制迴圈此次數的變數賦初值,第二步判斷控制迴圈的表示式的值,如為假則跳出迴圈,如為真則執行指定的語句後跳到下一步。第三步執行一條語句來修正控制迴圈變數次數的變數的值,然後返回上一步。
七、結構說明語句
在Verilog HDL中,有4種類型的結構說明語句。
(1)initial 說明語句
(2)always 說明語句
(3)task 說明語句
(4)function 說明語句
每一個程式模組可以有多個initial和always過程塊,每一個initial和always說明語句在模擬的一開始同時立即執行。initial語句只執行一次,而always語句則不斷重複執行,直到模擬過程結束,但always語句後跟著的過程塊是否執行,則要看它的觸發條件是否滿足,如滿足則執行過程塊一次,再次滿足則執行一次,直到模擬過程結束。
task和function說明語句分別用來定義任務和函式,利用任務和函式可以把一個很大的程式模組分解成許多較小的任務和函式便於理解和除錯。