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中間直的跟橫的粉橘線

### 計算範例:
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的腳位順序

### 擺放要點:
* 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:
:::