LVS를 검증하기 위한 CDL netlist에 관한 포스팅을 두차례에 나누어 할 예정인데, 그 중 하나로 기본적인 control 구문들에 대해 알아보기로 하겠다.
Netlist에도 verilog, EDIF, spice 등 여러 종류의 netlist가 있고 각 종류마다 각기 다른 format을 가지고 있다.
그 중 virtuoso 혹은 custom-compiler를 사용하여 회로를 설계한 후 레이아웃과 비교하는 LVS 검증을 하기 위해 추출하는 netlist을 CDL netlist라고 한다.
CDL은 Circuit Description Language 또는 Circuit Design Language의 약자이다.
어떤 이들은 spice netlist라고부르기도 하는데, 엄밀하게는 spice netlist와 CDL netlist는 다른 점이 있지만 보통 LVS 검증이나 hspice simulation 실행 시 호환이 되도록 출력하여 사용하므로 spice netlist라고 불러도 상관은 없다. 실제 현업에서도 구분 없이 부르는 편.
CDL netlist 역시 language 형식을 따르므로 자세하게 알기 위해서는 SVRF manual을 보는 것이 가장 좋겠지만, 이쪽 업무가 다 그렇듯 보통 manual이 기본 몇백 페이지는 넘어가다 보니 업무에 바쁜 와중에 (그것도 영어로 된) manual을 정독하는 것은 쉬운 일이 아니다.
하지만 여러 사람이 함께 작업해야 하거나서로가 레이아웃한 블럭에 대한 netlist를 모아서 큰 블럭이나 chip 레벨의 netlist를 만들어서 검증하다 보면 예기치 못하게 n etlist로 인한 LVS 에러도 많이 발생하기 때문에 그래도 기본적인 사항들은 알고 있어야 netlist로 인한 에러들을 해결 할 수 있으니 잘 알아보도록 하자.
일단 SUBCKT 이나 디바이스 별 netlist format은 별도로 다루기로 하고, 설계 tool이 netlist 파일의 주로 윗부분에 프린트 해 주는 control 구문 중 LVS 검증을 하면서 알고 있어야 하는 구문들을 리스트로 정리해 보았다.
.INCLUDE 또는 .INC
.SUBCKT
.ENDS
.PARAM
*.BIPOLAR
*.CAPA
*.CAPVAL
*.CAPAREA
*.DIODE
*.DIOAREA
*.DIOPERI
*.RESI
*.RESVAL
*.RESSIZE
*.GLOBAL
*.PININFO
*.MEGA
*.SCALE
*.EQUIV
위의 리스트들을 보면 일부는 . 으로 시작하고 일부는 *. 으로 시작한다는 것을 알 수 있다.
CDL netlist에서는 첫 글자가 *로 시작하면 그 줄은 주석으로 처리된다.
하지만 이렇게 *. 으로 시작하면 control 구문으로 사용되기도 하므로 필요에 의해 일부 줄을 주석 처리하고자 할 때는 제일 앞에 * 만 입력해 주면 된다. (그래서 필자는 습관적으로 ** 로 입력한다.)
줄의 전체 말고 뒷부분 일부만 주석으로 처리 할 때는 $ 를 입력하면 $ 뒷부분은 주석으로 처리되는데, spice netlist에서는 $로 표시된 parameter를 사용하기도 한다.
LVS 실행 시에는 spice simulation 보다 훨씬 적은 수의 parameter에 대해서만 레이아웃과 비교하기 때문에 spice simulation에서만 사용하는 parameter들은 $를 붙여서 줄의 뒷부분에 출력하여 LVS 검증 시에는 주석 처리되도록 한다.
그리고 예외로 디바이스 model에 대해서는 $[modelname] 의 형식으로 줄의 중간에 있어도 주석으로 처리되지 않는데,
자세한 예는 2차 포스팅에서 각 디바이스 별 포멧에서 소개하겠다.
<CDL netlist의 주석 예>
**** This is comment.
R0 1 2 20 $ Comment from $.
이제부터는 control 구문을 자세히 알아보자.
.INCLUDE 또는 .INC
CDL netlist에서 또다른 netlist를 읽어들일 때 사용한다.
사용 방법)
.INCLUDE filename
.INCLUDE 'filename'
.INCLUDE "filename"
.INC filename
.INC 'filename'
.INC "filename"
이 때 filename은 path를 포함할 수 있으며, path는 절대 path와 netlist 위치를 기준으로 한 상대 path 모두 가능한다.
모든 include하는 netlist와 include 되는 netlist가 같은 path에 있으면 filename만 써 줘도 된다.
예에서 알 수 있듯이 filename은 ' ' 나 " " 안에 들어 갈 수 있다.
.SUBCKT
하나의 sub-circuit 또는 cell을 뜻하는 SUBCKT 구문의 시작을 나타낸다.
형식)
.SUBCKT cell_name pin_lists ..
.ENDS
.SUBCKT 구문의 끝남을 나타낸다.
형식)
.ENDS cell_name 또는 .ENDS
일단 .ENDS 를 만나면 LVS는 .SUBCKT 구문이 끝나는 것으로 인식하기 때문에 .ENDS 뒤의 cell_name은 없어도 상관없다.
.PARAM
Parameter의 이름과 값을 정의해 주며, .PARAM에서 지정해 준 값은 SUBCKT에서 설정된 값보다 우선순위가 높다.
형식)
.PARAM param_name=param_value ......
예)
.PARAM width=1u pp="abc"
X1 9 10 mos2 width=5u length=6u pp="def"
.SUBCKT mos2 in1 in2 width=10u length=20u aread=30p areas=40p
M1 in1 in2 3 4 pmos w=width l=length ad=aread as=areas
위의 netlist에서 각 parameter의 값은 아래와 같다.
w = 1u (from .PARAM statement)
l = 6u (from the SUBCKT call)
ad = 30p (from .SUBCKT definition)
as = 40p (from .SUBCKT definition)
rr = "abc" (from .PARAM statement)
*.BIPOLAR
*.BIPOLAR는 netlist에 있는 2단자 디바이스인 저항, capacitor, diode를 인식하라는 뜻으로
*.BIPOLAR가 없으면 netlist에 있는 저항, capacitor, diode 들은 디없는 것으로 처리되기 때문에 세 가지 디바이스 중 하나라도 사용한다면 반드시 있어야 하는 구문이다.
아날로그 회로에서는 위의 디바이스들은 항상 사용하므로 netlist에 고정적으로 있어야 한다고 생각하면 된다.
*.CAPA
*.CAPA는 netlist 안에 있는 capacitor를 인식하지 말라는 뜻으로, *.BIPOLAR 구문이 있으면서 capacitor를 인식하지 않을 때 사용한다. *.BIPOLAR 구문이 없을 때는 어차피 capacitor를 인식하지 않는다.
*.CAPVAL
레이아웃과 netlist의 capacitor 사이즈를 비교 할 때 cap 값을 기준으로 비교하도록 한다.
최근 공정들은 LVS rule 파일에서 디폴트로 width, length 등의 사이즈 parameter로 비교하도록 작성되어 있는 경우가 많이 있으므로 이 구문이 필요없을 때도 있다.
*.CAPAREA
레이아웃과 netlist의 capacitor 사이즈를 비교 할 때 면적을 기준으로 비교하도록 한다.
최근 공정들은 LVS rule 파일에서 디폴트로 width, length 등의 사이즈 parameter로 비교하도록 작성되어 있는 경우가 많이 있으므로 이 구문이 필요없을 때도 있다.
*.DIODE
*.DIODE는 netlist 안에 있는 diode를 인식하지 말라는 뜻으로, *.BIPOLAR 구문이 있으면서 diode를 인식하지 않을 때 사용한다. *.BIPOLAR 구문이 없을 때는 어차피 diode를 인식하지 않는다.
*.DIOAREA
레이아웃과 netlist의 diode 사이즈를 비교 할 때 diode 면적값을 기준으로 비교하도록 한다.
*.DIOPERI
레이아웃과 netlist의 diode 사이즈를 비교 할 때 diode 외곽선 길이를 기준으로 비교하도록 한다.
*.RESI
일정 값보다 작은 저항의 양 단을 short 처리하도록 한다.
예)
*.RESI 10 $ 10옴 이하의 저항이 있다면 이 저항은 없는 것으로 치고 양 단을 같은 net으로 인식함
*.RESVAL
레이아웃과 netlist의 저항 사이즈를 비교 할 때 저항값을 기준으로 비교하도록 한다.
최근 공정들은 LVS rule 파일에서 디폴트로 width, length 등의 사이즈 parameter로 비교하도록 작성되어 있는 경우가 많이 있으므로 이 구문이 소용없을 때도 있다.
*.RESSIZE
레이아웃과 netlist의 저항 사이즈를 비교 할 때 width, length 값을 기준으로 비교하도록 한다.
*.GLOBAL
Power, ground, clock 등의 특정 net을 netlist 전체에 global로 지정해 주는 구문
예를 들어
*.GLOBAL VDD VSS
이렇게 선언되어 있다면 netlist에서 SUBCKT 안에 있는 모든 VDD, VSS는 TOP에서 다른 net 이름으로 지정해 주더라도 VDD, VSS로 인식된다.
그런데 요즘은 회로가 복잡해지면서 하나의 chip에 여러 개의 power를 사용하는 것이 대부분이기 때문에 .GLOBAL을 적용하지 않는 경우가 대부분이다. 이럴 때 나도 모르게 netlist 어딘가에 .GLOBAL 구문이 들어가 있다면 이를 찾는 것도 아주 귀찮은 일이 될 수 있기 때문에 아예 .GLOBAL 구문이 있더라도 없는 것 처럼 LVS 실행하게 할 수 있다.
이를 위해서는 LVS rule file 안에
LVS SPICE PREFER YES
구문을 추가 해 주면 된다. (.GLOBAL을 적용하고 싶으면 YES 대신 NO를 사용)
*.PININFO
.SUBCKT 구문 안에 PIN list 다음에 출력되는 이 구문은 pin의 정보(power, ground, input, output등)를 나타내 주는데, LVS 실행 시 이 구문은 주석으로 처리되므로 삭제해 버려도 LVS와는 상관없는 구문이다.
*.MEGA
Netlist 내부에 단위를 나타내기 위해 사용된 글자(k,m,u,p 등) 중 대문자 M을 mili(1E-3) 이 아닌 Mega(1E+6)으로 인식하게 한다. 이 구문이 없다면 m, M 모두 mili 로 인식하기 때문에 반드시 사용하는 것이 좋다.
*.SCALE
이 구문을 사용하면 단위를 사용하는 parameter 들에 대해 디폴트로 정해진 단위를 적용하게 된다.
예를 들면,
*.SCALE METER
M1 in1 in2 3 4 pmos w=1u l=0.5u
이렇게 사용하면 M1의 w=1um, l=0.5um가 된다.
보통 virtuoso와 같은 설계 tool에서 netlist를 추출하게 되면 *.SCALE METER로 지정되어 출력된다.
*.EQUIV
기존의 디바이스 이름이나 특정 net등의 이름을 새로운 이름으로 지정해 준다.
형식은
*.EQUIV new_name=old_name
예 1)
*.EQUIV P=TP N=TN
M1 1 2 3 4 TP
M2 1 2 3 4 TN
예 1)
*.GLOBAL 1 0
*.EQUIV VCC=1 VSS=0
위에서 설명한 CDL netlist의 control 구문의 조합에 따라 LVS 결과가 바뀔 수 있다.
예를 들면 subckt에서 사용된 VDD, VSS에 대해 global로 지정하지 않고 chip에서 VDD1, VDD2, VSS1, VSS2 등의 여러개의 이름으로 나누어서 검증했는데, include 한 netlist 안에 *.GLOBAL VDD VSS 구문이 있다면 chip에서 나누어준 VDD1, VDD2, VSS1, VSS2 는 모두 VDD VSS로 바뀌기 때문에 netlist에서 VDD1, VDD2가 short되었다고 인식할 것이다.
대부분의 control 구문은 include 된 netlist까지 포함하여 한 번이라도 지정되어 있으면 전체 netlist에 적용이 되어버린다.
그래서 TOP을 기준으로 하여 모든 include 되는 netlist들의 control 구문을 통일하는 것이 아주 중요하다.
이게 통일되지 않으면 TOP에서 검증 할 때 어떤 블럭은 LVS가 되지만 다른 블럭은 LVS가 안되는 일이 발생한다.
예를 들면 *.RESI를 A라는 netlist에서는 1ohm으로 설정했는데 B라는 netlist에서는 다른 값의 *.RESI 를 사용했다면 A, B 중 어느 하나의 netlist 에 있는 저항에서 에러가 발생 할 수 있다.
실제로 이런 control 구문으로 인한 LVS 에러도 많이 발생하는 편이니 이번 기회에 잘 숙지해 놓으면 좋을 것이다.
'검증' 카테고리의 다른 글
LVS ABORT ON SUPPLY ERROR / LVS ABORT ON SUPPLY SHORT (4) | 2024.09.02 |
---|---|
안테나 에러 (antenna effect)의 의미와 해결 방법 (0) | 2024.08.26 |
Calibre : 필요한 rule만 골라서 체크하는 DRC SELECT CHECK (0) | 2024.06.24 |
LVS 시간 단축 tip - Calibre로 netlist error check 먼저 하기 (1) | 2024.06.08 |
virtuoso,calibre를 이용하여 flatten netlist 만드는 방법 (4) | 2024.05.10 |