不可綜合語句經常用在測試文件中,未注明的語句均是可綜合的
賦值語句
1.連續賦值語句——assign語句,用于對wire型變量賦值,是描述組合邏輯最常用的方法之一。
例:assign c=a&b; // a,b,c 均為wire型變量
2.過程賦值語句——用于對reg型變量賦值,有兩種方法:
非阻塞賦值方法:符號<=
阻塞賦值方法:符號為=
阻塞與非阻塞賦值的區別:
1.非阻塞賦值方式:
always @(posedge clk) begin b <= a; c <= b; end
非阻塞賦值在塊結束時才完成賦值操作(c的值比b的值落后一個時鐘周期)
2.阻塞賦值方式
always @(posedge clk) begin b = a; c = b; end
阻塞賦值語句在該語句結束時就完成賦值操作(在塊語句中,如果有多條阻塞賦值語句,在前面的賦值語句沒有完成之前,后面的語句就不能被執行,就像被阻塞一樣,因此稱為阻塞賦值方式。這里的c和b的值一樣。)
非阻塞賦值于阻塞賦值方式的主要區別:
非阻塞賦值:b的值被賦成新值a的操作,并不是立刻完成,而是在塊結束時才完成;
塊內的多條語句在塊結束時同時賦值。
硬件有對應電路。
阻塞賦值: b的值立刻被賦成新值a;
完成該賦值語句后才能執行下一條語句;
硬件沒有對應的電路,因而綜合結果未知。
塊語句
用來將兩條或多條語句組合在一起,使其在格式上更像一條語句,以增加程序的可讀性
塊語句有兩種:
begin...end語句——標示順序執行的語句
fork...join語句——標示并行執行的語句(不可綜合)
begin...end:
塊內的語句是順序執行的
每條語句的延遲時間是相對于前一條語句的仿真時間而言的
直到最后一條語句執行完,程序流程控制才能跳出該順序塊
塊內語句可以是參數聲明,reg變量聲明,integer變量聲明,real變量聲明語句
#可以用在語句塊中表示延遲,(在模塊調用過程中使用#表示參數的傳遞)
fork...join:
塊內的語句是并行執行的
每條語句的延遲時間是相對于開始仿真時間而言的
如何跳出該順序塊由(fork...join,fork...join_any,fork...join_none)決定
塊內語句可以是參數聲明,reg變量聲明,integer變量聲明,real變量聲明語句,time變量聲明語句和事件(event)說明語句。
條件語句
條件語句分為兩種:if...else語句和case語句
它們都是順序語句,應該放在“always”塊內;
if...else:
判定給出的條件是否滿足,根據判定的結果(真或假)決定執行給出的兩種操作之一。
if...else語句有3中形式:
其中,表達式為邏輯表達式或關系表達式,或一位的變量
若表達的值為0或者z,則判定的結果為假,若為1,則加過為真
語句分為單句,也可分為多句;多句一定用“begin...end”語句括起來,形成一個符合塊語句
方式1:
if (表達式) 語句1;
方式2:
if(表達式) 語句1;
else 語句2;
方式3:
if(表達式1) 語句1;
else if(表達式2) 語句2;
...
else if(表達式n) 語句n;
允許一定形式的表達式簡寫方式,如:
if(expression) 等同于if(expression ==1)
if(!expression) 等同于if(expression!=1)
if 語句可以嵌套
若if和else的數目不一樣,要使用“begin..end”語句來確定if于else的配對關系。
嵌套語句:
if(表達式1)
if(表達式2)語句1;
else 語句2;
else
if(表達式3) 語句3;
else 語句4;
module count60(qout, cout,data,load,cin,reset,clk); output[7:0] qout; output cout; input [7:0] data; input load,cin,reset,clk; reg [7:0] qout; always@(posedge clk) begin if(reset) qout = 0; //同步復位 else if(load) qout = data; //同步置數 else if (cin) /如果cin為1,執行加1計數 begin if (qout[3:0]==9) begin qout[3:0]=0; if (qout[7:4]==5) qout[7:4] = 0; else qout[7:4] =qout[7:4]+1; end else qout[3:0]=qout[3:0]+1; end end assign cout = ((qout ==8'h59)&cin)?1:0; //產生進位輸出 endmodulecase語句
當敏感表達式取不同的值時,執行不同的語句;
功能:當某個(控制)信號取不同的值時,給另一個(輸出)信號賦不同的值。常用于多條件譯碼電路(如譯碼器,數據選擇器,狀態機,微處理器)
case語句有三種不同形式:case,casez,casex
說明:
其中“敏感表達式”有稱為“控制表達式”,通常表示為控制信號的某些位。
值1—值n稱為分支表達式,用控制信號的具體狀態值表示,因此有分為常量表達式。
default項可有可無,一個case語句中只有一個default項;
值1—值n必須互不相同,否則矛盾;
值1—值n的位寬必須相等,且與控制表達式的位寬相同。
casez與casex語句:
使用條件語句的注意事項:
- 應列出所有條件分支,否則當條件不滿足時,編譯器會生成一個鎖存器保持原值;
- 這一點可用于設計時序電路,如計數器:條件滿足時加1,否則保持原值不變;
- 在組合電路設計中,應避免生成隱含的鎖存器,有效的方法是在if語句最后寫上else,在case語句最后寫上default項。
審核編輯:湯梓紅
-
IC
+關注
關注
36文章
5944瀏覽量
175492 -
電路設計
+關注
關注
6673文章
2451瀏覽量
204167 -
Verilog
+關注
關注
28文章
1351瀏覽量
110077 -
變量
+關注
關注
0文章
613瀏覽量
28360 -
符號
+關注
關注
0文章
55瀏覽量
4332
原文標題:IC學霸筆記 | Verilog賦值語句、塊語句、條件語句
文章出處:【微信號:IC修真院,微信公眾號:IC修真院】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論