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