在我看過的很多代碼中,發(fā)現(xiàn)許多人在對(duì)變量賦初始值(或常量值)0時(shí)的做法各種各樣,現(xiàn)在來(lái)分析下這幾種情況對(duì)設(shè)計(jì)的影響。以對(duì)64位變量a賦初始值0為例:
(1)第一種:a <= 64’d0; 對(duì)于這種指定變量具體位寬的代碼風(fēng)格,我是直接否定的,因?yàn)樗焕趨?shù)化設(shè)計(jì);
(2)第二種:a <= 0;(或a <= (0);)而對(duì)于這種直接賦一個(gè)0的做法呢,一般情況下對(duì)設(shè)計(jì)是沒有影響的,而且還能進(jìn)行參數(shù)化設(shè)計(jì),但是在另外一種情況下是要注意的,就是例化子模塊時(shí)對(duì)位寬大于32的變量賦0,就會(huì)出現(xiàn)意想不到的情況。現(xiàn)在舉個(gè)簡(jiǎn)單的例子來(lái)證實(shí)這種情況。假設(shè)在子模塊中對(duì)一個(gè)64位的輸入變量取反后進(jìn)行輸出,而在頂層模塊中將子模塊輸出變量的第33位進(jìn)行輸出,用于硬件led的測(cè)試。
頂層模塊:
/**********************************************版權(quán)申明************************************************* ** 電子技術(shù)應(yīng)用網(wǎng)站, CrazyBird **--------------------------------------------文件信息-------------------------------------------------- ** 文件名: led_top.v ** 創(chuàng)建者: CrazyBird ** 創(chuàng)建日期: 2015-8-2 ** 版本號(hào): v1.0 ** 功能描述: 對(duì)變量直接賦0的測(cè)試 ** ********************************************************************************************************/ // 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 //*********************************************文件結(jié)束*****************************************************
子模塊:
/**********************************************版權(quán)申明************************************************* ** 電子技術(shù)應(yīng)用網(wǎng)站, CrazyBird ** **--------------------------------------------文件信息-------------------------------------------------- ** 文件名: led.v ** 創(chuàng)建者: CrazyBird ** 創(chuàng)建日期: 2015-8-2 ** 版本號(hào): v1.0 ** 功能描述: 對(duì)64位的輸入數(shù)據(jù)取反后輸出 ** ********************************************************************************************************/ // 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 //*********************************************文件結(jié)束*****************************************************
modelsim仿真結(jié)果:
很顯然,在例化子模塊時(shí)對(duì)位寬大于32的變量賦0時(shí)其實(shí)只對(duì)低32位賦了0值。
那么這樣的代碼風(fēng)格對(duì)設(shè)計(jì)實(shí)現(xiàn)有沒有影響呢?接著對(duì)設(shè)計(jì)進(jìn)行綜合后出現(xiàn)以下警告(也提示只對(duì)低32位賦了值):
最后對(duì)設(shè)計(jì)進(jìn)行分配引腳、實(shí)現(xiàn)以及生成bit文件并將bit文件下載到紅色颶風(fēng)開發(fā)板上驗(yàn)證一下,發(fā)現(xiàn)led亮了(高電平點(diǎn)亮的),呵呵,一個(gè)不定值居然讓led亮了,我不知道硬件是怎么實(shí)現(xiàn)的。
(3)第三種:a <= {(DATA_WIDTH){1’b0}}; 其中DATA_WIDTH是經(jīng)過定義的參數(shù):parameter DATA_WIDTH = 64;對(duì)于第三種代碼風(fēng)格我是極力推薦的,因?yàn)樗葘?shí)現(xiàn)參數(shù)化設(shè)計(jì),又不會(huì)出現(xiàn)第二種代碼風(fēng)格的情況,具體呢,大家可以親自驗(yàn)證下,哈哈!