【verilog】五、行爲級建模

Verilog支持設計者從算法的角度,即從電路的外部行爲對其進行描述。

-結構化過程語句:initial語句和always語句。Verilog中的各個執行流程(進程)併發執行,每個initial語句和always語句代表一個獨立的執行過程,每個執行過程從仿真時間零開始執行,兩者不能嵌套使用。

-initial語句:從仿真0開始順序執行,整個仿真過程中只執行一次。若含多個initial塊則其併發執行,且每個塊各自獨立。塊內多條語句需用begin和end來組合。

可以在變量聲明同時進行初始化:

 

-always語句:從仿真0開始順序執行,在執行完最後一條語句,再次開始執行第一條語句,循環直到仿真結束。兩個或者更多的always塊是同時(並行)執行的,而內部的塊是順序執行的。

 

-時鐘發生器:

 

-過程賦值語句:更新對象是寄存器、整數、實數、時間變量。在被賦值之後值保持不變,直到被其他過程賦值語句賦予新值。

左值可以是reg、整數、實數、時間寄存器變量、存儲器單元;或上述類型的位選、域選、拼接。

-阻塞賦值語句:使用“=”作爲賦值符。串行塊語句中的阻塞賦值語句按順序執行,不會阻塞其後並行塊中語句的執行。如果在一個begin-end塊中使用阻塞賦值語句,那麼這個語句塊表現得是串行行爲。

 

-非阻塞賦值語句:使用“<=”作爲賦值符。允許賦值調度,不會阻塞位於同一個順序塊中其後語句的執行。賦值與完成順序無關。

非阻塞賦值語句可以避免競爭:

1、使用阻塞賦值會導致兩者具有相同值,具體值與仿真器有關,使用阻塞賦值來交換兩數則必須使用中間變量;

2、使用非阻塞賦值可以達到交換兩者值的目的,賦值時仿真器讀取每個操作數的值並計算表達式的值,保存在臨時變量中,賦值時仿真器將這些值賦予左側變量,讀與寫是分開的,這也將會帶來仿真速度下降和內存使用量增加等問題。

 

-時序控制:指定過程賦值發生的時刻,進而控制仿真時間如何向前推進。

-基於延遲的時序控制:指定語句開始執行到執行完成之間的時間間隔。延遲值可以是數字、標識符、表達式。延遲前要有關鍵字#

-常規延遲控制:位於賦值語句左邊。推遲整個賦值語句的執行。

#10 y = 1;

-內嵌賦值延遲控制:位於賦值符右邊。相當於將值存在臨時變量中,然後使用常規延遲控制將這個值賦給左側變量。

 y = #5 x + z;

-零延遲控制:可以保證帶零延遲控制的語句將在執行時刻相同的多條語句中最後執行,避免競爭。但如果存在多條帶零延遲控制的語句,他們之間的執行順序與不一定。

 

-基於事件的時序控制:事件是指某一個寄存器或線網變量的值發生變化。事件可以用來觸發聲明語句或塊語句的執行。

-常規事件控制:事件控制使用關鍵字@,poseedge表示正向跳變,negedge表示負向跳變。

 

-命名事件控制:聲明event類型變量,觸發該變量並識別事件是否發生,不能保存任何值,事件觸發用->表示,判斷時間是否發生用@來識別。

 

-OR事件控制:由關鍵詞“or”連接的多個事件名或者信號名組成的列表稱爲敏感列表(or也可用‘,逗號’替代)。

當輸入變量很多,可以使用@(*)來表示對其後語句塊中所有輸入變量的變化都是敏感的。

 

-電平敏感時序控制:使用關鍵字waie來表示等待電平敏感的條件爲真。

 

-條件語句:

 

-多路分支語句:

四選一多路選擇器:

 

-casex與casez:

casex將條件表達式或候選表達式中的x作爲無關值。

casez將條件表達式或候選表達式中的z作爲無關值,所有值爲z的位也可以用"?"來代表。

 

-循環語句:

-while循環:關鍵字while。

-for循環:關鍵字for。

1、初始條件;

2、檢查終止條件是否爲真;

3、改變控制變量的過程賦值語句;

-repeat循環:關鍵字repeat。執行固定次數的循環,循環次數必須是一個常量、變量、信號。變量及信號作爲重複次數,則重複次數爲循環開始時變量或信號的值。

-forever循環:關鍵字forever。表示永久循環,等價於while(1)。中途退出使用disable語句。

 

-順序塊與並行塊:

-順序塊:關鍵字begin-end組成。

1、語句一條一條按順序執行,前面語句執行結束後在執行下一條語句(含有內嵌延遲控制的非阻塞賦值語句除外)。

2、若語句包含延遲或事件控制,延遲總是基於上一條語句執行完成的仿真時間。

 

-並行塊:關鍵字fork-join組成。

1、並行塊內語句併發執行。

2、語句執行順序是由各自語句延遲或事件控制決定的。

3、語句中的延遲或事件控制是相對於塊語句開始執行的時刻而言的。

 

-塊語句特點:

-嵌套塊:塊可以嵌套使用,順序塊可以和並行塊混合使用。

 

-命名塊:塊可以命名。

1、命名塊中可以聲明局部變量。

2、命名塊是設計層次的一部分,命名塊中聲明的變量可以通過層次名引用進行訪問。

3、命名塊可以被禁用。

 

-命名塊禁用:關鍵字disable。類似於C語言中的break。用於從循環中退出、處理錯誤條件、根據控制信號來控制某些代碼段是否被執行。

 

-生成塊:關鍵字generate-endgenerate。

1、生成實例可以是:模塊、用戶自定義原語、門級原語、連續賦值語句、initial和always塊。

2、生成的聲明和生成的實例能夠在設計中被有條件地調用(實例引用)。在設計中可以多次調用(實例引用)生成的實例和生成的變量聲明。生成的實例可以用層次命名規則引用。

3、允許在生成範圍內聲明的數據類型包含:net、reg、integer、real、time、realtime、event。任務和函數的聲明也允許出現在生成範圍中,但是不能出現在循環生成當中,可悲層次引用。

4、不允許出現在生成範圍中的模塊項聲明包括:參數、局部參數、輸入、輸出、輸入/輸出聲明、指定塊。

5、生成方式:

-循環生成語句:

 

-條件生成語句:類似於if-else-if的生成構造。

 

-case生成語句:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章