轉載請標明出處
第一章 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判斷語句(可綜合)
l unique if...else
取消判斷順序優先級
l Priority if...else
表示分支的次序時重要的,需按照原有次序進行優先級編碼