⚠️ width mismatch
VHDL에서 폭 불일치 오류는 거의 모든 설계에서 한 번은 만난다. Vivado에서는 “width mismatch”, “cannot match”, “range mismatch” 같은 형태로 보이는데, 실질적으로는 좌변과 우변의 비트 폭이 다르다는 의미다.
개요
- 증상:
width mismatch/range mismatch류의 폭 불일치 - 주요 원인: 슬라이스 범위 오류, 패딩/확장 누락, unconstrained array 연결 실수
- 해결 방향: 의도에 맞는 패딩/확장/슬라이스로 폭을 명시적으로 일치
언제 발생하나
자주 나오는 패턴은 다음과 같다.
- 상수/리터럴 폭 미지정으로 기본 폭과 기대 폭 불일치
std_logic_vector슬라이스 범위 지정 오류- unconstrained array 포트 연결 시 실제 폭 불일치
재현 코드(슬라이스 폭 불일치)
아래는 a(7 downto 0) 8비트에 b(3 downto 0) 4비트를 그대로 할당해 폭 불일치를 만드는 예다.
library ieee;
use ieee.std_logic_1164.all;
entity width_demo is
port (
a : out std_logic_vector(7 downto 0);
b : in std_logic_vector(3 downto 0)
);
end entity;
architecture rtl of width_demo is
begin
a <= b; -- 폭 불일치
end architecture;
해결 패턴
1) 의도를 명확히 해서 확장/패딩한다
아래는 상위 비트를 0으로 패딩하는 방식이다.
a <= (7 downto 4 => '0') & b;
2) 슬라이스로 정확히 맞춰 넣는다
a(3 downto 0) <= b;
a(7 downto 4) <= (others => '0');
프로젝트 규모가 커질수록 “한 줄로 끝내려는 습관”이 오히려 오류를 숨긴다. 분해해서 쓰는 편이 디버깅 비용이 낮다.
unconstrained array 포트에서 특히 조심할 점
VHDL-2008에서 unconstrained array를 포트로 쓰는 경우, 컴포넌트 인스턴스에서 실제 폭을 결정하는 지점이 많아진다. 이때는 “타입/서브타입”을 통일해서 폭이 한 군데에서만 결정되도록 구성하는 편이 안전하다.
유사 사례
폭 불일치 관련 질문은 VHDL-2008의 width mismatch 형태로 반복된다.1