VHDL 개요
HDL을 이용한 설계개요
1. HDL 이란?
HDL에 대해서 생각해 보기로 한다. HDL은 Hardware Description Language의 첫자를 딴것이다. 우리말로 그대로 옮기면 말그대로 하드웨어를 기술하는 언어이다. 하드웨어를 기술 한다는 것은 회로를 표현 한다는 것을 의미한다. 많은 전자회로 캐드 툴(CAD Tool)들을 보면 스케마틱으로 회로를 "그림"형태로 그려서 "표현" 혹은 "기술" 한다. HDL은 전자회로를 언어로서 표현하는 것이다. 결국 회로를 표현하는 것은 부품들의 상호연결 관계를 일정한 문법에 의하여 기술하는데 이중 하나가 EDIF일것이다.
HDL이란 이와 같이 전자회로를 정해진 문법과 키워드 그리고 사용자 정의 객체들(user define objects)을 가지고 회로를 기술(description)하는 것이다. 이제부터 말하려는 VHDL은 EDIF와같이 네트리스트의 성격 뿐만아니라 프로그래밍 언어의 성격도 가지고 있어서 매우 다양한 하드웨어 기술 방법을 제공한다. HDL이 프로그래밍 언어와 다른 점은 프로그래밍 언어는 전부 순차구문 (sequential statements) 이지만 HDL은 동시구문(혹은 병렬구문, concurrent statements)이 있다는 점이다. 프로그래밍 언어에서는 모든 구문은 순차적으로 실행된다. 이는 프로그램 내에서 구문이 쓰여진 (또는 놓여진)위치가 매우 중요하지만 HDL에서 concurrent구문은 좀 다르다.
프로그래밍 언어에서,
1: if ( Sel==0 ) |
6번 라인의 실행 순서가 매우 중요하다. E 값이 결정되기 위해서 미리 if~else 구문이 먼저 실행되어 변수 D값을 정해주어야(assign)
한다. 이번에는 프로그래밍 언어의 객체들, 간단히 말해서 변수들의 의미를 살펴보자. 순차 처리하는 프로그래밍 언어에서 변수는
시간이 지난 후에 새로운 assign이 있을때 까지 정해진 값을 "유지"하고 있다. 이는 변수들이 "메모리" 라는 sequential 회로에
"저장"되어 있음을 뜻한다. 위의 내용이 실행 될때 소요되는 시간을 보면 2-step이 필요하다. 이를 간단하게
PMS(Processor-Memory-Switch)의 관계로 나타내보면 그림 1과 같다.
그림 1. PMS (Processor-Memory-Switch) 모델에서의 순차구문 실핼
이번에는 전용의 하드웨어로 구성한다고 하자. 그림2와 같은 회로가 될것이다.
그림 2. VHDL 병렬구문(Concurrent statement)의 예
VHDL의 병렬 구문(concurrent statements)으로 기술하면 다음과 같다.
1: D <= A when Sel='0' else B; |
위의 구문을 netlist형태로 보고 객체들인 A, B, C, D, E 를 "signal name"으로 이해 하기로 하자. 즉 메모리에 "저장된" 변수가 아닌
단순한 "연결선"(wire)의 이름이다. 병렬구문 1과 2의 순서가 바뀐다고 해서 문제 될것이 없다. "입력신호" (Signal) A, B, C가 MUX와
ADDER를 통과 하면서 발생하는 약간의 지연이 있겠지만 입력에서 출력까지 "동시"에 이루어진다. 이와 같이 HDL은 concurrent
문으로 이루어 진다. 또한 객체들은 프로그래밍 언어의 변수들과는 의미가 다르다. HDL의 객체들은 SIGNAL의 이름일 뿐이며
이들 Signal의 관계를 기술하는 방법에 따라 Flip-Flop과 같은 sequential 회로를 묘사(Modeling)할수 있다. 순차회로를 기술하기 위해서
VHDL의 순차구문 블럭(process block)에 F/F를 표현하면 다음과같다. 이를 디지탈 회로로 나타내면 그림 3과 같다.
1: MUX_OUT <= A when Sel='0' else B; |
이경우에도 역시 객체 A, B, C, D, E, MUX_OUT은 배선의 이름(signal name)일 뿐이다. 다만 MUX_OUT과 D의 관계를 기술하는
부분에서 "else"가 없는 "if~end if" 가 Rising-Edge trigger의 D-F/F를 묘사한 것이다. 순차구문 블럭은 1개의 병렬 구문으로 간주된다.
이때 구문 1,2,3의 순서는 의미가 없다.
위의 간단한 예를 통해서 본것과 같이 VHDL을 이용해서 디지탈 회로를 표현할 때에는 구문 형태의 의미를 정확하게 파악 하여야
원하는 적절한 회로를 얻을수 있다. VHDL을 이용해서 디지탈 회로의 요소(primitives)들을 표현하는 방법에 대해서는
"합성가능VHDL"의 기술에서 자세히 살펴 보도록 하겠다.
그림 3. VHDL 순차구문의 예
2. "아이디어"에서 "실제회로" 까지.....
설계자의 머리속에 있는 "아이디어"로부터 실제회로를 만드는 과정을 보면 다음과 같이 몇가지 단계를 거치게 된다.
"아이디어" ---> (회로의)표현 ---> 시뮬레이션 ---> "실제 회로"
회로의 표현 단계에서 스케마틱을 이용하건 HDL을 이용하건 설계자의 취향이다. 간단한 회로나 이미 기능이 정해진 CPU, Memory, Gate등을 이용해서 보드 설계를 할경우 굳이 시뮬레이션 할필요도 없고 이를 시뮬레이션 해주는 캐드들도 없다. 다만 보드를 완성하기 위해서 PCB를 만들기 위해서 캐드를 사용할 뿐이다. 이때 캐드 툴들은 회로의 네트리스트와 설계된 Layout과의 비교를 수행하여 un-route된것이 없는지 검사해주는 중요한 역활을 한다.
그러나 CPU와 같이 복잡한 기능을 수행하는 회로를 설계 한다고 생각해 보자. 내가 그린(또는 표현한 또는 기술한)회로가 생각대로 잘 움직여 줄 것이라고 믿고 실제 제작에 들어가자. 만일 제대로 작동하지 않는다면? 회로를 만드느라 든 비용과 수고가 모두 허사가 되어 버린다. 실제로 제작하기 전에 충분한 검증이 이루어지지 않으면 않되며 반드시 충분한 시뮬레이션이 필요하다. 시뮬레이션의 단계는 크게 3가지로 나누어 생각할수 있다.
첫째, 알고리즘 단계에서의 시뮬레이션 (algorithmic simulation)이다. 이는 사람머리 속의 복잡한 생각을 단계별로 적절하게 정리한후 이 처리절차(Procedure)가 올바른지 논리상의 오류는 없는지 확인해 보는 단계라 하겠다. 이 과정에서 쉽게 사용할 수 있는 "도구"가 바로 C 와 같은 프로그래밍 언어이다. 만일 PMS 모델에서 "아이디어"를 처리 한다면 이것으로 만족할 수 있다. 그러나 "아이디어"를 하드웨어로 설계하고자 한다면 알고리즘을 잘 분석하여 조합회로, 순차회로, 혹은 기능부분으로 적절히 분할한 후 이에 맞게 VHDL을 이용하여 기술할 수 있다. VHDL은 하드웨어뿐만 아니라 프로그래밍 언어로서의 기능도 지원한다. 단적으로 VHDL을 완전한 프로그래밍 언어라고 말하는 사람도 있다. 실제로 VHDL에서 선언할 수 있는 객체형(object types)은 bit 뿐만 아니라 char, real, integer 등도 지원하며 사용자 정의형도 얼마든지 선언하여 사용할 수 있고 화일 입출력도 지원한다.
둘째, 하드웨어 기능수준 단계에서의 시뮬레이션(Functional Simulation)이다. 알고리즘 단계에서의 기술은 실제 하드웨어와는 상당한 차이가 있다. 알고리즘 단계는 "아이디어"에 대한 체계적인 처리 절차를 구체화 하는 단계라 한다면 기능 수준은 실제 하드웨어의 요구와 이에대한 구체적인 설계단계라 할수 있다. 어떤 "아이디어"를 하드웨어로 옮기려는 이유는 무엇 보다도 실시간 처리라는 고속의 요구에 대응하고자 함일 것이다. 이를 위하여 무작정 회로를 만들수는 없다. 하드웨어의 전체적인 크기, 다른 회로와의 인터페이스를 위한 타이밍 요구등을 고려 해야한다. 처리속도와 하드웨어의 크기에는 서로 밀접한 관계가 있으므로 타협점이 필요하며 다른 회로와의 인터페이스 타이밍도 잘 고려해야 한다. 아무리 좋은 하드웨어라 해도 입출력을 적절히 주고받을 대책이 없다면 아무 쓸모가 없을 것이다. 모든 하드웨어의 데이타 쉬트(data-sheet)를 보면 반드시 타이밍도가 있지 않은가!
기능수준의 설계의 한 예로서 "c = a + b"의 계산을 생각해보자. 알고리즘 단계에서 a, b, c 모두 정수인경우 다음과 같이 나타낼수
있다.
signal a, b, c : integer; |
그러나 하드웨어로 설계할 때에는 알고리즘을 분석하여 입력되는 a, b의 숫자범위에 따라 몇비트 짜리로 연산 장치를 만들 것인지
결정해야 한다. 예를들어 a 와 b의 입력범위가 0~255 (00000000~11111111) 라면 8비트 가산기를 사용하면 된다. 그러나 b 의 주된
범위가 0~240 (00000000~11110000) 이면 8비트 가산기를 만드는것은 불합리하다.
그림 4. 연산 범위가 다른 연산기의 최적 설계 방법의 예
LSB의 4개 비트는 연산되지 않으므로, 4비트 가산기로서 MSB에만 적용하면 된다. 이렇게 회로가 만들어 지고나면 나중에 변경이 불가능하다. 만일 b의 입력 범위가 설계시 예측한 대로 240보다 작은 값이 발생할 가능성이 있는 경우 그결과 전체적인 결과에 대한 정확도를 반드시 검증해 보아야 할것이다. 실제로 이러한 문제는 신호처리 시스템 설계시 빈번히 발생하는 문제이다. 하드웨어의 최적화와 알고리즘의 정확성에 대한 문제인 것이다.
셋째, 합성(synthesis)후 시뮬레이션이다(Post-Simulation). 합성(synthesis)이란 HDL 언어로서 기술한 하드웨어를 실제 논리 소자들의 네트리스트로 바꾸는 과정이라 할수 있다. 이때 물론 논리 최적화(logic optimize)가 수행되는 것은 물론이다. 이러한 논리 합성/논리 최적화 과정이 자동 라우팅(Auto-Routing)과 함께 설계자동화(DA:Design-Automation)의 주요한 부분이라 하겠다. 합성기(synthesizer)을 거치게 되면 네트-리스트가 생성 되는데 모든 HDL 구문들이 합성기를 거쳐서 네트-리스트로 만들어 지진 않는다. 소위 말하는 "합성가능한" 형태로 기술 되어야 한다. VHDL의 경우 integer나 real등을 직접 합성해내지 못하며 연산중 나눗셈은 합성하지 못한다. 합성 가능한 VHDL (Sybthesizable VHDL)은 IEEE에서 std_logic_1164와 std_logic_signed, std_logic_unsigned로 규정되어 있고 현재 대부분 합성기들이 이를 지원하고 있다.
합성기는 목표로 하는 하드웨어의 라이브러리에 의거하여 네트-리스트를 생성한다. 예를 들어 8입력 AND 를 기술 한다고 하자.
and_out <= a AND b AND c AND d AND e AND f AND g AND h;
합성기는 이 구문을 네트-리스트로 생성하기 위해서 제공되는 라이브러리(library)를 참조한다. 라이브러리(library)는 하드웨어 제작사에서 제공하는 것으로 사용할 수 있는 기본 쎌들을 모아놓은 것(cell library)이다. 만일 A사의경우 8입력 NAND와 NOT 게이트를 제공 한다면 그림5(a)와 같이 되겠지만, 5입력 NAND 만을 제공하는 B사에 제작을 의뢰할 경우 그림 5(b)와 같은 회로로 합성할 것이다. 반도체 제작사들은 더많은 종류의 라이브러리를 제공할수 있도록 노력하고 있다.
라이브러리는 쎌들의 논리적인 기능뿐만 아니라 팬-인,팬-아웃에 대한 특성과 지연등의 정보를 가지고 있고 같은 기능을 하더라도 출력의 구동(driving)능력에 따라 여러가지 종류를 갖는다. 그러나 합성에 의하여 얻어진 네트리스트는 회로의 논리적인 면을 주로 나타낸다. 따라서 네트리스트를 이용한 팬-인(Fan-In), 팬-아웃(Fan-Out)의 검증(verify)이 반드시 필요하며, 지연(delay)등에 대한 검증이 필요하다. 실제로 합성에 의하여 얻어진 네트리스트를 이용해서 팬-인, 팬-아웃 검증을 해보면 에러가 안나는 경우는 없다. 이때 에러 리스트를 보면서 네트리스트를 수정하게 된다. 이러한 네트리스트의 수정은 수고스럽긴 하지만 의외로 단순한 작업이다. 라이브러리의 데이타 쉬트를 보면서 등가 기능의 쎌중 구동 능력이 높은 것으로 쎌을 바꿔 주거나 임의로 버퍼를 추가시킨다.
일단 네트리스트가 만들어지면 제대로 합성이 되었는지, 설계사양의 속도에 맞는지 시뮬레이션 해본다. HDL로부터 논리최적화(logic optimization)등을 거쳐 네트리스트를 생성하는 합성기(synthesizer)도 소프트웨어 프로그램이다. 꼭 합성기의 성능이 못 미더운건 아니지만 제대로된 네트리스트가 나왔는지 검증해볼 필요가 있다. 네트리스트는 실제 사용된 쎌들의 연결이므로 시간 시뮬레이션이 가능하다. 이때 각 라이브러리 쎌의 지연 정보가 이용된다. 비록 기능은 정확하다 해도 지연에 의한 오동작이 발생할수 있다. 이러한 오동작이 지나치게 긴 critical-path로 인한 것이면 설계의 전면적인 수정이 필요할지 모른다. critical-path란 레지스터와 레지스터 사이의 조합논리 회로중 가장 길게 연이어져 있는 게이트들의 수를 뜻한다. 이 critical-path가 전체 회로의 속도를 결정짖게 된다. 이러한 에러를 가능한 줄이기 위해서는 HDL로 처음 코딩할때 적절한 분할과 합성 옵션의 적용이 필요하다. 이와 같은 과정의 시뮬레이션은 Pre-Route (Pre-Layout) 시뮬레이션이라 한다. Pre-Route 시뮬레이션은 쎌 자체의 동작 지연만을 고려한 것이며 칩위에 쎌들을 배치하고 이들간의 라우팅(P&R : Placement and Route)이 끝나면 배선 지연들을 고려한 시뮬레이션이 필요한데 이를 Post-Route (Post-Layout) 시뮬레이션이라 한다. 이러한 일련의 검증 과정이 완료된 후에 비로서 실제 하드웨어의 제작에 들어간다. 칩 제작을 위해서는 P&R 결과로부터 Layout Generation으로 쎌의 위치와 배선 레이아웃을 얻고 여기에 쎌의 레이아웃을 merge 하여 완전한 레이아웃이 공정에 주어진다. ASIC의 경우 이러한 일련의 과정을 거치지 않으면 공정에서 받아주지 않으며 시뮬레이션 조건도 매우 까다롭다. 공정사에서는 라이브러리를 제공하고 받아들일 수 있는 테스트 조건을 제시한다. 동작에 대한 내용에는 관심이 없으며 이들이 참고하는 조건이란 충분히 테스트가 되었는지의 여부이다. 설계자는 입력 패턴(input stimuli, test vector)을 제출하고 이를 토대로 입출력신호의 확인은 물론, Post-Simulation을 하고나면 회로내의 모든 게이트에 입력신호를 주어 졌는가에 대한 정보를 얻어서 공정에 받아들일 것인지 결정한다. 불충분한 테스트 입력으로 인한 오동작은 누가 책임질 것인가? 테스트 과정은 매우 중요하므로 이에 대한 전략수립이 필요하고 테스트가 용이하도록 설계하는 것도 중요한 문제이다. 테스트에 대한 내용은 다음에 또 자세히 다루기로 한다.
그림 5. 합성 라이브러리에 따른 네트리스트의 변화
시뮬레이션 과정을 통하여 살펴본 것과 같이 "아이디어"에서 하드웨어의 제작과정을 보면 Front-End(FE)와 Back-End(BE)로 크게 두가지 부분으로 나누어 말한다. 알고리즘을 구상하고 설계하는 과정(Design Entry), 합성(합성을 "게이트 매핑"-Gate Mapping-이라고 하기도 한다.)과 시뮬레이션, Pre-Layout 시뮬레이션을 FE라 하고, P & R 과 Post-Layout, DRC, Layout Pattern Generation을 BE 라고한다. 사실 FE와 FE를 구분 짖는것은 모호하다. 요즘들어 설계자동화가 상당히 발전한 만큼 설계자는 BE의 많은 부분까지 작업을 수행한다.
ASIC의 경우 말그대로 "맨땅에 헤딩하기"라 할 수 있다. 아무것도 없는 빈종이에 설계와 배치,배선, 검증을 수행하여야 한다. 특히 배치와 배선은 대단한 노력과 시간이 소요된다. 그러나 CPLD/FPGA의 경우 모든 요소들은 블럭단위로 배치되어 있고 이들 사이의 라우팅을 위한 배선 방법이 이미 결정되어 있는 형태로 제공된다. 설계자는 VHDL로 기술한후 합성과정을 거쳐 네트리스트가지고 P&R (배치와 배선)을 수행하면 된다. P&R 과정도 이미 그 방법이 정해져 있으므로 툴을 사용하여 처리한다. ASIC과 같이 설계의 자유도는 떨어지지만 "아침에 설계해서 저녁에 칩을 내손에.." 라는 구호대로 단시일 내에 커스텀 칩을 구현할 수 있다.
그림 6은 "아이디어"에서 "칩을 내손에..." 까지의 일련의 과정을 보여준다. VHDL은 알고리즘에서 기능 시뮬레에션을 포함한 전단계(Front-End)설계 과정과 후단계(Back-End) 시뮬레이션까지 이용될 수 있는 매우 강력한 도구이다. 칩을 제작하기 까지 일관된 하나의 도구로 처리할 수 있다는 것은 경제적으로나 시간적으로도 큰 장점이라 하겠다.
그림 6. VHDL을 이용한 PLD (CPLD/FPGA)의 설계과정
3. 왜 HDL을 사용하는가?
반도체 산업의 발달로 단일 칩안에 집적시킬수 있는 디자인 크기가 엄청나게 커졌다는 점이다. 이에따라 이전에 범용 프로세서로 소프트웨어에 의하여 처리되던 어지간한 계산들이 하드웨어로 만들어질수 있게 되었다. 수천 수만개의 게이트에 이르는 설계를 일일이 스케마틱 툴로 그려낼수 있을까? 시뮬레이션 중에 회로의 수정이 쉽게 이루어질 수 있을까? 소프트웨어로 처리되던 복잡한 계산을 쉽게 하드웨어적인 표현으로 구현해낼 수 있을까? 시뮬레이션에서 에러가 나면 설계를 용이하게 잘못된 부분을 찾아낼 수 있을까? 불가능이란 없다. 시간만 충분 하다면! 그러나 시장은 제품이 나올때 까지 기다려주지 않는다는 점을 잊지말아야 한다 (Time-To-Market). 성능이 좀 뒤져도 먼저 시장을 선점한 제품의 기득권은 무시할 수 없다는것은 익히 알고 있는 사실 아닌가?
1) HDL을 사용하면 "아이디어"를 쉽게 표현할수 있다.
HDL은 마치 프로그래밍 언어와 같은 성격을 포함한 하드웨어를 위한 언어이다. 따라서 일고리즘의 표현이 매우 용이하다. VHDL을 이용하여 알고리즘의 코딩을 시작하는 그 순간부터 하드웨어 설계의 시작인 셈이다. VHDL이 프로그래밍 언어적인 기능을 가지고 있다는 점이 이를 이용하여 설계할때 주의가 필요하긴 하지만 어쨌거나 아이디어를 하드웨어로 옮기기 위한 쉽고 빠른 방법이다.
2) HDL을 사용하면 "설계의 관리"가 용이하다.
HDL은 수정과 디버깅을 용이하게 하여 설계의 관리가 용이하다. 설계의 수정은 소프트웨어 프로그램에서 하듯이 "몇줄" 고치면 그만이다. 스케마틱으로 설계시 다룰수 있는 하드웨어 크기는 5,000에서 10,000게이트 정도가 한계점 이라고 한다. 또한 "아이디어"에서 네트리스트, 지연모델등 실제회로에 이르기까지 모든 수준의 기술 방법과 시뮬레이션을 지원 한다. 프로그래밍 언어와 같이 소스 디버거를 이용하면 잘못된 부분을 쉽게 찾아낼 수 있다. 이는 VHDL에서 회로의 표현이 매우 다양함을 의미한다. 최근 FPGA 벤더들은 1만에서 10만 게이트급의 소자들이 앞다투어 개발, 발표하고 있는 실정이다.
3) HDL을 사용하면 "설계 툴과 공정 기술"에 구애받지 않는다.
C 프로그래밍 언어를 이용하면 어느회사의 컴파일러를 이용하든 상관 없듯이 잘 짜여진 VHDL은 특정의 툴과 공정에 구애받지 않는다. VHDL이나 Verilog는 거의 표준화되어 있기 때문이다. 공정기술이 바뀌고 제공되는 라이브러리가 다르고 사용하는 툴이 다르더라도 설계를 다시 시작할 필요가 없다. 단지 컴파일/합성만 다시하면 된다.
그러나 HDL이 만능은 아니다. 아직 아날로그회로의 모델링은 가능하지만 이의 합성은 거의 불가능하다고 생각된다. 디지탈 회로라 해도 합성의 수준이 제한되어 있고 합성툴에 대한 기준이 명확하지 않아서 설계자는 HDL 코딩에 상당한 주의가 필요하다. HDL LRM(Language Reference Manual)은 HDL 구문에 대한 규정이며 곧바로 하드웨어 모델을 규정한것이 아니다. 그 예로서,
process(clk,d) |
위와 같은 경우 문법적인 오류는 없으며 Function Simulation의 결과는 다음과 같다. 언어적인 기능은 가능하지만 합성은 않된다. 위의
예를 하드웨어로 상상할수 있을까? 합성기의 특성을 잘 파악한후 에에 맞는 적절한 기술능력이 단시일내에 이루어지는것은
아니겠지만 VHDL에 의한설계의 관건이라 하겠다. 위의 VHDL 모델은 기능 시뮬레이션 한 결과는 그림7과 같다. MUX도 아니고
F/F도 아니다!
그림 7. 합성 불가능한 VHDL코드의 예
4. VHDL 이란?
"VHDL이란 무었입니까?"
아마도 가장 많은 질문중에 하나이다. VHDL은 HDL의 한 종류이다. VHDL 이란 VHSIC HDL (Veri-high speed integrated-circuit Hardware Description Language)의 약자이다. VHDL은 80년대초 미국 국방성의 VHSIC 프로그램의 산물이다. 디지탈 집적회로의 설계규모가 방대해지고 각 회사마다 서로다른 설계툴과 설계방법을 가지고 있는 상황에서 집적회로의 표현에 표준화된 기술언어가 필요해졌다. 이에따라 탄생한 것이 VHDL이고 IEEE에서 87년에 표준화 시킨것이 IEEE1076-87로 규정된 VHDL이며 5년후 92년에 수정되어 93년에 표준화 된것이 IEEE1076-93 이다.
VHDL과 관련한 표준은 IEEE 1076이며 산하 연구그룹으로 다음과같은 것들이 있다.
IEEE 1076.1 : VHDL Analog extension
IEEE 1076.2 : Math Package
IEEE 1076.3 : Synthesis Package (std_logic_1164)
IEEE 1076.4 : Timing Methodology (VITAL)
IEEE 1076.5 : utility
IEEE P1165 : EDIF
EIA-567-A : Component modeling and Interface
요즘 VHDL의 동향을 보고 싶으면 VIUF (VHDL International User Group)의 홈페이지에 가보면 볼거리가 많이 있다. 이곳에는 전세계의 거의 모든 VHDL 관련 홈페이지가 링크되어 있다. 홈페이지와 ftp 의 주소는,
5. VHDL을 시작하려면?
VHDL을 시작하려면 VHDL Simulator/Synthesizer툴이 필요하다. 대부분 VHDL Simulator/Synthesizer 툴들이 아직 워크스테이션용이 많고 PC용은 그리 흔하지 않다. 이는 아마도 이런 툴들이 워낙 많은 계산과 메모리를 요구하기 때문일 것이다. 그러나 요즘같이 PC의 성능이 월등해지고 있는 추세에서 VHDL Simulator와 PLD/CPLD/FPGA 용 합성툴들은 PC용으로 많이 나오고 있다. VHDL Simulation과 PLD/CPLD/FPGA를 목표로 합성툴을 사용하려면 펜티엄급의 CPU와 메모리는 32Mbyte정도가 최저 사양이 될것이다. VHDL을 이용해서 설계를 시작하려면 다음과 같은 툴을 구비 하여야 한다.
1) C Compiler
2) VHDL Function Simulator
3) FPGA Tool
C 컴파일러는 시뮬레이션 테스트 벡터의 생성, 알고리즘 테스트, 각종 화일 포맷 변환, VHDL 소스생성 등에 필요하다. 요즘은 시스템 설계까지 확장되는 것이 일반적이므로 C 언어 프로그래밍을 포함한 한두 종류의 프로그래밍 언어를 능숙하게 사용할수 있어야 한다. 이외에도 FPGA를 Program하려면 FPGA Writer/Programmer 라는 장비가 필요한데 이것도 각 Vendor 사마다 전용 장비가 있다. 시중에는 범용의 ROM Writer에 어댑터를 부착하여 사용할수 있는 제품이 있으며 요즘은 ISP device들이 많이 나오고 있어서 특별한 잘비 없이 간단한 케이블을 자작하여 사용할수 있다. 이들 케이블은 프린터 포트나 시리얼 포트에 연결하여 CPLD/FPGA에 프로그램해 넣는다. 케이블의 결선은 각 벤더사마다 다르므로 해당 툴의 메뉴얼을 참고하거나 홈페이지에 가면 문서들이 공개되어 있다.
6. CPLD/FPGA 구조와 프로그래밍
CPLD/FPGA 프로그래밍은 보통 ROM에 프로그램을 기록(ROM Write)하는 것과 같다. 다만 FPGA의 내부구조가 단순하지 않으며 핀의 배치와 프로그램 하는 방식이 ROM과 같이 표준화 되어 있지 않으므로 각사별 전용의 프로그램 기록장비(CPLS/FPGA Programmer)가 필요하다. 대부분의 CPLD/FPGA들이 소거와 기록이 가능한 것 들로서 UV-EPROM, EEPROM, Flash ROM등이 있고 저가형으로는 1회의 프로그램이 가능한 OTP (One-Time-Program)타입도 있고 큰 용량의 FPGA들 중에는 SRAM 타입도 있다.
그림8은 FPGA의 일반적인 내부구조 모습이다. 로직 블럭(이는 회사 마다 형태에 따라 부르는 이름이 다르다.)이 배열되어 있고 이들 사이로 종횡으로 금속 선들이 누비고 있는 형태이다. 금속 선들이 교차하는 부분과 로직 블럭의 입출력 선들과 교차하는 부분에 접촉(Junction)을 해 넣으므로서 회로를 완성하게 된다. 로직 블럭의 구조는 회사마다 다양하며 이들의 부르는 이름도 가지각색이다. 효율적인 구조의 로직 블럭의 설계, 접촉 부분(Junction)의 저항값 그리고 이를 바탕으로한 P&R 툴의 기능이 FPGA 자체의 성능을 좌우 한다고 하겠다.
로직 블럭은 몇개의 게이트들과 멀티플렉서 그리고 플립플롭으로 구성되어 있다. 따라서 ROM이나 RAM 같이 단순 메모리 쎌의 반복 구조를 같는 설계나 조합회로만의 설계에는 아주 부적합다고 할수 있다. (최근에 나오고 있는 FPGA의 내부 구조를 보면 이러한 단점을 감안하여 특별히 ROM 영역을 만들어 넣은 것들도 있다.) FPGA의 또다른 단점으로는 Data-Path 구조에 부적절 하다는 점이다. Data-Path 구조란 16-비트 연산기, 32-비트 레지스터와 같이 한가지 기능이 다수 비트로 묵여져 있는 것을 말한다. FPGA의 이러한 단점을 극복하기 위한 연구와 개발이 활발하게 이루어지고 있고 새로운 제품들이 나오고 있다. 이미 구조가 결정되어 배치가된 상태에서 금속선만의 접속으로 회로를 완성시키는 FPGA에서는 Tri-State 는 있을 수 없다. 다만 입출력 패드에만 존재한다.
FPGA의 이러한 단점에도 불구하고 널리 이용되는 이유는 구조의 꾸준한 개발로 대규모 고집적, 고속 소자들이 속속 발표 되고 있으며 고정된 구조라는 점이 오히려 전용 칩의 개발을 용이하게 만들고 있다는 점이다. HDL을 이용한 합성이 용이하며 P&R 작업이 ASIC에 비하여 엄청나게 단순하므로 전단계 설계(Front-End), 후단계 설계(Back-End)의 구분없이 설계의 자동화가 쉽게 이루어질 수 있게 되었다. 결국 소규모 인력으로 대규모 회로 집적화가 몇개월의 기간에서 몇주의 기간으로 단축되었다. FPGA를 이용한 DSP응용 설계, 각종 컨트롤러, State-Machine류의 설계가 활발하다.
최근 각광을 받고 있는 ISP (In-System-Programability)의 개념은 "보드 설계와 칩설계를 동시에..."라는 캐치 플레이스 아래 패키지 조차 QFP(Quad Flat Pack)나 BGA(Ball-Grid-Array)로 생산 되고 있다. 기존의 FPGA의 경우 DIP 혹은 PLCC 로 생산되어 사용 가능한 입출력 핀의 수가 제한 되어 있어서 칩의 고집적 화에 대응하지 못하고 있었다. 이는 FPGA의 프로그램시 상대적으로 동작 전압에 비하여 고 전압이 필요하여 특별한 기록 장치 (FPGA Writer/Programmer)가 요구 되었으므로 다룰 수 있는 핀의 물리적인 크기가 제한 될수 박에 없었기 때문이다. 이경우 제한된 입출력 핀의 효과적인 사용을 위해서는 설계가 완료 될때 까지 배치를 고정 시키는 것은 불가능 하게 된다. ISP 소자들은 동작 전압에서 프로그래밍이 가능 하도록 제작 되었고 프로그램 방법도 개선 돼어 특별한 프로그램 장비 없이 케이블 만으로 시리얼 다운 로드에 의해 프로그래밍이 가능 해졌다. 따라서 풍부한 입출력 핀이 사용 가능함에 따라 다양한 기능을 집적해 넣을수 있고 핀 배치도 적절한 예측만 이루어 진다면 핀 고정이 가능 하므로 보드 상에 실장한후 개발을 계속 할수 있으므로 칩 설계 뿐만 아니라 시스템 설계기간도 단축할수 있다.
SRAM 방식의 FPGA는 배선 방식에 있어서 실제로 물리적인 접촉부(Junction)을 만드는 대신 FET와 1비트 SRAM 쎌을 이용한다. 설계 방식은 ISP와 동일하게 시리얼 케이블을 이용하게 된다. 보드에 실장 할 때에는 보드전원의 OFF시 프로그램 정보를 잃게 되므로 시리얼 롬을 부착하거나 타겟 보드에 장착된 MPU등에서 시스템 부트시 다운로드 해야 한다. SRAM 방식 FPGA 에 부착하는 시리얼 롬을 Configuration ROM이라 하며 시리얼 롬 대신 8-비트 패럴렐 롬을 부착할 수도 있다.
그림 8. FPGA의 내부구조
7. PC용 VHDL Simulator와 CPLD/FPGA 합성기 소개
PC용 VHDL Simulator로는 Model Tech사의 V-System VHDL/PC가 가장 월등하며 이 툴은 Mentor툴의 시뮬레이터와 같은 제품이다. Model Tech.의 홈페이지는,
이외에도 몇가지 Simulator가 있는데 PC용 평가판을 쉽게 구할수 있는 것으로는 우리나라의 서두로직 MyVHDL과 Accolade DA사의 PeakVHDL/FPGA이 있다. 이들 두회사의 홈페이지에서 다운 받을수 있는데 주소는,
서두로직의 MyVHDL은 평가판으로 제한은 없으나 MicroSoft Visual C/C++ 4.0이 있어야 하며 아직 VHDL subset인 듯 하다. PeakVHDL은 IEEE 1076-87과 93을 모두 지원하고 VITAL은 아직 지원하지 않는다. 평가판은 VHDL 소스의 크기와 화일갯수에 제약이 있어서 아주 작은 규모의 시뮬레이션만 가능하다. 그러나 이 회사에 E-Mail을 보내면 데모용 라이센스 코드를 보내주는데 이코드는 날자 이외에 다른 제한은 없다. PeakVHDL/FPGA는 Metamore사의 FPGA 합성기가 포함되어 있는데 VHDL을 합성하여 네트리스트를 생성한다. 이들 네트리스트를 이용하여 각 FPGA 벤더의 P&R 툴을 이용하여 Back-End 작업을 할수 있다. 이 합성기는 Actel, Altera, Xillinx, Lattice 의 PLD/FPGA를 지원한다.
FPGA 벤더(FPGA 제작사)툴이 필요한 이유는 각 회사마다 FPGA의 기본 로직 셀 블럭 구조가 다르고 이들이 이미 배치가 되어 있는 상태이며 설계자는 다만 이들 사이의 라우팅 만으로 설계를 완료하기 때문이다. 대부분 벤더 툴들도 자체적으로 VHDL 합성기능을 가지고 있지만 그성능이 뒤지는 경우도 있고 VHDL subset인경우가 많다. 따라서 합성에 의한 네트리스트의 생성은 전문회사의 외부툴을 사용하고 Back-End 작업인 Routing만 벤더 툴을 사용하는것이 바람직하다고 하겠다.
FPGA 벤더 툴은 각사의 홈페이지에 가면 정보를 얻을수 있다. 벤더 툴의 가격도 만만치 않은데 몇몇 회사의경우 평가판이 공개되어 있으므로 이를 잘 이용하면 VHDL을 시작하는 입장에서 매우 유용하게 쓸수 있을 것이다. PLD/CPLD/FPGA 툴에 대한 정보는 다음의 홈 페이지에 벤더사들과 VHDL 합성기, 시뮬레이터 제작사의 주소가 모두 링크되어 있으므로 참고한다.
벤더사의 홈페이지는 다음과 같다.
1) Altera MaxPlusII
Altera MaxPlusII는 현재 8.0버젼까지 나와 있으며 평가판(ES Lisence)이 하이텔 디지탈 동호회에 등록되어 있다. VHDL subset이긴 하지만 합성기가 들어 있으며 합성후 시뮬레이션도 가능하다. P&R후 VHDL Netlist를 생성할수 있으며 VITAL을 지원한다. FPGA 설계 툴로서 매우 우수하다.
2) AMD Mach Seriese
AMD의 PLD 부분이 Vantis로 독립되어 있다. AMD의 툴은 MachXL로서 2.1을 Vantis FTP에서 무료로 다운 받아 쓸수 있다.이 버젼은 Abel 만 가능하며 VHDL을 합성한후 얻어진 네트리스트를 이용하려면 5.x 이상이필요하다.
3) Cypress Warp2/3
Cypress CPLD/FPGA 툴은 Warp2/3로서 합성기를 가지고있다. Warp2는 Cypress PLD의 경우 JEDEC 화일로 시뮬레이션이 가능하다. Warp2 R4.1은 아주 저렴한 가격으로 구입할수 있다. Warp3에는 ViewLogic툴이 들어 있다. FPGA의 경우 EDIF형식을 입력받아 P&R한다.
4) Xilinx XACT
XACT는 VHDL툴로서 ActiveCAD사의 시뮬레이터와 Metamor의 합성기를 포함한 Foundation Seriese가 발매되고 있다.
5) QuickLogic QuickWorks
QuickWorks 는 Sinplify 합성기를 사용하여 VHDL/Verilog를 합성한다. 시뮬레이터는 Verilog 시뮬레이터(Silos III)와 DataI/O의 SCS 툴이 포함되어 있는데 스케마틱 에디터로서 VHDL 소스 생성기능이 있다. 현재 버젼 6.1의 Evluation이 가능하다. VITAL을 지원한다.
6) Actel
Actel은 최근 자사 툴 Actel Lite 3.1.1을 무료로 공개하고 있는데 VHDL 합성기와 P&R툴을 포함하고 있으며 8,000게이트급 까지 가능하다고 한다. 시뮬레이터는 내장되어 있지 않지만 V-System같은 다른 시뮬레이터와 인터페이스하여 사용할수 있다. VITAL을 지원한다.
7) Lattice
ViewLogic툴을 이용하여 시뮬레이션과 합성 한다.
mailto:goodkook@csvlsi.kyunghee.ac.kr
CSA & VLSI Design Lab. Kyunghee Univ