在我看過的很多代碼中,發現許多人在對變量賦初始值(或常量值)0時的做法各種各樣,現在來分析下這幾種情況對設計的影響。以對64位變量a賦初始值0為例:
(1)第一種:a <= 64’d0; 對于這種指定變量具體位寬的代碼風格,我是直接否定的,因為它不利于參數化設計;
(2)第二種:a <= 0;(或a <= (0);)而對于這種直接賦一個0的做法呢,一般情況下對設計是沒有影響的,而且還能進行參數化設計,但是在另外一種情況下是要注意的,就是例化子模塊時對位寬大于32的變量賦0,就會出現意想不到的情況。現在舉個簡單的例子來證實這種情況。假設在子模塊中對一個64位的輸入變量取反后進行輸出,而在頂層模塊中將子模塊輸出變量的第33位進行輸出,用于硬件led的測試。
頂層模塊:
/**********************************************版權申明************************************************* ** 電子技術應用網站, CrazyBird **--------------------------------------------文件信息-------------------------------------------------- ** 文件名: led_top.v ** 創建者: CrazyBird ** 創建日期: 2015-8-2 ** 版本號: v1.0 ** 功能描述: 對變量直接賦0的測試 ** ********************************************************************************************************/ // synopsys translate_off `timescale 1 ns / 1 ps // synopsys translate_on module led_top( led_data ); //****************************************************************************** // 輸入/輸出端口定義 //****************************************************************************** output led_data; //****************************************************************************** // 變量定義 //****************************************************************************** wire [63:0] dout; //****************************************************************************** // 模塊例化 //****************************************************************************** led u_led( .din(0), .dout(dout) ); assign led_data = dout[32]; //****************************************************************************** endmodule //*********************************************文件結束*****************************************************
子模塊:
/**********************************************版權申明************************************************* ** 電子技術應用網站, CrazyBird ** **--------------------------------------------文件信息-------------------------------------------------- ** 文件名: led.v ** 創建者: CrazyBird ** 創建日期: 2015-8-2 ** 版本號: v1.0 ** 功能描述: 對64位的輸入數據取反后輸出 ** ********************************************************************************************************/ // synopsys translate_off `timescale 1 ns / 1 ps // synopsys translate_on module led( din, dout ); //****************************************************************************** // 輸入/輸出端口定義 //****************************************************************************** input [63:0] din; output [63:0] dout; //****************************************************************************** // 取反輸出 //****************************************************************************** assign dout = ~din; //****************************************************************************** endmodule //*********************************************文件結束*****************************************************
modelsim仿真結果:
很顯然,在例化子模塊時對位寬大于32的變量賦0時其實只對低32位賦了0值。
那么這樣的代碼風格對設計實現有沒有影響呢?接著對設計進行綜合后出現以下警告(也提示只對低32位賦了值):
最后對設計進行分配引腳、實現以及生成bit文件并將bit文件下載到紅色颶風開發板上驗證一下,發現led亮了(高電平點亮的),呵呵,一個不定值居然讓led亮了,我不知道硬件是怎么實現的。
(3)第三種:a <= {(DATA_WIDTH){1’b0}}; 其中DATA_WIDTH是經過定義的參數:parameter DATA_WIDTH = 64;對于第三種代碼風格我是極力推薦的,因為它既實現參數化設計,又不會出現第二種代碼風格的情況,具體呢,大家可以親自驗證下,哈哈!