Download presentation
Presentation is loading. Please wait.
1
VHDL의 개요 김 인 수
2
VHDL이란? VHDL(VHSIC Hardware Description Language)
1981년에 제안, IEEE ,1993, 2000, 2002 표준 동작수준모델에서 게이트수준모델을 표현 주로 RTL(register-transfer level) 설계에 사용됨(IEEE , 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)
Design productivity ↑ Design quality ↑ RTL design Simulation Gate-level netlist Cell Library Chip layout
4
RTL(Register-Transfer Level) 설계
디지털회로를 설계하는 방식중의 하나 하드웨어 레지스터와 산술논리연산(조합)회로 간의 데이터흐름으로 정의됨 공정에 독립적인 모델(technology-independent model) 논리합성도구에 의해 게이트레벨 네트리스트로 추출됨 특정 공정 셀라이브러리(cell library)와 설계제약조건(design constraint)이 필요 주로 VHDL, Verilog-HDL이 사용됨
5
Simulation vs. Synthesis
6
본 강의의 목적 RTL에서 동시성(concurrency)이해 논리합성을 위한 RTL설계 VHDL을 이용한 RTL설계
실습에서 사용되는 VHDL의 자세한 문법은 각 이론강의에서 review
7
VHDL의 기본구조(1) Entity-Architecture
Ex) Library IEEE; use IEEE.std_logic_1164.all; entity decoder is port( 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) case data_in is end behave ; data_in dec_out decoder 2 3 입출력 신호선언 모듈 동작 설계
8
VHDL의 기본구조(2) Entity의 구조
여러 entity-architecture구조쌍은 한 파일에 모두 위치할 수 있고, 각각의 파일에 위치할 수도 있다. Entity 이름과 파일 이름이 꼭 동일할 필요는 없지만 컴파일러에 따라 오류를 내보내기도 한다. 하나의 entity는 여러 개의 architecture를 가질 수 있다. Configuration사용하여 architecture를 선택 Entity 엔티티_이름 is [port(인터페이스_포트_선언) ;] End [entity] [엔티티_이름] ;
9
VHDL의 기본구조(3) 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)
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)
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의 신호해석표
여러 모듈이나 내부 게이트들에서의 출력 신호들이 한 와이어에서 경합하는 경우 아래 신호해석표에 의해서 하나로 결정되어 진다. std_logic의 신호해석표 ‘U’ ‘X’ ‘0’ ‘1’ ‘Z’ ‘W’ ‘L’ ‘H’ ‘-’
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 := “ ” ; 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 ; --구문1 c <= not a ; --구문2 d <= a or c ; --구문3 조합회로의 표현 (구문의 순서가 달라져도 같은 회로를 표현하게됨)
18
signal assignment(신호할당문)
동시성(Concurrency) VHDL의 동시문(concurrent statement) 회로의 동작 및 연결성을 정의하는 구문은 동시문 architecture concur1 of concur is … begin temp1 <= temp5 xor a1; process(temp1, temp3, temp4) 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 절대지연시간] ;
Functional simulation에서 조합회로의 지연시간은 0 대신, 클럭에 동기되는 시간이 각각 구분됨 신호할당의 목적지는 물리적/논리적인 와이어(wire)를 의미 – 논리합성의 결과에 따라 결정됨 temp1 <= a1 xor a2 xor a3; temp2 <= “0010” when temp1=‘1’ else “0110”; 조합회로 조합회로 a1 temp1 temp2 a2 a3 0 ns
20
동시문-process 프로세스문(동작적 모델링)
자체적으로 동시문이지만 내부의 연산들은 순차적으로 실행된다. functional simulation Sensitivity 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의 형식
End component; 위에서 port문은 이 component가 설계되었던 entity 선언의 포트문과 정확히 같아야 한다. Component 선언의 예 ex) Architecture behave of complex_decoder is component adder port( a, b, cin : in std_logic ; cout, sum : out std_logic); end component ; … begin
23
동시문-port map (3) 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 모델의 범위 동작수준 설계 (Behavioral-level design) 동작적 모델
구조적 모델 게이트수준설계 (Gate-level design)
26
VHDL을 이용한 RTL설계 IF구문(동작적 모델) process안에서 사용 조건의 우선순위를 갖는 회로가 설계됨
우선순위회로로 인해 지연시간이 증가됨 만약 z<=0을 삭제하면 래치 발생
27
모든 조건에 대한 실행방법을 지정하지 않으면 논리합성시 래치발생
VHDL을 이용한 RTL설계 case문(동작적 모델) case문은 if문과 마찬가지로 process문 안에서 조건부 실행을 만들게 된다. If문과는 달리 회로에 우선순위를 부여하지 않는다. case문의 사용예(다중화기, MUX) process(sel, a, b, c, d) begin case 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 clk’event and clk=‘0’ then if rst_n = ‘0’ then d_out <= “0000”; else d_out <= d_in; end if; end process; 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 rst_n = ‘0’ then d_out <= “0000”; elsif clk=‘1’ then d_out <= d_in; end if; end process; clk d_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의 예(쉬프터) shifted(0) <= shifted(1);
process (clk) begin if clk’event and clk =‘1’ then if rst =‘1’ then shifted <= “ ” ; elsif load =‘1’ then shifted(3) <=‘0’ ; for I in 0 to 2 loop shifted(i) <= shifted(i+1) ; end loop ; end if ; end process ; shifted(0) <= shifted(1); shifter(1) <= shifted(2); shifted(2) <= shifterd(3) Loop unrolling shifted <= ‘0’ & shifted(3 downto 1) 결합연산자 사용
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 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설계 함수 ‘return is’ 구문에는 함수에서 반환될 데이터형을 정의
Architecture behave of decoder is function xor_reduce4(a : std_logic_vector(3 downto 0)) return std_logic is variable tmp : std_logic ; begin tmp := a(3) xor a(2) xor a(1) xor a(0) ; return tmp ; end xor_reduce4 ; … ‘return is’ 구문에는 함수에서 반환될 데이터형을 정의 begin전에 함수 내부에서 사용할 변수들을 선언한다. 함수 내부는 순차적인 형태로 실행되므로 VHDL의 순차 실행 구문들을 사용하여 작성한다. ‘Return’ 구문에서는 값을 반환할 변수명을 지정한다.
35
다중연결(Multiple Assignment)
일반적인 RTL에서의 다중연결 한 개의 process문 안에서 다중할당(마지막 할당이 유효) 다수의 동시문에서 같은 신호로의 다중할당(잘못된 설계) 예외) 버스 모델(three-state buffer) 조합회로 1 comb1 <= temp2; comb1 <= temp1; comb1 조합회로 2 Ex.) ‘1’ , ‘0’을 resolve하면 ‘X’ 조합회로 1 comb1 <= temp2 when ld=‘0’ else ‘Z’; comb1 <= temp1 when ld=‘1’ else comb1 조합회로 2 inout 포트를 가진 모듈에서도 고려
36
Simulation/Synthesis Mismatch
Sensitivity 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 process;
37
Signal vs. Variable(1) 변수 process문에서만 사용 할당방법이 다름(:= 사용) 순차적인 특징
대체로 물리적으로 구현되지 않음 예외도 존재함(변수를 사용한 계수기) 신호 또한 물리적으로 구현되지 않을 수 있으나, 변수보다는 구현성이 높음
38
Signal vs. Variable(2) Ex.) process(clk) 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 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 process;
39
테스트벤치 RTL설계의 평가(non-synthesizable subset) 기능성 검증 - 기능성모의
타이밍/기능성 검증 – 게이트수준모의 Entity test is End; Architecture behave of test is … Begin process clk <= ‘0’; wait for 10 ns; clk <= ‘1’; end process; rst_n <= ‘0’ , ‘1’ after 100 ns; d_in <= “0000”, “1110” after 120 ns, “1101” after 140 ns; DUT : reg port map(clk, rst_n, d_in, d_out); 일반적인 테스트벤치의 구조 신호 발생 DUT (design under test) 순차특성고려 동작 평가
40
다루지 않은 구문 기타 논리/산술 연산자 (+, -, *, /, sll, srl, ror, rol, sla, sra, …)
기타 신호 attribute 조건부 신호 할당문(with-select) Configuration Package Generic While loop Procedure
41
질문
Similar presentations