IO File Design - withIO === 步驟 --- 1. 決定power組數 2. 建立io file 3. 變更 gate level netlist file (2、3順序沒關係) 4. 檢查 決定power組數 --- 會因為製程有不同的輸出電容值,影響到power組數,比較簡易的做法是至少8隻io腳加1隻power腳,power分成VDD與VSS,而個別分為IO Pad使用與Core使用的,Core power會相連成power stripe,為了後續的power plan方便建議將Core power擺放對稱(N-S、W-E的CoreVdd對CoreVdd、CoreVss對CoreVss),若有多的腳位使用Vss。 stripe是下圖Core中間直的跟橫的粉橘線 ![image](https://hackmd.io/_uploads/BJd2CId2C.png =60%x) ### 計算範例: IO腳位 = 372+1(POC) = 373隻 power 腳位 = 373/8 = 47 隻 總腳位 = 373+47 = 420隻(可剛好被4整除,一邊105隻) 由於power給的較緊繃,因此改為每邊110隻,總腳位為440隻 power 腳位 = 440-373 = 67隻 ioVdd = 16隻 ioVss = 17隻 coreVdd = 16隻 coreVss = 18隻(:star:注意core power要對稱所以要偶數,且Vss要較多) 建立io file --- 下圖紅色箭頭方向為io file的腳位順序 ![image](https://hackmd.io/_uploads/H14kjLO3C.png =70%x) ### 擺放要點: * Core power 需擺放對稱 * clk、reset和control signal都該擺在晶片四邊的中間,以平均常用腳位的走線長度。 * LSB、clk、reset、control signal等等的高頻腳位或是不容許干擾的腳位旁邊需用power做隔離,例如ioVdd - clk - ioVss ### 範例如下: ```io= Version: 1 Pad: CORNER0 NW PCORNER Pad: ipad_data_0_2 N Pad: ipad_data_0_1 N Pad: ipad_CoreVDD0 N PVDD1DGZ Pad: ipad_data_0_0 N Pad: ipad_IOVDD0 N PVDD2DGZ Pad: ipad_data_0_3 N Pad: ipad_data_0_4 N Pad: ipad_CoreVSS0 N PVSS1DGZ Pad: ipad_data_0_5 N Pad: ipad_data_0_6 N Pad: CORNER1 NE PCORNER Pad: ipad_data_1_4 W Pad: ipad_data_1_3 W Pad: ipad_data_1_2 W Pad: ipad_CoreVDD1 W PVDD1DGZ Pad: ipad_reset W Pad: ipad_IOVSS0 W PVSS2DGZ Pad: ipad_data_1_0 W Pad: ipad_CoreVSS1 W PVSS1DGZ Pad: ipad_data_1_1 W Pad: ipad_data_0_7 W Pad: CORNER2 SW PCORNER Pad: ipad_data_1_5 S Pad: ipad_data_1_6 S Pad: ipad_CoreVDD2 S PVDD1DGZ Pad: ipad_data_2_0 S Pad: ipad_IOVDD1 S PVDD2DGZ Pad: ipad_data_2_1 S Pad: ipad_data_2_2 S Pad: ipad_CoreVSS2 S PVSS1DGZ Pad: ipad_data_2_3 S Pad: ipad_data_2_4 S Pad: CORNER3 SE PCORNER Pad: ipad_POC E PVDD2POC Pad: ipad_data_3_2 E Pad: ipad_data_3_1 E Pad: ipad_CoreVDD3 E PVDD1DGZ Pad: ipad_clk E Pad: ipad_IOVSS1 E PVSS2DGZ Pad: ipad_data_3_0 E Pad: ipad_CoreVSS3 E PVSS1DG Pad: ipad_data_2_6 E Pad: ipad_data_2_5 E ``` 變更 gate level file --- 需在合成後或是DFT後的gate level file的最底下加入"CHIP module",這邊就沒有順序之分了,像是連連看將 .io file的腳位與code中的腳位連接。 ### 範例如下: ```verilog= module CHIP( clk, reset, io_data0, io_data1, finish, io_data2 ); input clk, reset; input [7:0] io_data0, io_data1; output finish; output [7:0] io_data2; ///////////////////////////////////////////////////////////// wire i_clk, i_reset; wire [7:0] i_io_data0, i_io_data1; wire i_finish; wire [7:0] i_io_data2; ///////////////////////////////////////////////////////////// TOP u_TOP( .clk(i_clk), reset(i_reset), .io_data0(i_io_data0), .io_data1(i_io_data1), .finish(i_finish), .io_data2(i_io_data2) ); //////////////////////////////////////////////////////////// //Input singal pad 18 pins PDIDGZ ipad_clk (.PAD(clk), .C(i_clk)); PDIDGZ ipad_reset (.PAD(reset), .C(i_reset)); PDIDGZ ipad_data_0_0 (.PAD(io_data0[0]), .C(i_io_data0[0])); PDIDGZ ipad_data_0_1 (.PAD(io_data0[1]), .C(i_io_data0[1])); PDIDGZ ipad_data_0_2 (.PAD(io_data0[2]), .C(i_io_data0[2])); PDIDGZ ipad_data_0_3 (.PAD(io_data0[3]), .C(i_io_data0[3])); PDIDGZ ipad_data_0_4 (.PAD(io_data0[4]), .C(i_io_data0[4])); PDIDGZ ipad_data_0_5 (.PAD(io_data0[5]), .C(i_io_data0[5])); PDIDGZ ipad_data_0_6 (.PAD(io_data0[6]), .C(i_io_data0[6])); PDIDGZ ipad_data_0_7 (.PAD(io_data0[7]), .C(i_io_data0[7])); PDIDGZ ipad_data_1_0 (.PAD(io_data1[0]), .C(i_io_data1[0])); PDIDGZ ipad_data_1_1 (.PAD(io_data1[1]), .C(i_io_data1[1])); PDIDGZ ipad_data_1_2 (.PAD(io_data1[2]), .C(i_io_data1[2])); PDIDGZ ipad_data_1_3 (.PAD(io_data1[3]), .C(i_io_data1[3])); PDIDGZ ipad_data_1_4 (.PAD(io_data1[4]), .C(i_io_data1[4])); PDIDGZ ipad_data_1_5 (.PAD(io_data1[5]), .C(i_io_data1[5])); PDIDGZ ipad_data_1_6 (.PAD(io_data1[6]), .C(i_io_data1[6])); PDIDGZ ipad_data_1_7 (.PAD(io_data1[7]), .C(i_io_data1[7])); //Output singal pad 9 pins PDO24CDG opad_finish (.I(i_finish), .PAD(finish)); PDO24CDG opad_data_2_0 (.I(i_io_data2[0]), .PAD(io_data2[0])); PDO24CDG opad_data_2_1 (.I(i_io_data2[1]), .PAD(io_data2[1])); PDO24CDG opad_data_2_2 (.I(i_io_data2[2]), .PAD(io_data2[2])); PDO24CDG opad_data_2_3 (.I(i_io_data2[3]), .PAD(io_data2[3])); PDO24CDG opad_data_2_4 (.I(i_io_data2[4]), .PAD(io_data2[4])); PDO24CDG opad_data_2_5 (.I(i_io_data2[5]), .PAD(io_data2[5])); PDO24CDG opad_data_2_6 (.I(i_io_data2[6]), .PAD(io_data2[6])); PDO24CDG opad_data_2_7 (.I(i_io_data2[7]), .PAD(io_data2[7])); endmodule ``` 檢查 --- 因為io檔是APR非常前期的一步,若這個檔案有問題就需要修改完後重新APR,因此建議將io檔匯入Innovus後檢查。 常見錯誤: * 腳位型號的0或O * input or output打反 * power重複命名 --- :::danger 如果我有哪裡寫錯或是做不好的請告訴我 :woman-bowing: 完成之後小休一下回到前面進行[下一步](https://hackmd.io/@linda8832825/r1koDSd3R#global-file),你超棒的:facepunch: :::