馮海濤,王 爽,周 剛
(中國電子科技集團(tuán)公司第四十七研究所,沈陽 110032)
每個(gè)代碼編寫者都有自己的編寫習(xí)慣,而且都喜歡按照自己的習(xí)慣去編寫代碼。代碼風(fēng)格對(duì)綜合后的硬件結(jié)構(gòu)起至關(guān)重要的作用,相同功能不同風(fēng)格的代碼在綜合后可能會(huì)產(chǎn)生不同的結(jié)構(gòu),具有不同的timing 和area。這就是RTL 設(shè)計(jì)工程師重視代碼風(fēng)格的原因所在。在這里主要講述一下組合電路和時(shí)序電路中比較常用并需要特別注意的語句。
(1)if 語句的比較條件不可以用“x”,仿真時(shí)“x”被看做unkown 而產(chǎn)生錯(cuò)誤的仿真結(jié)果;綜合時(shí)“x”被看做false,產(chǎn)生與仿真相同的錯(cuò)誤。例如:
if(In_A[7:0]==8'b00xx11xx)D_Out=1'b1;
else D_Out=1'b0;
解決方法:
If((In _ A[7:6]==2'b00)&& (In _A[3:2]==2'b11))D_Out=1'b1;else D_Out=1'b0;
(2)if 語句優(yōu)先級(jí)由下向上,越靠近下面的輸入在綜合時(shí)越靠近輸出,如下例和圖1 所示。
圖1 if 語句優(yōu)先級(jí)由下向上
(3)if…else…if 語句優(yōu)先級(jí)由上向下,越靠近上面的輸入在綜合時(shí)越靠近輸出,如下例和圖2 所示。
圖2 if…else…if 語句優(yōu)先級(jí)由上向下
無優(yōu)先級(jí),case的條件必須列全(full case),如果不能列全就寫default 值,否則同樣會(huì)產(chǎn)生latch。
for 循環(huán)語句可能被中止,而綜合不會(huì),綜合會(huì)把for 循環(huán)全部條件下的電路翻譯出來。同時(shí)for 循環(huán)語句不能被時(shí)鐘沿觸發(fā),而RTL 設(shè)計(jì)中多數(shù)要時(shí)鐘沿觸發(fā),這樣的設(shè)計(jì)多用有限狀態(tài)機(jī)來完成。故不建議在RTL 設(shè)計(jì)中使用for 循環(huán),但是在testbench 中可以使用。For 循環(huán)語句示例如下:
由于每次循環(huán)k 都被看做一個(gè)常數(shù),所以不會(huì)綜合出減法器。綜合時(shí)循環(huán)鏈會(huì)被打開。上面的循環(huán)相當(dāng)于下面的程序:
由時(shí)鐘沿觸發(fā)的電路分為時(shí)鐘上升沿觸發(fā)(posedge CLK)和時(shí)鐘下降沿觸發(fā)(negedge CLK);同時(shí)在時(shí)鐘沿觸發(fā)的電路中,賦值語句應(yīng)該使用非阻塞型。如下例所示:
功耗的產(chǎn)生大部分在時(shí)鐘狀態(tài)轉(zhuǎn)換時(shí),通過門控時(shí)鐘關(guān)閉空閑電路的時(shí)鐘是減小功耗的有效方法。減小flip-flop時(shí)鐘端的transitions,能夠全面減小電路的功耗。如下例和圖3 所示。
圖3 門控時(shí)鐘
RTL 設(shè)計(jì)中的Verilog 代碼風(fēng)格更偏重的是,某一個(gè)電路,用那一種形式的語言描述,才能將電路描述得更準(zhǔn)確,綜合以后產(chǎn)生的電路更合理。以上列出的代碼編寫實(shí)例無法覆蓋代碼編寫的方方面面,還有很多細(xì)節(jié)問題,需要在實(shí)際編寫過程中加以考慮。并且有些規(guī)定也不是絕對(duì)的,需要靈活處理。但其實(shí)代碼風(fēng)格還包括遵循代碼編寫規(guī)范書寫的代碼,以及容易閱讀、理解、維護(hù)、修改、跟蹤調(diào)試、整理文檔等方面??偟姆较蚴?,努力寫整潔、可讀性好并且在綜合后電路也很合理的代碼。
[1]袁俊泉,孫敏琪,曹瑞,編著.Verilog HDL 數(shù)字系統(tǒng)設(shè)計(jì)及其應(yīng)用[M].西安:西安電子科技大學(xué)出版社,2002.11.
[2]夏宇聞,編著.Verilog 數(shù)字系統(tǒng)設(shè)計(jì)教程[M].北京:北京航空航天大學(xué)出版社,2003.7.