[FPGA]

디지털 합성(Digital Synthesis) 또는 로직합성(Logic Synthesis) 란 무엇인가?

Neo Park 2012. 5. 20. 21:45

 

 

 

Logic synthesis is the process of converting a high-level description of design into an optimized gate-level representation.

 

Logic synthesis uses a standard cell library which have simple cells, such as basic logic gates like and, or, and nor, or macro cells, such as adder, muxes, memory, and flip-flops. Standard cells put together are called technology library. Normally the technology library is known by the transistor size (0.18u, 90nm).

 

A circuit description is written in Hardware Description Language (HDL) such as Verilog. The designer should first understand the architectural description. Then he should consider design constraints such as timing, area, testability, and power.

 

디지털 합성 (혹은 로직 합성, 이하 합성) 은 단어 자체가 매우 애매하고도 추상적인 '합성'이라는 단어를 사용해 처음 듣는 사람은 그 개념 자체를 이해하는 것조차 상당히 까다로운 용어입니다. 하지만 회로, 특히 디지털회로설계, 자동화설계 등에서는 절대로 절대로 절대로 빼먹을 수 없는 과정이기에 한 번 정리해보려 합니다.


먼저 합성의 사전적 정의를 보면, RTL(Register-Transfer Level)로 구현된 추상적인 회로를 실제 Gate들을 통해 구현하는 과정이라고 합니다.


이 글을 읽는 분들이시라면 대부분 전기전자를 전공하신 분들일텐데, 디지털시스템이라는 과목에서 한 번 쯤은 모든 콤비네이셔널 로직 (Combinational Logic) 은 AND+OR 혹은 OR+AND 의 꼴로 표현할 수 있음을 배우셨을 겁니다. 많은 경우, 디지털회로를 구현할 때는 RTL언어로 Verilog, VHDL, 혹은 System Verilog를 사용하게 되며, 우리는 원하는 기능을 구현한 이 디지털회로를 실재적인 Gate (혹은 Standard Cell) 들을 이용하여 똑같이 구현하는 과정을 합성이라고 합니다.


combinational logic과 sequential logic이 모두 들어간 예를 들어 설명해드리겠습니다.

가령 flip-flop을 통해 들어온 1개의 디지털 입력이 3주기동안 1이라면 출력으로 1을 내보내는 디지털 회로를 구현한다고 칩시다. 이를 Verilog를 이용해 구현하면 다음과 같습니다.


module example (in, clk, reset, out);

input in, clk, reset;

output out;


wire in, clk, reset;

reg mid1, mid2, out;


always @ (posedge clk or negedge reset) begin

if(!reset) begin

mid1 <= 0;

mid2 <= 0;

out <= 0;

end

else begin

mid1 <= in;

mid2 <= mid1;


if(in==1 && mid1==1 && mid2==1) begin

out <= 1;

end

else begin

out <= 0;

end

end

end

endmodule


간단한 예제이지만 verilog에 익숙하지 않은 분들을 위해 설명을 드리자면,

clk으로 선언된 입력이 클럭이고 이 클럭의 rising edge일 때마다 always 문을 처리합니다.

그리고 in이라는 입력데이터를 mid1에 저장하고, mid1에 있던 데이터는 mid2에 저장을 합니다.

그리고 out이라는 출력데이터로는 in과 mid1과 mid2 세 개의 register값이 모두 1일 때 출력으로 1을 내보내고, 아니면 0을 내보냅니다.


익숙한 분들이시거나 몇몇 머리가 좋은 분들은 이 회로를 벌써 로직게이트들을 이용해 어떻게 구현할지 머리속으로 그려지실 겁니다. 실제로 약간 복잡할 수 있지만, 위 verilog를 게이트레벨로 필요한 기능만 간단히 구현한다면 (이조차도 매우 크고 복잡한 기능을 가진 블럭에서는 불가능합니다!) 다음과 비슷한 schematic을 가질 것입니다.




이런 기능을 수행하는 회로를 MOSFET, 저항, 캐패시터 등을 이용하여, 아니면 metal과 poly 등을 이용하여 실제 layout으로 구현하라고 한다고 가정해보세요. Flip-flop은 래치를 이용하고, AND게이트는 4개 정도의 CMOS를 이용하여 그리고... (못하는 것은 아닙니다만) schematic, layout, DRC, LVS 등을 하여 엄청난 시간을 들여 구현해야합니다. 만약 기능을 수정이라도 하려면 지금까지 한 것은 물거품 ㅠㅠ 게다가 기능이 복잡해 블럭이 커진다면 이에 들이는 시간은 더더욱 커지겠지요.

 

이런 수고를 덜어주기 위해,


합성이 해주는 첫번째 일은 바로 Verilog를 이용하여 구현한 기능을 위 그림과 같이 게이트들을 이용하여 구현해주는 것입니다. 위에서 제가 그린 도면은 절대로 완벽한 답이 아닙니다. Reset을 통해서 선언되는 초기값들에 대한 조건이나 여러가지 조건 (조금 뒤 부연설명) 에 대한 고려가 전혀 되어있지 않습니다. 이런 조건들을 합성 시 선언할 경우 완벽하게 verilog로 구현된 기능을 게이트레벨로 옮겨줍니다.


합성이 해주는 두번째 일은 이 디지털(로직)연산을 이용하여 구현된 게이트와 블럭들을 Standard Cell에 미리 선언되어있는 각각의 Cell들과 매칭을 시켜주는 것입니다. 대부분의 디지털연산에서는 AND, OR, AOI(AND+OR+Inverter) 등의 combinational logic과 D Flip Flop등과 같은 기본적인 Gate들의 조합으로 모든 기능을 구현할 수 있기 때문에, 반복적으로 사용되는 이런 Cell들을 일일이 구현하지 않도록 Fab (회로를 실제 반도체를 통해 구현해주는 회사 혹은 기관) 에서는 디지털 라이브러리, 즉 Standard Cell을 제공합니다.


합성이 해주는 세번째 일은 합성 시 선언한 조건들을 이용하여 구현 뿐 아니라 안전성이나 타이밍 문제, 로드 등 다양한 제한조건에 맞도록 구현한 회로를 수정해줍니다. 디지털회로시간에 배우는 Fan-out이나 Drive의 개념을 알고계신 분들은 이해가 편하시겠지만, 그렇지 않은 분들을 위해 아주 간단히만 설명하자면, 사이즈가 최소로 매우 작은 Inverter의 출력단이 1과 0을 왔다갔다할 때, 출력단에 1uF과 같이 엄청 큰 load 캐패시터를 동작시켜야 한다면 캐패시터의 큰 용량을 다 채우지 못한 채로 충방전하는데 많은 시간과 전하가 필요해 결국 신호가 사라져버립니다. 입력이나 출력단에 얼마나 큰 캡이 연결될지, 입력부터 출력까지는 몇 주기 이내로 도착해야하는지, Setup Time이나 Hold Time이 잘 지켜져 data가 metastable한 값으로 빠지지는 않는지, 모두 합성 시 조건으로 선언해줍니다. 이 조건들을 고려하여 너무 빨리 transition이 일어나는 곳은 Delay Buffer Cell을 달고, 출력에서 큰 load를 drive를 해야한다면 사이즈가 매우 큰 MOS를 이용한 Flip-flop모델을 이용하는 등 다양한 조건에 맞는 회로를 구현해줍니다.

 

 

 

요약하자면, 로직합성이란 디지털회로를 구현하는 과정에서 반복적이고 사람이 할 경우 완벽하지 않을 수 있는 과정들을 Design Compiler와 같은 컴퓨터프로그램에 내장된 알고리즘과 최적화과정을 통해 구현하는 것입니다. 따라서 설계자는 Verilog로 구현한 디지털코드를 자신의 회로에 맞는 조건들을 선언하여 합성하면, Fab에서 제공하는 라이브러리에 선언되어 있는 Standard Cell들의 조합으로 회로를 구현해줍니다.

 

 

참조:http://blog.naver.com/ner34?Redirect=Log&logNo=40153810007