Systemverilog for design 筆記(五)


轉載請標明出處

第一章 System Verilog過程塊、任務和函數

1.1.    verilog通用目的always過程塊(procedural block)(可綜合)

always過程塊的綜合指導方針:

  • 組合邏輯

1.關鍵詞always后必須跟一個邊沿敏感的事件控制(@符號)

2.事件控制的敏感表中不能包含posedge和negedge限定詞

3.敏感表必須列出過程塊的所有輸入,所謂輸入是指在該塊讀入並且在塊外賦值的信號

4.過程塊中不能包括其他的事件控制

5.所有在過程塊中賦值的變量必須隨所有可能的輸入組合變化而更新

6.所有在此過程塊賦值的變量不能在其他任何過程塊再次賦值

  • 鎖存邏輯

1.關鍵詞always后必須跟一個邊沿敏感的事件控制(@符號)

2.事件控制的敏感表中不能包含posedge和negedge限定詞

3.敏感表必須列出過程塊的所有輸入,所謂輸入是指在該塊讀入並且在塊外賦值的信號

4.過程塊中不能包括其他的事件控制

5.*過程塊中賦值的變量至少有一個不能被某些輸入條件更新

6.所有在此過程塊賦值的變量不能在其他任何過程塊再次賦值

  • 時序邏輯

1.關鍵詞always后必須跟一個邊沿敏感的事件控制(@符號)

2.事件控制的敏感表中必須包含posedge和negedge限定詞

3.該過程塊不能包含其他的事件控制

4.所有在過程塊中賦值的變量不能在其他任何過程塊再次賦值

1.2.    system verilog特有的過程塊(可綜合)

通過always_comb,always_latch,always_ff過程塊相對於always可以更明確的反映設計意圖

1.2.1.      組合邏輯過程塊(always_comb)

Eg. always_comb

If(!mode)          //mode在敏感list中

Y=a+b;  //a,b在敏感list中

Else

Y=a-b;

可以看出,always_comb塊的后面不需要指明敏感列表。因為敏感表默認為所有被過程塊讀取(讀取:出現在表達式右邊或者作為條件語句的條件表達式中)並在塊外賦值的信號。

 

Always_comb過程塊在所有initial和always過程塊啟動時,無論敏感變量是否發生變化,均會在仿真的0時刻自動觸發

 

Always_comb與always@*的區別:

always@*對過程塊調用的函數中讀取的信號不能推斷為敏感變量

而always_comb的敏感列表包含函數讀取的信號

1.2.2.      鎖存邏輯過程塊(always_latch)

Always_latch過程塊表示過程塊描述的是基於鎖存器的邏輯

Always_latch.的推斷敏感list的規則與Always_comb相同,且在仿真0時刻也會執行一次

1.2.3.      時序邏輯過程塊(always_ff)

Always_ff的敏感列表必須明確列出,一般為posedge或negedge

1.3.    SV對任務和函數的改進

l  SV中task和function中若有多條語句,可以不用像verilog一樣使用begin...end打包

l  verilog中函數通過賦值與函數名相同的變量來提供返回值。SV可以使用return關鍵詞

l  SV可以通過return提前結束任務或函數

l  SV提供了顯示聲明void空函數的功能

l  SV中函數的形式參數增加了output和inout,可以傳送調用函數產生的變化

 

有output或inout參數的函數不能在以下情況中調用:

1.事件表達式。 2.使用過程持續賦值的表達式。  3.不在過程語句中的表達式

l  在可綜合模塊中可用空函數代替任務,除了不能包含事件控制,啥都能干

l  SV使用參數名傳遞參數值eg.result <= devide(.denomibator(b),.numerator(a)) //顯示傳遞

l  verilog中函數必須至少有一個輸入參數,SV中可以沒有形式參數(input/output/inout)

l  SV中缺省方向的形式參數默認為input,且類型為logic,且可定義形參的缺省值

l  形參可以是數組、結構體或聯合體

l  自動任務和函數可以通過使用ref取代input/output來達到引用參數的目的(共用存儲區)

使用ref的好處是,任務中該參數對變化敏感(因為不是只是復制單時刻的值)且可以立即傳播變化

有output/inout/ref參數的函數不能被以下情況中調用:

1.事件表達式。 2.使用過程持續賦值的表達式。  3.不在過程語句中的表達式

4.持續賦值中的表達式

l  當使用const ref聲明形參時,任務和函數只能對參數進行只讀操作

l  SV中使用endtask endfunction指明任務或函數結尾名稱

 

第二章 過程語句(procedural statements)

2.1.    新操作符

l  遞增/遞減操作符(++/—) (屬於阻塞賦值) (作為獨立語句時可綜合)

后加:j=i++;//j=i,然后i+1. 先加:j=++i;//i+1然后賦給j

l  賦值操作符(+=,-=,*=,/=,%=,&=,|=,^=,<<=,>>=,<<<=,>>>=)

(屬於阻塞賦值,獨立語句可綜合,都是=左邊作為主操作數,最后賦值給=左邊)

l  有無關通配符的相等操作符(==,===,==?)       (右邊操作數為常數時可綜合)

(==?中右邊操作數中x/z看作通配符,與任意數值匹配)

l  設置成員操作符(inside)eg.if(a inside {3’b001,3’b010}); //即if((a==3’b001)||(a==3’b010));

2.2.    操作數改進

l  增加類型強制轉換符(<type>’(expression))

l  增加尺寸強制轉換符(<size>’(expression))

l  增加符號強制轉換符(<signed>’(expression).   <unsigned>’(expression))

2.3.    改進的for循環(可綜合)

l  for循環內部聲明(循環內定義的變量)的變量是自動變量

(每個循環的內部循環變量互不影響)

l  如果要在循環外飲用一個變量,該變量需在循環外聲明。

l  循環內的局部變量不能層次化引用,但是外部聲明的變量可以層次化引用

2.4.    底部檢測的do...while循環(靜態確定循環次數時可綜合)

l  while語句在循環開始檢測循環控制;do...while在在循環結尾檢測,保證至少執行一次

l  語法:     do<語句或語句塊>

While(<條件>);

2.5.    foreach數組循環結構

見4.4

2.6.    新的跳轉語句——break、continue、return(可綜合)

l  verilog:task中使用disable語句使語句序列執行流跳轉或作為返回語句

l  SV中跳轉語句(break、continue、return)只對當前執行流有效

 

  • continue語句

跳轉到循環的結尾然后重新回到開頭執行循環控制

  • break語句

中止循環的執行(整個循環結束,徹底,完全,結束)

  • return語句

從非空函數返回或者從空函數或任務重跳出。

2.7.    改進的塊名

Begin:<block_name>

...

End:<block_name>

2.8.    語句標號(statement label)

<label>:<statement >可用來識別單條語句

begin:block1          //named block                                             block2:begin//帶label的塊

...                                                                                                                      ...

End:block1.                                                                                                  end

一個語句塊不能同時有label和block name

2.9.    改進的case語句

l  verilog中case語句默認帶有優先級(由前至后)

l  SV為case,casez,casex的判定提供了修飾符unique和priority,均需指明所有條件

n  unique case               等效於同時使用verilog中的full_case及parallel_case附注

該語句指定:必須有且只有一個條件選項與條件表達式匹配

unique case(<case_expression>)

...//條件選項

endcase

n  priority case              等效於verilog中的full_case附注

該語句指定:

至少有一個條件選項與條件表達式相符

若存在多個條件選項的值與條件表達式匹配,則必須執行第一個匹配分支

priority case(<case_expression>)

...//條件選項

endcase

2.10.        改進的if...else判斷語句(可綜合)

unique if...else

取消判斷順序優先級

Priority if...else

表示分支的次序時重要的,需按照原有次序進行優先級編碼


免責聲明!

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



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