What is ASIC?
Application Specific Integrated Circuit(ASIC)은 특정한 사용을 위해 맞춤화된(customized) 집적회로이다.
ASIC의 제작과정은 크게 다음과 같다.
1. 디자인(Design)
2. 구현(Implementation)
3. 제작(Fabrication)
4. 패키지/테스트(Pakage/Test)
5. 양산(Mass-Production)
1. 디자인(Design)
디자인 과정에서 다음과 같은 세부적인 과정으로 나뉘어질 수 있다.
1-1. Specification
1-2. Architecture Design
1-3. RTL Design
1-1. Specification
specification 과정에서 제품의 스펙을 정하게 된다.
가령 clock frequency, RAM/ROM speed & size, Number of Cell, Process Core(ARM, CISC, RISC ...), Interface 등등 같은 것들을 제품이 요구하는 스펙에 맞추어 결정해야 한다.
1-2. Architecture Design
architecture design 과정에서 전체 시스템의 architecture를 design한다.
가령 밑의 그림과 같이, 어떤 Bus를 통해서 무슨 protocol을 사용하여 정보를 주고받는가, 사용되는 IP는 무엇인가, 등을 design한다.

1-3. RTL design
RTL design 과정에서는 RTL을 디자인하게 된다.RTL이란 Register Transfer Level로써, 하드웨어 레지스터 사이의 데이터 흐름을 기술한 동기식 디지털 회로의 추상화 모델이다. RTL과 같은 추상화 모델이 필요한 이유는 인간이 쉽게 받아들이고, 생산성을 높이도록 하기 위함이다. 가령 다음과 같은 예를 들 수 있다.다음과 같은 check_sum을 판단하는 회로를 기술한다고 할 때, RTL로 회로를 기술하면 인간이 회로의 기능을 상상하고 설계하기 쉽다.
module message(cluster0, cluster1, cluster2, cluster3, csum_cluster, cluster_data0, cluster_data1, cluster_data2, cluster_data3);
input [7:0] cluster0, cluster1, cluster2, cluster3, csum_cluster;
output reg [7:0] cluster_data0, cluster_data1, cluster_data2, cluster_data3;
reg [7:0] csum;
initial begin
cluster_data0 = 8'b00000000;
cluster_data1 = 8'b00000000;
cluster_data2 = 8'b00000000;
cluster_data3 = 8'b00000000;
end
always @(*) begin
csum = cluster0 + cluster1 + cluster2 + cluster3;
csum = ~csum + 1'b1;
if(csum == csum_cluster) begin
cluster_data0 = cluster0;
cluster_data1 = cluster1;
cluster_data2 = cluster2;
cluster_data3 = cluster3;
$display("%h %h %h %h", cluster_data0, cluster_data1, cluster_data2, cluster_data3);
$display("%c %c %c %c", cluster_data0, cluster_data1, cluster_data2, cluster_data3);
end
else begin
cluster_data0 = 8'b00000000;
cluster_data1 = 8'b00000000;
cluster_data2 = 8'b00000000;
cluster_data3 = 8'b00000000;
$display("%h %h %h %h", cluster_data0, cluster_data1, cluster_data2, cluster_data3);
end
end
endmodule
하지만 위의 회로의 Gate Level Netlist를 추출하면 다음과 같다. 이 Gate Level Netlist는 인간이 회로의 기능을 상상하기도 어렵고, 설계하기도 어렵다.
module message ( cluster0, cluster1, cluster2, cluster3, csum_cluster,
cluster_data0, cluster_data1, cluster_data2, cluster_data3 );
input [7:0] cluster0;
input [7:0] cluster1;
input [7:0] cluster2;
input [7:0] cluster3;
input [7:0] csum_cluster;
output [7:0] cluster_data0;
output [7:0] cluster_data1;
output [7:0] cluster_data2;
output [7:0] cluster_data3;
wire \csum[7] , \csum[6] , \csum[5] , \csum[4] , \csum[3] , \csum[2] ,
\csum[1] , \csum[0] , N9, N8, N7, N6, N5, N4, N32, N31, N30, N3, N29,
N28, N27, N26, N25, N24, N23, N22, N21, N20, N2, N19, N18, N17, N16,
N15, N14, N13, N12, N11, N10, N1, n25, n26, n27, n28, n29, n30, n31,
n32, n33, n34, n35, n36, n37, n38, n39, n40;
assign N18 = cluster3[1];
message_DW01_sub_0 sub_0_root_add_38_ni ( .A({N25, N26, N27, N28, N29, N30,
N31, N32}), .B({N16, N15, N14, N13, N12, N11, N10, N9}), .CI(1'b0),
.DIFF({\csum[7] , \csum[6] , \csum[5] , \csum[4] , \csum[3] ,
\csum[2] , \csum[1] , \csum[0] }) );
message_DW01_add_0 add_1_root_add_38_ni ( .A({N8, N7, N6, N5, N4, N3, N2, N1}), .B({N24, N23, N22, N21, N20, N19, N18, N17}), .CI(1'b0), .SUM({N25, N26,
N27, N28, N29, N30, N31, N32}) );
message_DW01_add_1 add_3_root_add_38_ni ( .A(cluster1), .B(cluster2), .CI(
1'b0), .SUM({N16, N15, N14, N13, N12, N11, N10, N9}) );
NOR2X4_HVT U48 ( .A1(n26), .A2(n27), .Y(n25) );
AND2X1_HVT U49 ( .A1(cluster3[7]), .A2(n25), .Y(cluster_data3[7]) );
AND2X1_HVT U50 ( .A1(cluster3[6]), .A2(n25), .Y(cluster_data3[6]) );
AND2X1_HVT U51 ( .A1(cluster3[5]), .A2(n25), .Y(cluster_data3[5]) );
AND2X1_HVT U52 ( .A1(cluster3[4]), .A2(n25), .Y(cluster_data3[4]) );
AND2X1_HVT U53 ( .A1(cluster3[3]), .A2(n25), .Y(cluster_data3[3]) );
AND2X1_HVT U54 ( .A1(cluster3[2]), .A2(n25), .Y(cluster_data3[2]) );
AND2X1_HVT U55 ( .A1(N18), .A2(n25), .Y(cluster_data3[1]) );
AND2X1_HVT U56 ( .A1(n25), .A2(cluster3[0]), .Y(cluster_data3[0]) );
AND2X1_HVT U57 ( .A1(cluster2[7]), .A2(n25), .Y(cluster_data2[7]) );
AND2X1_HVT U58 ( .A1(cluster2[6]), .A2(n25), .Y(cluster_data2[6]) );
AND2X1_HVT U59 ( .A1(cluster2[5]), .A2(n25), .Y(cluster_data2[5]) );
AND2X1_HVT U60 ( .A1(cluster2[4]), .A2(n25), .Y(cluster_data2[4]) );
AND2X1_HVT U61 ( .A1(cluster2[3]), .A2(n25), .Y(cluster_data2[3]) );
AND2X1_HVT U62 ( .A1(cluster2[2]), .A2(n25), .Y(cluster_data2[2]) );
AND2X1_HVT U63 ( .A1(cluster2[1]), .A2(n25), .Y(cluster_data2[1]) );
AND2X1_HVT U64 ( .A1(cluster2[0]), .A2(n25), .Y(cluster_data2[0]) );
AND2X1_HVT U65 ( .A1(cluster1[7]), .A2(n25), .Y(cluster_data1[7]) );
AND2X1_HVT U66 ( .A1(cluster1[6]), .A2(n25), .Y(cluster_data1[6]) );
AND2X1_HVT U67 ( .A1(cluster1[5]), .A2(n25), .Y(cluster_data1[5]) );
AND2X1_HVT U68 ( .A1(cluster1[4]), .A2(n25), .Y(cluster_data1[4]) );
AND2X1_HVT U69 ( .A1(cluster1[3]), .A2(n25), .Y(cluster_data1[3]) );
AND2X1_HVT U70 ( .A1(cluster1[2]), .A2(n25), .Y(cluster_data1[2]) );
AND2X1_HVT U71 ( .A1(cluster1[1]), .A2(n25), .Y(cluster_data1[1]) );
AND2X1_HVT U72 ( .A1(cluster1[0]), .A2(n25), .Y(cluster_data1[0]) );
AND2X1_HVT U73 ( .A1(n25), .A2(cluster0[7]), .Y(cluster_data0[7]) );
AND2X1_HVT U74 ( .A1(n25), .A2(cluster0[6]), .Y(cluster_data0[6]) );
AND2X1_HVT U75 ( .A1(n25), .A2(cluster0[5]), .Y(cluster_data0[5]) );
AND2X1_HVT U76 ( .A1(n25), .A2(cluster0[4]), .Y(cluster_data0[4]) );
AND2X1_HVT U77 ( .A1(n25), .A2(cluster0[3]), .Y(cluster_data0[3]) );
AND2X1_HVT U78 ( .A1(n25), .A2(cluster0[2]), .Y(cluster_data0[2]) );
AND2X1_HVT U79 ( .A1(n25), .A2(cluster0[1]), .Y(cluster_data0[1]) );
AND2X1_HVT U80 ( .A1(n25), .A2(cluster0[0]), .Y(cluster_data0[0]) );
NAND4X0_HVT U81 ( .A1(n28), .A2(n29), .A3(n30), .A4(n31), .Y(n27) );
XNOR2X1_HVT U82 ( .A1(csum_cluster[2]), .A2(\csum[2] ), .Y(n31) );
XNOR2X1_HVT U83 ( .A1(csum_cluster[7]), .A2(\csum[7] ), .Y(n30) );
XNOR2X1_HVT U84 ( .A1(csum_cluster[0]), .A2(\csum[0] ), .Y(n29) );
XNOR2X1_HVT U85 ( .A1(csum_cluster[1]), .A2(\csum[1] ), .Y(n28) );
NAND4X0_HVT U86 ( .A1(n32), .A2(n33), .A3(n34), .A4(n35), .Y(n26) );
XNOR2X1_HVT U87 ( .A1(csum_cluster[3]), .A2(\csum[3] ), .Y(n35) );
XNOR2X1_HVT U88 ( .A1(csum_cluster[4]), .A2(\csum[4] ), .Y(n34) );
XNOR2X1_HVT U89 ( .A1(csum_cluster[5]), .A2(\csum[5] ), .Y(n33) );
XNOR2X1_HVT U90 ( .A1(csum_cluster[6]), .A2(\csum[6] ), .Y(n32) );
INVX0_HVT U91 ( .A(cluster0[7]), .Y(N8) );
INVX0_HVT U92 ( .A(cluster0[6]), .Y(N7) );
INVX0_HVT U93 ( .A(cluster0[5]), .Y(N6) );
INVX0_HVT U94 ( .A(cluster0[4]), .Y(N5) );
INVX0_HVT U95 ( .A(cluster0[3]), .Y(N4) );
INVX0_HVT U96 ( .A(cluster0[2]), .Y(N3) );
XOR2X1_HVT U97 ( .A1(n36), .A2(cluster3[7]), .Y(N24) );
OR2X1_HVT U98 ( .A1(n37), .A2(cluster3[6]), .Y(n36) );
XOR2X1_HVT U99 ( .A1(n37), .A2(cluster3[6]), .Y(N23) );
OR3X1_HVT U100 ( .A1(cluster3[4]), .A2(cluster3[5]), .A3(n38), .Y(n37) );
XOR2X1_HVT U101 ( .A1(n39), .A2(cluster3[5]), .Y(N22) );
OR2X1_HVT U102 ( .A1(n38), .A2(cluster3[4]), .Y(n39) );
XOR2X1_HVT U103 ( .A1(n38), .A2(cluster3[4]), .Y(N21) );
OR3X1_HVT U104 ( .A1(cluster3[2]), .A2(cluster3[3]), .A3(N18), .Y(n38) );
XOR2X1_HVT U105 ( .A1(n40), .A2(cluster3[3]), .Y(N20) );
OR2X1_HVT U106 ( .A1(cluster3[2]), .A2(N18), .Y(n40) );
INVX0_HVT U107 ( .A(cluster0[1]), .Y(N2) );
XOR2X1_HVT U108 ( .A1(cluster3[2]), .A2(N18), .Y(N19) );
INVX0_HVT U109 ( .A(cluster3[0]), .Y(N17) );
INVX0_HVT U110 ( .A(cluster0[0]), .Y(N1) );
endmodule
이처럼 사람이 하나 하나 Gate Level Netlist를 작성해 주기 힘들기 때문에(특히나 회로의 복잡도가 높아지는 현대에서), HDL(Hardware Description Language)로 기술된 RTL을 전자 설계 자동화(EDA - Electronic Design Automation) 툴을 사용하여 Gate Level Netlist를 추출하게 된다.
'ASIC Design Flow > Overall ASIC Design Flow' 카테고리의 다른 글
Overall ASIC Design Flow (3) (0) | 2022.07.08 |
---|---|
Overall ASIC design Flow (2) (0) | 2022.07.05 |