본 문서는 myAVRICE User's Guide의 일부로 JTAG 이해를 돕기위해 발췌하여 개시합니다.
Joint Test Access Group (JTAG)
1980년대 중반에 Joint European Test Access Group 이라는 이름으로 시작하였으며 이후 미국이 1988년에 합류하게 되어 European을 빼고 Joint Test Access Group, 머리글자로 JTAG이라는 명칭이 결정되었습니다. IEEE1149.1로 표준이 정해져 있으며, http://standards.ieee.org/catalog/olis/arch_testtech.html 에 접속하면 표준 사양을 내려 받을 수 있습니다. 이후 1993년에 IEEE 1149.1a가 발의되었고, 1995년에 1149.1b가 제안되었습니다.
그림 10. 1988년 9월 17일 JTAG 미팅 참석자
JTAG이 등장한 이유와 활용
그림 11. 다양한 디바이스 패키지
칩의 고성능화, 고기능화로 인해 외부와의 인터페이스용 핀이 점점 많아지고 이로 인해 칩의 크기는 커질 수밖에 없습니다. 경박단소화 추세에 발맞추기 위해 칩 패키지 업체들은 끊임없는 기술 개발을 통해 다양한 외형을 가진 패키지를 선보이고 있습니다. 그 결과 핀과 핀 사이 피치(pitch)의 고밀도화로 연결되었고 더 나아가서는 핀이 외부로 노출되지 않고 디바이스 바닥에 위치하는 BGA(Ball Grid Array) 패키지가 등장하기에 이르렀습니다. 또한 PCB 기술도 소형화 흐름에 발맞추기 위해 다층 PCB가 일반화되고, 층과 층 사이에만 존재하는 이너 비아(inner via) 기술이 채택되기 시작했습니다. 이러한 기술들은 PCB를 소형화하는데 많은 도움이 되지만 시스템을 디버깅하는 데에는 많은 문제점이 만들어 냅니다. 우선 오실로스코프의 프루브를 디바이스 핀에 접촉하기가 어렵고, 칩 내부의 상태를 확인할 방법이 없다는 것입니다.
JTAG은 디바이스의 핀 상태를 읽어 내고, 내부 신호의 상태를 읽어내기 위해 제안된 기술로 보드 테스트, 디버깅에 매우 유용합니다. 뿐만 아니라 CPLD/FPGA와 같은 논리 회로와 플래시 메모리의 퓨징(fusing)에도 널리 사용되고 있습니다. 또한 마이크로프로세서의 코어에 직접 접근할 수 있는 방법을 제시하여 소스 레벨 디버깅을 지원합니다.
JTAG과 비교되는 기술로 ISP(In-System Programming)이라는 것이 있습니다. AVR과 같은 소형 마이크로 컨트롤러에서 많이 사용하는데, 이는 디바이스가 PCB상에 장착되어 있어도 외부의 신호로 마이크로 컨트롤러 내부의 플래시 메모리에 코드를 기록할 수 있는 기술을 뜻합니다. 일반적으로 ISP라고 하면 플래시 프로그래밍을 뜻하며, JTAG과 같은 소스 레벨의 디버깅은 포함되지 않습니다. JTAG은 ISP가 지원하는 플래시 메모리에 쓰기 기능뿐만 아니라 내부 코어에 접근하여 소스 레벨 디버깅 기술까지 지원합니다.
바운더리 스캔(Boundary-Scan)
JTAG을 이해하기 위해서 복잡한 이론 설명보다는 어떤 시스템을 디버깅 할 때 어떤 기능이 필요한지부터 먼저 생각해 보겠습니다. 우선 특정 신호의 상태를 봐야 할 것입니다. 신호 선이 H(하이)인지 L(로우)인지를 확인하는 기능이 있어야 할 것입니다. 그 다음 추가로 있으면 하는 기능이 특정 신호를 사용자가 원하는 신호 레벨로 강제로 할당하는 기능이 있으면 좋을 것입니다. 디버깅을 할 때 점퍼를 날려 신호 선을 GND와 연결하거나 VCC와 연결하는 것이 바로 이런 과정이 될 것입니다. JTAG에서 사용하는 바운더리 스캔 기술은 바로 이런 과정을 전기적인 블록으로 구현해 놓은 것입니다. 이를 이용하면 디바이스의 특정 핀을 원하는 상태로 임의로 설정할 수도 있고, 핀의 상태를 읽어 낼 수도 있습니다. 물론 이러한 기능을 구현하기 위해서는 디바이스 내부의 코어 용량을 일부 낭비하게 되겠지만 하드웨어 디버깅 기능이 생긴다는 장점이 더 크기 때문에 많은 디바이스 제조업체에서 JTAG 채택이 늘어나고 있습니다.
그림 12. 바운더리 스캔 셀의 개념
바운더리 스캔 셀의 개념
이러한 기능을 하나의 셀로 구현한 것이 바운더리 스캔 셀(BSC, Boundary scan cell)입니다. 위 그림을 살펴봅시다. #1번 장치와 #3번 장치가 서로 잘 연결되어 원하는 대로 동작하는 가를 확인하기 위해서는 #1번 장치가 출력하는 신호 레벨을 확인하고, #3번 장치에 특정 신호를 넣어서 원하는 결과가 나오는지를 확인해야 할 것입니다(왼쪽 그림). 이 때 이 신호 선을 끊고 BSC를 넣으면 원하는 기능, 다시 말하면 입력의 상태를 파악하고, 출력의 상태를 원하는 값으로 인가할 수 있게 됩니다(오른쪽 그림).
그림 13. 우: 코어 옆에 연결되는 BSC, 좌: BSC의 내부 구성
BSC는 코어의 입출력 핀에 연결되게 되며, 내부 구성은 MUX와 시프트 레지스터의 조합으로 구성됩니다. BSC를 제어하기 위한 핀이 BSC마다 외부와 인터페이스를 해야 한다면, 디바이스의 핀은 두 배로 늘어나게 될 것입니다. JTAG 그룹에서는 이러한 상황을 피하기 위해 BSC끼리 시리얼 방식으로 연결하여 단지 4개의 핀으로만 외부에서 각 BSC를 제어할 수 있는 방식을 제안했습니다. 우선 기존의 신호 선은 끊고 각각 입력과 출력이 NI와 NO에 연결됩니다. 그리고 우리가 BSC에 어떤 값 1비트 신호를 주고 싶을 때는 SI 신호 선에 값을 인가합니다. BSC의 값을 읽어내야 할 때 신호를 출력하는 곳은 SO 신호 선입니다. 위 그림에서 나머지 굵은 글씨로 되어 있는 신호 선들은 BSC을 제어하기 위한 신호 선들입니다. 정리하면 BSC는 NI, NO, SI, SO의 신호 선으로 데이터 입출력이 이루어집니다. 이를 다시 아래 그림처럼 각각의 BSC와 연결한 후 최종적으로 디바이스 외부 핀으로 데이터 북에서 자주 볼 수 있는 TDI, TCK, TMS, TDO의 신호 선이 완성됩니다.
그림 14. 바운더리 스캔 셀과 JTAG 인터페이스
어떤 핀의 상태 값을 설정하고 싶다면, TDI 신호 선에 그 값을 기록하고, 해당 BSC 위치까지 TDI 신호가 이동하도록 TCK 신호 선에 클록을 인가합니다. 같은 방법으로 특정 BSC 값을 읽어내고 싶으면, TCK 신호 선에 클록을 인가하면 TDO에 BSC 값들이 출력됩니다. BSC값을 NI에 입력된 값을 NO로 그대로 출력할 것인지(bypass), 아니면 SI에 인가된 값으로 NO값을 설정할 것인지, 아니면 SO에 현재 NI 입력 값을 출력할 것인지의 모드 설정은 TMS 신호가 담당하게 됩니다. 따라서 위 네 개의 신호만으로 우리는 디바이스 핀의 상태를 완벽하게 제어할 수 있게 됩니다.
이 방식은 산업계 표준으로 ARM 프로세서뿐만 아니라 대부분의 마이크로프로세서, 마이크로 컨트롤러에서 공통적으로 채택하고 있습니다. 따라서 이론상으로는 JTAG 장비로 모든 JTAG을 채택한 장비를 제어할 수 있어야 하지만, 현실적으로는 그렇지 못합니다. 업체의 사정에 따라 이러한 JTAG 장비가 자사의 매출에 크게 도움이 되는 경우에는 내부 BSC에 대한 정보를 공개하지 않으면, 서드 파티(third party) 업체에서 호환 JTAG 장비를 제조할 수 없습니다. TI사의 TMS320F24x 시리즈, F28x 시리즈가 대표적인 예로 이들 장비는 TI사와 라이센스 계약을 맺은 업체만 호환 JTAG 생산이 가능합니다. 반대로 내부 정보를 모두 공개해서 자유롭게 다양한 JTAG 장비가 제작되도록 장려하는 업체들도 있습니다. ARM 프로세서가 대표적인 예로, 모든 부분이 공개되어 있기 때문에 JTAG 기술을 충분히 습득한다면, 고가의 JTAG 장비를 자체적으로도 제작할 수 있습니다.