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