1
VHDL 의 개요
김 인 수
2
VHDL 이란 ?VHDL(VHSIC Hardware Description Language)
1981 년에 제안 , IEEE1076-1987,1993, 2000, 2002 표준동작수준모델에서 게이트수준모델을 표현
주로 RTL(register-transfer level) 설계에 사용됨(IEEE1076.6-2004, VHDL RTL synthesis std.)
Behavioral design : Algorithms
RTL design : MUX, ALU, FSM, …
Logic design : AND/OR gates, F/Fs
Circuit design : Transistors, …
Layout design : Polygons
3
VLSI 설계플로우 (Design Flow)
Cell Library
Simulation
RTL design
Gate-level netlist
Chip layout
Design productivity ↑Design quality ↑
4
RTL(Register-Transfer Level) 설계
디지털회로를 설계하는 방식중의 하나하드웨어 레지스터와 산술논리연산 ( 조합 ) 회로 간의 데이터흐름으로 정의됨공정에 독립적인 모델 (technology-independent model)논리합성도구에 의해 게이트레벨 네트리스트로 추출됨
특정 공정 셀라이브러리 (cell library) 와 설계제약조건 (design constraint) 이 필요
주로 VHDL, Verilog-HDL 이 사용됨
5
Simulation vs. Synthesis모의 (simulation)
논리합성 (synthesis)
6
본 강의의 목적
RTL 에서 동시성 (concurrency) 이해논리합성을 위한 RTL 설계VHDL 을 이용한 RTL 설계
실습에서 사용되는 VHDL 의 자세한 문법은 각 이론강의에서 review
7
VHDL 의 기본구조 (1)Entity-Architecture
VHDL 기능블록 ( 모듈 ) 을 기술하기 위해서 모든 입력 신호와 출력신호를 Entity 안에 선언해야 한다 .Architecture 의 정의부 안에 기능블록의 내부연산을 정의
Ex) Library IEEE; use IEEE.std_logic_1164.all;
entity decoder isport( data_in : in std_logic_vector(1 downto 0) ; dec_out : out std_logic_vector(2 downto 0));
end; architecture behave of decoder is begin process(data_in) begin
case data_in is ....... end behave ;
입출력 신호선언
모듈 동작 설계
decoderdata_in
dec_out2 3
8
VHDL 의 기본구조 (2)
Entity 의 구조각 entity 선언은 인터페이스 신호들을 포함하고 있고 , 이들은 다른 모듈과 연결을 제공한다 .
여러 entity-architecture 구조쌍은 한 파일에 모두 위치할 수 있고 , 각각의 파일에 위치할 수도 있다 .Entity 이름과 파일 이름이 꼭 동일할 필요는 없지만 컴파일러에 따라 오류를 내보내기도 한다 .하나의 entity 는 여러 개의 architecture 를 가질 수 있다 .
Configuration 사용하여 architecture 를 선택
Entity 엔티티 _ 이름 is[port( 인터페이스 _ 포트 _ 선언 ) ;]
End [entity] [ 엔티티 _ 이름 ] ;
9
VHDL 의 기본구조 (3)Architecture 의 구조
선언부에서 architecture 안에서 내부적으로 사용할 요소와 신호등을 선언한다 .Architecture 몸체에는 이 모듈의 연산을 지정할 여러 구문들을 작성한다 .
Architecture 구조 _ 이름 of 엔티티 _ 이름 is[ 신호 선언문 리스트 ][ 요소 (component) 선언문 리스트 ][ 함수 선언 및 구현 리스트 ]
Begin구조 본체
End [architecture][ 구조 _ 이름 ] ;
10
VHDL 의 기본구조 (4)하위 모듈은 고유의 Entity-Architecture 쌍을 가지고 있어야 하고 , 상위 블록 (Top module) 에서 하위모듈을 불러서 연결해야 한다 . (Structural description-port map)
Ex.) ALU = {Adder, Multiplier, Divider}
11
Port 포트 선언
Entity 선언 안에 위치하고 인터페이스 신호들이 정의됨
entity mux is port( sel : in std_logic_vector(1 downto 0); data_in : in std_logic_vector(3 downto 0); data_out : out std_logic); end mux;
entity latch is port( clk, rst_n : in std_logic; q : buffer std_logic) ;end;
12
Signal, Constant, Variable (1)신호 (signal), 상수 (constant), 변수 (variable)
신호 (Signal)Architecture 의 begin 전에서 선언되며 선언된 architecture 안에서만 사용될 수 있다 .내부 신호들은 값을 할당받거나 다른 논리회로로 전달 할 수 있다 .신호에 값을 할당하기 위해서 ‘ <=‘ 연산자를 사용한다 .
signal 신호 _ 이름 _ 리스트 : 데이터 _ 형식 [ 지정범위 ][:=초기값 ];
signal internal_sig : std_logic_vector(3 downto 0) := “1111”;
signal internal_sig2 : integer range 0 to 2 := 1;process(temp)begin if temp = ‘1’ then internal_sig <= “0100”; else internal_sig <= “0010”; end if;…
13
Signal, Constant, Variable (2)신호 (signal), 상수 (constant), 변수 (variable)
상수 (Constant)Architecture 와 begin 사이에서 선언 혹은 패키지에서 선언
constant 상수 _ 이름 : 데이터 _ 형식 [ 지정범위 ] := 상수값 ;
변수 (Variable)Process 문과 function 문 안에서 사용되며 , 순차적인 연산을 위한 작업공간을 제공Process 문과 function 문의 begin 전에서 선언되며 할당 연산자로는 ‘ :=‘ 를 사용
Variable 변수 _ 이름 _ 리스트 : 데이터 _ 형식 [ 지정범위 ] := 초기값 ;
constant MAX_LENGTH : integer := 6;constant MAX_VALUE : std_logic_vector(3 downto 0) := “1110”;
14
데이터형 (1)데이터 형 (data type)
VHDL 에서 사용하는 대표적인 데이터 형은 아래 표와 같다 .
데이터 형 값 표기법
Bit 0, 1 ‘ ’std_logic U, X, 0, 1, Z, W, L, H,
- ‘ ’
Integer 지정된 범위의 정수 따옴표 없음
Natural 지정된 범위의 양수 따옴표 없음
Bit_vector Bit 형의 나열 “ “std_logic_vector std_logic 형의 나열 “ “
Time ps, ns, us 등의 시간 따옴표 없음
boolean True 혹은 false 따옴표 없음
15
데이터형 (2)VHDL 에서는 매체에 오직 하나의 값만을 가져야 함
여러 모듈이나 내부 게이트들에서의 출력 신호들이 한 와이어에서 경합하는 경우 아래 신호해석표에 의해서 하나로 결정되어 진다 .
std_logic 의 신호해석표‘U’ ‘X’ ‘0’ ‘1’ ‘Z’ ‘W’ ‘L’ ‘H’ ‘-’
‘U’ ‘U’ ‘U’ ‘U’ ‘U’ ‘U’ ‘U’ ‘U’ ‘U’ ‘U’‘X’ ‘U’ ‘X’ ‘X’ ‘X’ ‘X’ ‘X’ ‘X’ ‘X’ ‘X’‘0’ ‘U’ ‘X’ ‘0’ ‘X’ ‘0’ ‘0’ ‘0’ ‘0’ ‘X’‘1’ ‘U’ ‘X’ ‘X’ ‘1’ ‘1’ ‘1’ ‘1’ ‘1’ ‘X’‘Z’ ‘U’ ‘X’ ‘0’ ‘1’ ‘Z’ ‘W’ ‘L’ ‘H’ ‘X’‘W’ ‘U’ ‘X’ ‘0’ ‘1’ ‘W’ ‘W’ ‘W’ ‘W’ ‘X’‘L’ ‘U’ ‘X’ ‘0’ ‘1’ ‘L’ ‘W’ ‘L’ ‘W’ ‘X’ ‘H’ ‘U’ ‘X’ ‘0’ ‘1’ ‘H’ ‘W’ ‘W’ ‘H’ ‘X’‘-’ ‘U’ ‘X’ ‘X’ ‘X’ ‘X’ ‘X’ ‘X’ ‘X’ ‘X’
16
데이터형 (3)Type 키워드의 사용 예
type 배열 _ 형식 _ 이름 is array 인덱스 _ 범위 of 원소 _ 데이터형식 ;
Ex1) type state_type is (idle, start, pulse, read) ; signal state : state_type ;
Ex2) type short_word is array (0 to 15) of std_logic ; signal data_word : short_word ; signal alt_word : short_word := “0101010101010101” ; constant one_word : short_word := (others=> ‘1’) ;
Ex3) type intvec is array (natural range<>) of integer range 0 to 15;
*초기화는 합성되지 않음 초기화 회로를 따로 설계해야함
17
동시성 (Concurrency)일반적인 S/W
순차적인 방법으로 수행처리 및 결과저장
H/W 설계 (RTL 모델링 )모의 (simulation) 시 동시성 혹은 병렬성을 고려해야함
순차적인 방법으로 병렬성을 흉내냄 (delta 시간 모의 )조합회로와 레지스터 ( 순차회로 ) 의 연결성을 단지 언어로 표현 – 합성가능 /불가능의 경계를 이해
a <= not b ; -- 구문 1c <= not a ; -- 구문 2d <= a or c ; -- 구문 3
조합회로의 표현 ( 구문의 순서가 달라져도 같은 회로를 표현하게됨 )
18
동시성 (Concurrency)VHDL 의 동시문 (concurrent statement)
회로의 동작 및 연결성을 정의하는 구문은 동시문
architecture concur1 of concur is…begin
temp1 <= temp5 xor a1;…process(temp1, temp3, temp4)
begin temp2 <= temp1 or temp3; temp3 <= temp1 or temp4; end process;
… adder1 : adder port map(a1, a2, a3);
…end concur1;
signal assignment( 신호할당문 )
process
port map
19
동시문 - 신호할당신호할당문 ( 동작적 모델링 )
신호 할당문의 형식
신호 _ 이름 <= 표현식 [after 절대지연시간 ] ;
after 는 논리합성 불가능Functional simulation 에서 조합회로의 지연시간은 0대신 , 클럭에 동기되는 시간이 각각 구분됨
신호할당의 목적지는 물리적 /논리적인 와이어 (wire) 를 의미 – 논리합성의 결과에 따라 결정됨
temp1 <= a1 xor a2 xor a3; temp2 <= “0010” when temp1=‘1’ else
“0110”;
조합회로
조합회로
a1
a2
a3
temp1 temp2
0 ns
20
동시문 -process프로세스문 ( 동작적 모델링 )
자체적으로 동시문이지만 내부의 연산들은 순차적으로 실행된다 . functional simulationSensitivity list 에 의해 정해진 신호들이 변할 때에만 실행된다 . functional simulation그러나 , 내부에 신호할당문이 사용되는 경우 역시 병렬성을 갖는다 . 논리합성process 문의 사용형식
[ 레이블 : ]process(sensitivity_list)[ 변수 선언 ;]begin
순차 실행 구문end process [ 레이블 ] ;
process(temp1, temp2, temp4, temp5) begin temp2 <= temp1 or temp5; temp3 <= temp2 or temp4;end process;
조합회로의 표현 ( 구문의 순서가 달라져도 실행순서와 관계없이 같은 회로를 표현하게됨 ), 가상의 모듈로 간주가능
21
동시문 -port map (1)요소 (Component) 선언 ( 구조적 모델 )
하나의 하드웨어 모듈은 그것을 이루고 있는 다수의 하위 모듈의 연결로 구성되어 있다 . 이때 상위 모듈의 entity-architecture 쌍을 기술하고자 할 때 필요한 하위모듈을 불러내고 그 연결성을 정의하기 위해 component 를 사용한다 .
이때 사용할 하위 모듈은 이미 설계가 끝나고 컴파일되어 있음을 가정한다 .
사용할 모듈 ( 블록 ) 은 architecture 와 begin 사이에 선언한다 .
22
동시문 -port map (2)Component 의 선언 ( 구조적 모델 )
Component 의 형식
Component 요소 _ 이름port( 인터페이스 _ 신호 _ 리스트와 형식 ) ;End component;
위에서 port 문은 이 component 가 설계되었던 entity 선언의 포트문과 정확히 같아야 한다 .Component 선언의 예
ex) Architecture behave of complex_decoder iscomponent adderport(a, b, cin : in std_logic ;cout, sum : out std_logic);end component ;…begin
23
동시문 -port map (3)Port map 정의 ( 구조적 모델 )
하위 요소를 선언한 후에는 port map 을 통해 하위 모듈과 연결한다 .
레이블 : 요소 _ 이름 port map ( 내부 _ 신호 _ 리스트 ) ;
내부 신호 리스트는 반드시 component 선언문에서 사용하였던 입출력 포트의 리스트와 일대일 대응이 되어야 한다 .같은 형태의 component 가 여러 개 사용될 수 있기 때문에 레이블 ( 인스턴스명 ) 은 꼭 지정해야 한다 .
24
동시문 -port map (4)Port map 정의 ( 구조적 모델 )
Port map 의 사용 예
Ex1) Adder0 : adder port map(a0,b0,cin0,cout0,sum0) ;
EX2) Adder1 : adder port map(a=>a1, b=>b1, cin=>cin1, cout=>cout1,
sum=>sum1) ;
위의 예에서 볼 수 있듯이 ‘ =>’ 연산자를 사용하여 포트와 신호를 연결하는 방법도 있고 연산자 없이 내부신호만을 차례대로 열거하여 연결하는 방법이 있다 .
25
RTL 설계논리합성가능한 RTL 모델의 범위
RTL 설계
동작적 모델
구조적 모델
동작수준 설계(Behavioral-level design)
게이트수준설계(Gate-level design)
26
VHDL 을 이용한 RTL 설계IF 구문 ( 동작적 모델 )
process 안에서 사용조건의 우선순위를 갖는 회로가 설계됨IF 문을 포함한 모든 조건부 실행문은 의도하지 않은 래치가 발생되지 않도록 모든 조건에 대한 실행방법을 기술해야함
우선순위회로로 인해 지연시간이 증가됨
만약 z<=0 을 삭제하면 래치 발생
27
VHDL 을 이용한 RTL 설계case 문 ( 동작적 모델 )
case 문은 if 문과 마찬가지로 process 문 안에서 조건부 실행을 만들게 된다 .If 문과는 달리 회로에 우선순위를 부여하지 않는다 .case 문의 사용예 ( 다중화기 , MUX)process(sel, a, b, c, d)begincase sel is when “00” => data_out <= a ; when “01” => data_out <= b ; when “10” => data_out <= c ; when others => data_out <= d ;end case ;end process;
모든 조건에 대한 실행방법을 지정하지 않으면 논리합성시
래치발생(NULL 도 사용하지 않음 )
28
VHDL 을 이용한 RTL 설계레지스터 모델 ( 동작적 모델 )
플립플롭 ( 주로 D-F/Fs)
래치 ( 특별한 경우이외에 되도록 설계하지 않음 )비동기 리셋 ,
상승클럭에지 동기
process(rst_n, clk)begin if rst_n = ‘0’ then d_out <= “0000”; elsif clk’event and clk=‘1’ then d_out <= d_in; end if;end process;
process(rst_n, clk)begin if clk’event and clk=‘0’ then if rst_n = ‘0’ then d_out <= “0000”; else d_out <= d_in; end if; end if;end process; 동기 리셋 ,
하강클럭에지 동기
process(rst_n, clk)begin if rst_n = ‘0’ then d_out <= “0000”; elsif clk=‘1’ then d_out <= d_in; end if;end process;
clkd_in
d_out(F/F)
d_out(latch)
29
VHDL 을 이용한 RTL 설계for loop( 동작적 모델 )
process 문 안에 사용루프에 의해 순차적으로 동작되는 회로를 의미하지 않음
반복적인 회로를 동작수준에서 설계할 때 용이함논리합성시 Loop unrolling 됨
루프의 횟수가 가변적인 경우 합성되지 않음 루프변수가 루프 안에서 변하는 경우 합성되기 어려움
For-loop 의 사용형식
for 루프변수 in 변수범위 loop실행구문 ;…
end loop ;
30
VHDL 을 이용한 RTL 설계For-loop 의 예 ( 쉬프터 )
process (clk)begin if clk’event and clk =‘1’ then if rst =‘1’ then shifted <= “00000000” ; elsif load =‘1’ then shifted(3) <=‘0’ ; for I in 0 to 2 loop shifted(i) <= shifted(i+1) ; end loop ; end if ; end if ;end process ;
shifted(0) <= shifted(1);shifter(1) <= shifted(2);shifted(2) <= shifterd(3)
shifted <= ‘0’ & shifted(3 downto 1) 결합연산자 사용
Loop unrolling
31
VHDL 을 이용한 RTL 설계for generate( 구조적 모델 )
port map 과 같이 사용한 모듈내에서 같은 요소 (component) 를 여러 번 사용하고 이에 대한 연결성이 규칙적으로 정의되는 경우 하드웨어 기술을 간단하게 만든다 . For 문과 같이 사용된다 .generate 문의 형식
레이블 : for 루프변수 in 변수범위 generate레이블 : 요소 _ 이름
port map ( 내부 _ 신호 _ 리스트 ); …end generate ;첫번째 레이블은 for-generate 문 자체의 인스턴스 이름이며 , 두번째 레이블은 port map 의 인스턴스 이름이 된다 .
32
VHDL 을 이용한 RTL 설계
For-generate 문의 예 ( 쉬프터 )zero<=‘0’;reg3 : regs port map(rst=>rst, clk=>clk, load=>load, d_in=>zero, d_out=>shifted(3)); shrs : for i in 0 to 2 generate internal_regs : regs port map(rst=>rst, clk=>clk, load=>load, d_in=>shifted(i+1), d_out=>shifted(i)); end generate shrs; ※ shifted 는 신호임 (std_logic_vector(3 downto 0))※ 루프변수는 일반적인 신호가 아니고 선언부가 필요없으며 for-generate
문 내에서만 유효하다 .
33
VHDL 을 이용한 RTL 설계함수 ( 동작적 모델 , 조합회로 )
자주 쓰이는 논리 회로를 함수의 형태로 설계할 수 있다 . 함수는 구조 정의부의 architecture 와 begin 사이에 명시될 수 있다 . ( 혹은 패키지로 구성가능 )
function 함수 _ 이름 ( 함수 _ 인자 1 : 데이터 형 ;함수 _ 인자 2 : 데이터 형 ;…함수 _ 인자 n : 데이터 형 )
return 데이터 형 is변수 _ 선언 _ 리스트
begin순차 _ 실행 _ 구문
return 변수 _ 이름 ;end [ 함수 _ 이름 ] ;
34
VHDL 을 이용한 RTL 설계
함수 Architecture behave of decoder is
function xor_reduce4(a : std_logic_vector(3 downto 0))return std_logic isvariable tmp : std_logic ;begin
tmp := a(3) xor a(2) xor a(1) xor a(0) ;return tmp ;
end xor_reduce4 ;…
begin
‘return is’ 구문에는 함수에서 반환될 데이터형을 정의begin 전에 함수 내부에서 사용할 변수들을 선언한다 .함수 내부는 순차적인 형태로 실행되므로 VHDL 의 순차 실행 구문들을 사용하여 작성한다 .‘Return’ 구문에서는 값을 반환할 변수명을 지정한다 .
35
다중연결 (Multiple Assignment)일반적인 RTL 에서의 다중연결
한 개의 process 문 안에서 다중할당 ( 마지막 할당이 유효 )다수의 동시문에서 같은 신호로의 다중할당 ( 잘못된 설계 )
예외 ) 버스 모델 (three-state buffer)
조합회로 1
조합회로 2 Ex.) ‘1’ , ‘0’ 을 resolve 하면 ‘ X’
comb1 <= temp2;
comb1 <= temp1;comb1
조합회로 1
조합회로 2
comb1comb1 <= temp2 when ld=‘0’ else ‘Z’;
comb1 <= temp1 when ld=‘1’ else ‘Z’;
inout 포트를 가진 모듈에서도 고려
36
Simulation/Synthesis MismatchSensitivity list
Process 문의 sensitivity list 를 모두 작성하지 않으면 X논리합성결과는 sensitivity list 와 무관 ( 경고메세지를 내보낼 수는 있음 )따라서 sensitive signal 이 없으면 합성전과 후의 모의결과가 다를 수 있음 process(a)
begin c <= a or b; end process; process(rst_n) begin if clk’event and clk=‘1’ then if rst_n = ‘0’ then d_out <= ‘0’; elsif load = ‘1’ then d_out <= d_in; end if; end if; end process;
37
Signal vs. Variable(1)변수
process 문에서만 사용할당방법이 다름 (:= 사용 )순차적인 특징
신호는 병렬성 구현 (process 문 내에서도 )대체로 물리적으로 구현되지 않음
예외도 존재함 ( 변수를 사용한 계수기 )신호 또한 물리적으로 구현되지 않을 수 있으나 , 변수보다는 구현성이 높음
38
Signal vs. Variable(2)Ex.) process(clk) variable a : std_logic; begin if clk’event and clk=‘1’ then if rst_n = ‘0’ then d_out <= ‘0’; elsif load = ‘1’ then d_out <= d_in; variable := d_in; end if; if variable = ‘1’ then state <= “0001”; else state <= “1111”; end if; end if; end process;
process(clk)
begin if clk’event and clk=‘1’ then if rst_n = ‘0’ then d_out <= ‘0’; elsif load = ‘1’ then d_out <= d_in; sig <= d_in; end if; if sig = ‘1’ then state <= “0001”; else state <= “1111”; end if; end if; end process;
39
테스트벤치RTL 설계의 평가 (non-synthesizable subset)
기능성 검증 - 기능성모의타이밍 /기능성 검증 – 게이트수준모의
Entity test isEnd;
Architecture behave of test is…Begin process clk <= ‘0’; wait for 10 ns; clk <= ‘1’; wait for 10 ns; end process;rst_n <= ‘0’ , ‘1’ after 100 ns;d_in <= “0000”, “1110” after 120 ns, “1101” after 140 ns;DUT : regport map(clk, rst_n, d_in, d_out);…
신호 발생
DUT(design under test)
일반적인 테스트벤치의 구조
동작 평가
순차특성고려
40
다루지 않은 구문
기타 논리 /산술 연산자 (+, -, *, /, sll, srl, ror, rol, sla, sra, …)기타 신호 attribute조건부 신호 할당문 (with-select)ConfigurationPackageGenericWhile loopProcedure
41
질문