⚠️ Port mismatch / Port connection error
VHDL에서 컴포넌트 인스턴스화 시 포트 연결 오류가 발생하는 경우가 있다. port mismatch, no feasible entries, association element not found 등의 오류는 엔티티 선언과 인스턴스화 시 포트 이름이나 타입이 일치하지 않을 때 발생한다.
개요
- 증상:
port mismatch,no feasible entries,association element not found - 주요 원인: 포트 이름 불일치, 포트 타입/방향 불일치, 포트 개수 불일치
- 해결 방향: 엔티티 선언과 인스턴스화 일치 확인, 포트 매핑 검증
언제 발생하나
대표적인 상황은 다음과 같다.
- 포트 이름 오타 (예:
clkvsclock) - 포트 방향 불일치 (예:
invsout) - 포트 타입 불일치 (예:
std_logicvsstd_logic_vector) - 포트 개수 불일치 (필수 포트 누락 또는 추가 포트)
- 포트 매핑 문법 오류
재현 코드(포트 이름 불일치)
아래 코드는 엔티티에서 clk로 선언했지만 인스턴스화에서 clock으로 연결해 오류가 발생한다.
library ieee;
use ieee.std_logic_1164.all;
-- 엔티티 선언
entity counter is
port (
clk : in std_logic;
rst : in std_logic;
count : out std_logic_vector(7 downto 0)
);
end entity;
architecture rtl of counter is
signal cnt : unsigned(7 downto 0);
begin
process(clk, rst)
begin
if rst = '1' then
cnt <= (others => '0');
elsif rising_edge(clk) then
cnt <= cnt + 1;
end if;
end process;
count <= std_logic_vector(cnt);
end architecture;
-- 잘못된 인스턴스화 (포트 이름 불일치)
library ieee;
use ieee.std_logic_1164.all;
entity top is
port (
clock : in std_logic;
reset : in std_logic;
q : out std_logic_vector(7 downto 0)
);
end entity;
architecture rtl of top is
component counter is
port (
clk : in std_logic;
rst : in std_logic;
count : out std_logic_vector(7 downto 0)
);
end component;
begin
inst_counter : counter
port map (
clock => clock, -- 오류: clk가 아니라 clock
rst => reset,
count => q
);
end architecture;
해결 원칙
1) 포트 이름 정확히 일치
엔티티 선언의 포트 이름과 인스턴스화 시 포트 이름이 정확히 일치해야 한다.
inst_counter : counter
port map (
clk => clock, -- 올바른 매핑
rst => reset,
count => q
);
2) 위치 기반 매핑 사용
포트 순서가 일치하면 이름 없이 위치로 매핑할 수 있다. 다만 가독성과 유지보수성을 위해 이름 기반 매핑을 권장한다.
inst_counter : counter
port map (
clock, -- 첫 번째 포트 (clk)
reset, -- 두 번째 포트 (rst)
q -- 세 번째 포트 (count)
);
3) 포트 타입과 방향 확인
포트의 타입(std_logic, std_logic_vector 등)과 방향(in, out, inout)이 엔티티 선언과 일치해야 한다.
4) 선택적 포트 처리
VHDL-2008에서는 선택적 포트를 지원하지만, 대부분의 경우 모든 포트를 연결해야 한다. 사용하지 않는 포트는 open으로 연결할 수 있다.
inst_counter : counter
port map (
clk => clock,
rst => reset,
count => open -- 출력 포트를 사용하지 않는 경우
);
자주 헷갈리는 지점
포트 매핑에서 =>는 “연결”을 의미한다. 왼쪽은 컴포넌트의 포트 이름이고, 오른쪽은 상위 레벨의 신호 이름이다. 포트이름 => 신호이름 형식으로 작성한다.
유사 사례
포트 연결 오류는 인스턴스화 시 자주 발생하며, 이름 오타와 타입 불일치가 주요 원인이다.123