繼續整理完操作符內容
關鍵詞
Verilog語言事先定義的一些確認符,都是小寫字母定義,在使用關鍵詞時要注意,另外注意定義變量時不要與關鍵詞重復。
常見的關鍵詞有:initial always begin end.....
賦值語句
verilog中的常見賦值方式有2種分別是非阻塞賦值和阻塞賦值。
非阻塞賦值
該賦值方法的特點是:語句塊中上一個語句賦值的變量在下面的語句中的值不會馬上變化,而是在語句塊結束后才變化。
非阻塞賦值沒有運行順序,屬於並行處理。
用<=表示
阻塞式賦值
在賦值結束后,語句塊才結束。
賦值語句結束后立刻改變變量的值。
用=表示
塊語句
將多條語句組合在一起的結構,一般有2種表示形式。
1.Begin end語句
順序塊
進入后按順序運行塊內語句
每條語句的延遲是按照前一條的仿真時間決定
運行到最后才離開塊
2.Fork join語句
並行塊
並行運行內部所有語句
每個語句的延遲是從進入塊開始算的
延遲語句可以給賦值語句提供時序
在運行完最后一句或遇到disable結束
塊名
可以在begin或fork后面給塊命名
可以在塊內定義局部變量
允許塊被其他語句調用
Verilog里的所有變量都是靜態的,只有一個存儲地址
當把一個塊嵌入另一個塊中需要注意起始和結束時間,只有塊運行結束后面的語句才運行
條件語句
If有3種使用的形式分別是
1單獨使用if
2if else一起使用
3多個條件的if else語句
if(a>b) out=in; #1 if (a>b) out1=in1; else out2=in2; #2 if () else if() else
#3
條件語句必須在過程塊中使用,過程塊指always和initial引導的語句,且是begin end塊
注意:
0,x,z都作為假進行處理
只有1是真
If else可以有begin end作為復合塊
允許簡寫
If(a)等於 if(a==1)
If (!a) 等於 if (a!=1)
If可以進行多層嵌套,注意if else的對應即可
可以用begin end塊語句確定if else對應關系
Case語句
多分支選擇語句
Case<分支項>endcase
Casex<分支項>endcase
Casez<分支項>endcase
分支項的一般格式
分支表達式:語句;
默認項: 語句;
Case括號內的表達式稱為控制表達式,分支表達式通常為常數
當控制表達式與某個分支表達式相等,則執行對應語句,當所有的分支都不匹配則執行默認語句
每個分支必須不相同
執行完分支后則跳出case語句
分支表達式的值必須明確才能比較
Case語句所有表達式的位寬必須一致
Case,casez,casex真值
Case等同為與
|
0 |
1 |
x |
z |
0 |
1 |
|
|
|
1 |
|
1 |
|
|
x |
|
|
1 |
|
z |
|
|
|
1 |
Casez處理不考慮高阻值的情況
|
0 |
1 |
x |
z |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
1 |
x |
0 |
0 |
1 |
1 |
z |
1 |
1 |
1 |
1 |
Casex處理不考慮高阻值和不定值的情況
|
0 |
1 |
x |
z |
0 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
x |
1 |
1 |
1 |
1 |
z |
1 |
1 |
1 |
1 |
相比ifelse語句,case可以對於存在不定值和高阻態的分支進行處理
如果使用if盡量用else
如果使用case盡量用default
這樣可以避免產生鎖存器
循環語句
Forever 循環語句用於initial塊中,常用於產生時鍾信號
Repeat(表達式)語句,表達式通常為常數
While(表達式)語句
For(循環變量;循環結束條件;循環變量增值)
並行塊注意:
若兩條語句在同一時刻對一個變量產生影響,可能出現競爭風險,這樣的語句要避免出現。
塊命名
module top initial begin:block1 integer i1; end initial begin:block2 reg r1; end
塊其中的變量可以用
Top.block1.i1來引用
塊禁用
Disable語句可以終止塊的運行,類似break
生成塊
生成語句可以動態生成verilog代碼,該聲明方便參數化模塊的生成
對矢量的多個位進行重復操作,多個模塊的實例重復操作,根據參數定義確定程序是否包含某段代碼等,可以提高編寫效率
Generate
Endgenerate
生成的實例范圍有:模塊,用戶定義原語,門級原語,連續賦值語句,initial和always
允許在生成范圍內聲明的類型:net,reg,integer,real,time,realtime,event
生成的數據類型具有唯一標識符名,可以逐層引用
生成的任務和函數同樣具有唯一的標識符名
不能出現在生成范圍的模塊聲明有:參數,局部參數,輸入輸出聲明,指定塊。
有3中生成塊方法:
1循環生成
2條件生產
3Case生成
循環生成
允許多次引用的實例:
1變量聲明
2模塊
3用戶定義原語,門級原語
4連續賦值
5Initial always塊
下面是2個N位總線變量進行按位亦或,使用生成塊進行編程
module bit_xor(out,i0,i1); parameter N=32; output [N-1:0] out; input [N-1,:0] i0,i1; genvar j; generate for (j=0;j<N;j=j+1) begin:xor_loop xor g1(out([j],i0[j],i1[j]); end endgenerate
genvar生成變量
在仿真時,生成塊的代碼會被展開,生成變量的值只能由循環生成語句賦值
Xor_loop是賦予循環生成語句的名字,循環語句中的各個亦或門的相對層次為
Xor_loop[0].g1, Xor_loop[1].g1…. Xor_loop[31].g1
只要能想象出展開后的形式,就能寫出生成語句
條件生成語句
與循環生成語句的差別是,不能用生成變量
使用方法和循環生成類似
在生成語句的范圍內
用條件語句調用不同的模塊等
case生成語句
和條件語句類似