跳轉語句允許程序代碼跳過一個或多個編程語句,SystemVerilog的jump語句是continue、break和disable。
continue 和 break跳轉語句
continue和break-跳轉語句在循環中用于控制循環中語句的執行。這些跳轉語句只能用于for循環、while循環和foreach循環。它們不能在循環之外使用。
continue語句跳轉到循環的結尾,并計算循環的結束表達式(end expression),以確定循環是否應繼續進行另一次迭代。
下面的代碼段使用for循環遍歷一個小查找表的地址,該表被建模為16-bit的一維數組。使用continue語句跳過表中值為0的位置。對于非零位置,調用函數對該值進行某種操作(函數未顯示)。
break語句立即終止循環的執行。循環退出,任何循環控制語句(如for循環步驟分配)都不會執行。
示例6-10說明了如何使用continue和break來查找在一個位范圍內設置為1的第一位。圖6-10顯示了該示例的綜合結果。
示例6-10:使用continue和break控制循環執行
//`begin_keywords"1800-2012"http://useSystemVerilog-2012keywords modulefind_bit_in_range #(parameterN=4)//bussize (inputlogic[N-1:0]data, inputlogic[$clog2(N)-1:0]start_range,end_range, outputlogic[$clog2(N)-1:0]low_bit ); timeunit1ns;timeprecision1ns; always_combbegin low_bit='0; for(inti=0;i圖6-10:示例6-10的綜合結果end_range)break;//exitloop if(data[i])begin low_bit=i; break;//exitloop end end//endoftheloop //...//processdatabasedonlowestbitset end endmodule:find_bit_in_range //`end_keywords
disable跳轉語句
SystemVerilog 的disable語句類似于其他編程語言中的go-to語句。disable跳轉到一組命名語句的末尾或任務的末尾。disable跳轉語句的一般用法是:
在這個代碼片段中,begin-end語句組被命名為search_loop。disable語句指示仿真立即跳到名為begin-end 語句組的末尾。
最初的Verilog語言沒有continue和break-跳轉語句。相反,disable語句與通用go-to行為一樣用于跳轉到循環的末尾,但會繼續執行循環的下一個過程。
disable語句通過跳過循環的末端,過早地跳出循環。要跳過循環中的語句,繼續執行循環時,命名的begin-end語句組必須包含在循環中。要跳出循環,命名的begin-end語句組必須包含整個循環。
下面的示例顯示了與示例6-10相同的功能,除了使用disable 跳轉語句而不是continue和break語句,
最佳實踐指南6-6 |
---|
使用continue和break-跳轉語句控制循環迭代。不要使用disable跳轉語句. |
disable 跳轉語句提供與break和continue 跳轉語句相同的功能,如上所示。然而,disable 跳轉語句使代碼更難讀懂和維護,使用continue和break是一種更簡單、更直觀的編碼方式。
disable跳轉語句是一個通用的go-to語句,可以在驗證中使用。綜合編譯器通常不支持使用disable的其他方法。
No-op聲明
SystemVerilog編程語句以分號;(分號本身被視為完整的編程語句)表示沒有要執行的功能。單獨的分號執行空操作,通常被稱為無操作語句(no-op語句)。
下面的代碼片段表示存儲數據變量的寄存器(使用觸發器)。由case語句表示的多路輸入確定要存儲在數據寄存器中的值。
此代碼段中的case語句不會對mode的2’b11值進行解碼。雖然在本例中功能上是正確的,但不完整的case語句不是完美的,并且可能會在代碼驗證期間引發問題,或者其他工程師在維護或重用代碼時引入歧義(解碼模式值2’b11是不是故意的?還是模型中的疏忽(錯誤))。
在這個例子中,沒有任何東西可以說明這種或那種方式。添加關于未使用的2’b11值的注釋可能會很有幫助,但不是所有人都會用心的注釋代碼。
使用無操作語句有助于使RTL模型更加自我記錄和可讀。下面的代碼片段在功能上與前面的示例相同,但是,即使沒有注釋,很明顯,也很方便人們理解代碼。
時序邏輯中的無操作語句將被綜合編譯器忽略。沒有要實現的功能,因此寄存器將保留其初始值。然而,綜合編譯器不能忽略組合邏輯中的no-op語句。
當沒有為變量賦值時,它將保留以前的值。綜合時可能會添加一個鎖存器,以便邏輯可以保存以前的值。
最佳實踐指南6-7 |
---|
不要將no-op語句用于RTL建模, |
盡管綜合編譯器支持no-op,但它在RTL功能中沒有任何用途,并且可能導致組合邏輯中出現意外的鎖存器。為了完整性,我們討論了no-op語句,但不建議在RTL代碼中使用。
審核編輯:劉清
-
鎖存器
+關注
關注
8文章
906瀏覽量
41496 -
編程語言
+關注
關注
10文章
1942瀏覽量
34707 -
Verilog語言
+關注
關注
0文章
113瀏覽量
8224
原文標題:SystemVerilog-跳轉語句
文章出處:【微信號:Open_FPGA,微信公眾號:OpenFPGA】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論