verilog學習筆記(四)賦值語句與塊語句


繼續整理完操作符內容

關鍵詞

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生成語句

和條件語句類似


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM