[칩 설계 검증] 테스트벤치란 무엇인가? Testbench에 관하여
테스트벤치(Testbench)란 무엇인가?
이번 포스팅에서는 제가 생각하는 테스트벤치의 정의에 관하여 써내려볼까 합니다.
testbench meaning 이라고 구글에 검색하면 아래처럼 결과가 나옵니다.
A "testbench" refers to a controlled environment used to test a component, device, or system.
어떠한 구성요소, 디바이스나 시스템을 테스트하기 위해 사용되는 통제된 환경.
모두가 동의할 수 있을것 같은 정의입니다.
하지만 칩설계 검증의 영역으로 제한하고
저만의 언어로 다시 풀어써보자면
테스트벤치란
DUT(design under test)를 검증하기 위한 시뮬레이션 환경,
DUT에 input을 drive하고 output을 monitoring하여 설계의 pass/fail을 판정한다.
Testbench는 왜 필요한가?
저는 후배들한테 설명할 때 DUT를 돌덩이라고 표현하는데요,
왜냐하면 DUT는 input없이는 동작하지 않기 때문입니다.
반도체 칩이 동작하기 위해서는 전력이 공급되어야 합니다.
반도체 칩에서 ALU 컴포넌트만 떼서 볼까요?
ALU 컴포넌트가 동작하기 위해서는 전력 뿐만 아니라 적절한 input이 공급되어야 합니다.
디지털 설계 유닛은 클록과 리셋 공급도 필요합니다.
input signal/ clock 이 주어지지 않은 설계 컴포넌트는 그 자체로서 동작하지 못하는 돌덩이 입니다.
테스트벤치는 DUT가 동작할 수 있는 외부 환경을 모델링 합니다.
ADDER를 검증한다고 하면
Clock과 Reset 공급은 물론이거니와
adder는 a와 b를 더하는 연산을 하므로, a 와 b 에 해당하는 값들을 전달해야합니다.
그리고 a+b를 미리 계산한 값과 adder output c를 비교해서 ADDER가 정상적으로 동작하는지 확인합니다.
a, b는 완전 무작위값일 수도 있지만, 어떠한 패턴을 가진 값일 수도 있습니다.
a와 b신호는 다른 digital design component로부터 받은 값일 것이기 때문입니다.
a, b 신호를 생성하는 그 digital design block에서는 b = 2*a 를 만족하는 a, b 조합만 내뱉을 수도 있습니다.
이런 규칙은 a, b 신호를 생성하는 designd을 설계한사람만이 알고 있습니다.
발생가능한 a, b 값들에 대해서 constraint로 정의할 수 있습니다.
Testbench와 검증에 관한 또다른 비유
저는 가끔 이런 비유를 합니다.
코딩테스트를 보신 적 있으신가요?
코딩 테스트에서는 피시험자가 작성한 코드에 100개 혹은 200개 등 방대한 양의 input set를 주입하고 채점을 합니다.
여기서 피시험자가 작성한 코드는 dut이고 코딩 테스트 채점 환경은 testbench입니다.
input set는 벡터입니다.
채점환경을 작성하는데에도 엄청난 시간과 노력이 소모됩니다.
왜냐하면,
"어떻게하면 코드 오류를 찾아낼 수 있을까 머리를 써야합니다."
일반적인 인풋이라면 그냥 pass해버릴테니깐요. 코너케이스를 찾아내야합니다.
"dut 외부환경을 모델링하기 위해서 꽤 오랜 시간과 노력이 필요합니다."
dut는 어떤 function만을 구현하지만 testbench는 그 function이 동작하기 위한 system의 모델을 구현해야하니깐요.
검증 역할이 주목받는 이유
따라서 저는 최근 칩설계 영역에서 검증이 주목받는 이유를 이렇게 생각합니다.
칩설계보다 테스트벤치 작성에 소요되는 시간과 노고가 커지고 있습니다.
그 노고를 줄이고 일의 시스템화, 자동화 시스템을 구축하는 것이 검증 영역에서 중요하게 생각하는 부분입니다.
또한 버그는 초기에 발견될 수록 비용이 작습니다.
칩 설계/제조시 버그가 발견되는 시기가 늦으면 늦을 수록 막대한 비용이 발생합니다.
ECO를 해야할 수도 있고, ECO로도 해결이 안되는 경우에는. . .? 대참사가 될수도 있겠군요.