하드웨어 검증 분야에서 “검사”에 흔히 쓰이는 보편적인 기법으로 커버리지 사용을 들 수 있습니다. 하지만 흔하고 보편적이라고 해도 여전히 전문가 영역이나 검증 IP라는 인식이 강합니다. 이 글에서는 기능적 커버리지, 라인 커버리지, 표현식 커버리지 등을 비롯하여 커버리지 디버깅과 커버리지 분포에 대해 다룹니다. 예시를 통해 간단하고 사용이 간편한 커버리지 모델 가이드를 제공하였습니다.
커버리지는 소프트웨어 설계에서 널리 사용되는 툴입니다. 개념 자체는 생각해보면 쉽게 이해할 수 있습니다. 무언가를 “커버”하지 않았다면 테스트하지 않았다는 뜻입니다. 예를 들어 한 번도 실행된 적이 없는 소프트웨어 라인을 커버하지 않았으며, 테스트를 진행하지 않은 것입니다.
10 int *p;
11 int condition1 = 0;
12 if (condition1)
13 value = *p;
위의 코드에서 ‘if’의 조건은 참이 아닙니다. 따라서 13번 라인의 할당 구문은 테스트되지 않았습니다. 따라서 코드 커버리지 툴은 13번 라인이 테스트되지 않았다는 보고서를 작성합니다. 이것이 아주 단순한 형식으로 설명한 ‘코드 커버리지’입니다.
하드웨어 검증의 경우에도 이와 같은 커버리지 개념을 적용합니다. 다만 이제는 커버해야 할 것이 훨씬 많아졌습니다. 실행만이 아니라 표현식 값, 분기, 토글과 기능적 커버리지 등을 포함해야 합니다.
일부 커버리지는 언어에 “기본 내장”된 것도 있으므로 툴이 커버리지를 자동으로 계산할 수 있습니다. 이런 경우에는 사람이 개입할 필요가 없습니다. 예를 들어 하드웨어 시뮬레이터는 구문 중에서 실행 가능한 것이 무엇인지 알 수 있고, 시뮬레이션을 진행하면서 문이 실행되었는지 여부를 추적할 수 있습니다. 시뮬레이션을 마치면 커버리지 보고서를 작성할 수 있습니다.