很多芯片在設(shè)計(jì)之初,就已經(jīng)考慮如何增加代碼的復(fù)用性,盡量減少工作量,降低錯(cuò)誤概率。 增加復(fù)用性的幾個(gè)場(chǎng)景:
不同項(xiàng)目之間的代碼復(fù)用性
不同工藝之間的代碼復(fù)用性
同一個(gè)模塊例化多份,分別工作在不同模式下
同一個(gè)項(xiàng)目不同環(huán)境(RTL驗(yàn)證,FPGA demo 驗(yàn)證)之間的代碼復(fù)用性
本章節(jié)將簡(jiǎn)單談?wù)剮追N增加代碼復(fù)用性的方法。
1、基礎(chǔ)模塊IP化
在各家ASIC/FPGA項(xiàng)目的代碼目錄中,我們經(jīng)常能看到各類小的基礎(chǔ)模塊,例如各類跨時(shí)鐘模塊、各類調(diào)度仲裁模塊、各類RAM讀寫模塊、各類總線接口模塊等等。它們可能命名為share_ip_*或base_ip_*或cmn_ip_*,又或者其他名稱,幾乎每個(gè)設(shè)計(jì)者都需要用到這些基礎(chǔ)模塊。 我們?cè)谛枰獙?shí)現(xiàn)其相關(guān)功能時(shí),只需要例化模塊即可,簡(jiǎn)單高效,有降低了bug概率。
2、模塊參數(shù)化
在進(jìn)行模塊設(shè)計(jì)時(shí),我們需要盡量保證模塊參數(shù)化,盡量避免使用立即數(shù)(例如10’d0)。 被參數(shù)化的信號(hào)可能是數(shù)據(jù)位寬,用戶數(shù)量或者其他類型的信號(hào)。
module ip_bus_sync #( // parameter DATA_WDTH = 16 , // parameter INI_VALUE = {DATA_WDTH{1'b0}} // )( input i_src_clk , // input i_src_rst_n , // input [DATA_WDTH-1:0] i_src_din , // input i_dst_clk , // input i_dst_rst_n , // output reg [DATA_WDTH-1:0] o_dst_dout // ); //邏輯代碼 endmodule
3、宏定義區(qū)分代碼分支
ASIC項(xiàng)目的代碼一般至少有兩個(gè)版本:ASIC版本和驗(yàn)證版本(FPGA/加速器)。部分公司還會(huì)同時(shí)出兩個(gè)系列的芯片,ASIC系列和FPGA系列。因此我們通常需要通過宏定義區(qū)分不同的代碼分支和參數(shù)
`ifdef FOR_ASIC_DESIGN //ASIC logic //參數(shù)定義 `else //其他分支邏輯 //參數(shù)定義 `endif
`ifdef FOR_ASIC_DESIGN generate genvar i; for ( i=0; i
4、使用參數(shù)選擇代碼分支
在同一個(gè)宏定義分支下(例如同在ASIC或者FPGA項(xiàng)目),我們可能需要獎(jiǎng)模塊例化多份,以支持如下場(chǎng)景:
Case1:同一個(gè)模塊,工作在同的模式下,為了節(jié)約資源,只需要保留對(duì)應(yīng)模式的代碼邏輯。 Case2:同一個(gè)模塊,其支持的功能數(shù)量不同,所需要的RAM等資源也不相同,需要例化不同規(guī)格的RAM。
module xxxxx #( parameter FUNCTION_MODE = `MULTI_FUNCTION ) ( //各類IO信號(hào) ) ; generate if (FUNCTION_MODE==`MULTI_FUNCTION) begin:MULTI_FUNCTION_CODE //多function 邏輯 end else begin:SINGLE_FUNCTION_CODE // 單function 邏輯 end end endgenerate
5、IP接口隔離
不同Vendor的IP的用戶側(cè)接口大概率是不一樣的,為了避免因?yàn)镮P替換導(dǎo)致的大量代碼修改,可以在設(shè)計(jì)之處就考慮將IP接口隔離。例如通過2類接口轉(zhuǎn)換模塊(控制類和數(shù)據(jù)類),將所需要的控制信號(hào)和數(shù)據(jù)流信號(hào)轉(zhuǎn)換成通用的內(nèi)部信號(hào),這樣無(wú)論怎么替換IP,都只需要修改少量代碼。
? ? ? ? ? ? ? ? ?6、std cell 隔離
我們通常會(huì)將std cell外包一層或者多層代碼,這樣就能將工藝與設(shè)計(jì)代碼盡量分離。
常見的有bit同步器,ram,clk-gating,clk mux等模塊。如下是單bit同步器的案例。
module ip_bit_sync #( parameter DATA_WDTH = 1 // bit width)(in put wire i_dst_clk, // destination clockinput wire [(DATA_WDTH-1):0] i_src_din, // data inputoutput wire [(DATA_WDTH-1):0] o_dst_dout // data output);`ifdef FOR_ASIC_DESIGNgenerategenvar i;for ( i=0; i
審核編輯:劉清
-
FPGA
+關(guān)注
關(guān)注
1625文章
21628瀏覽量
601261 -
加速器
+關(guān)注
關(guān)注
2文章
790瀏覽量
37683 -
芯片設(shè)計(jì)
+關(guān)注
關(guān)注
15文章
995瀏覽量
54776 -
RTL
+關(guān)注
關(guān)注
1文章
385瀏覽量
59667 -
ASIC芯片
+關(guān)注
關(guān)注
2文章
91瀏覽量
23709
原文標(biāo)題:增加設(shè)計(jì)復(fù)用性的6種方法
文章出處:【微信號(hào):處芯積律,微信公眾號(hào):處芯積律】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論