[7/40] RTL 시뮬레이터 개발일지 – 외부 RTL로 검증하기

개발 중인 RTL 시뮬레이터 vitamin이 맞는 답을 내는지 확인하려고, 공개된 서드파티 RTL 여덟 개와 직접 쓴 설계 두 개를 다른 시뮬레이터의 결과와 맞춰 보는 벤치를 만들었다. 현업에서 검증 환경을 만들 때는 꽤 꼼꼼하게 보는 편이지만, 그건 도구를 믿는 사람의 꼼꼼함이었다.…
오픈소스 Rust RTL 시뮬레이터 vitamin을 만들며 쓴 개발일지다. 이벤트 구동 시뮬레이션 구조, 단계 분리, 정확성 원칙, 외부 RTL로 한 검증을 다룬다.

개발 중인 RTL 시뮬레이터 vitamin이 맞는 답을 내는지 확인하려고, 공개된 서드파티 RTL 여덟 개와 직접 쓴 설계 두 개를 다른 시뮬레이터의 결과와 맞춰 보는 벤치를 만들었다. 현업에서 검증 환경을 만들 때는 꽤 꼼꼼하게 보는 편이지만, 그건 도구를 믿는 사람의 꼼꼼함이었다.…

내가 만드는 RTL 시뮬레이터 vitamin에서 가장 먼저 정한 규칙은, 맞는 답을 낼 수 없으면 조용히 틀린 답을 내지 말고 에러를 내며 멈추라는 것이다. 이 규칙 때문에 다 만든 기능을 되돌린 적도 있다. RTL을 짜다 보면 파형 어딘가에 X가 번져 있거나,…

RTL에서 순차 로직에는 <=를, 조합 로직에는 =를 쓴다. 두 기호가 왜 다른 결과를 내는지, 그 차이를 지키려고 시뮬레이터가 한 시각 안에서 무슨 일을 하는지 vitamin 안쪽에서 들여다본다. 기호 하나만 바꾼 시프트 레지스터 두 단짜리 시프트 레지스터다. 값이 a에서 b로, 다시…

vitamin을 단계별로 나눠 돌리면 앞 단계의 산출물이 디스크에 남는다. 소스나 플래그가 바뀌었을 때 그 산출물을 다시 써도 되는지는, 어떤 입력을 판단 근거에 넣느냐로 정해진다. 예전에 시뮬레이션을 돌리면 로그가 주루룩 쏟아지곤 했다. 그런데 같은 걸 다시 돌리면 몇 줄 띡 하고…

vitamin의 명령은 넷이고 처음부터 그렇게 계획했다. 계획은 두 번 어긋났다. 파일 수정 시각(mtime)은 절대 쓰지 않겠다던 규칙을 조건을 붙여 풀었고, 단계별 명령을 만들어 놓고 정작 나는 한 번에 도는 vita만 쓴다. 명령은 처음부터 넷이었다 vitamin에는 명령이 넷 있다. vita 한…

vitamin에서 Verilog 소스가 파형 파일이 되기까지는 일곱 단계를 거친다. 이 단계를 밖으로 꺼내 셋으로 나눠 돌릴 수 있게 했는데, 나눠 돌리는 길에서 결과가 조용히 틀린 적이 두 번 있었다. 명령 한 줄이면 시뮬레이션은 돈다. vita counter.sv라고 치면 텍스트 파일이 들어가서…

맥북에서 Verilog 파일 하나를 설치 안내나 빌드 도구 없이 cargo build 한 줄로 돌려 보고 싶어서 RTL 시뮬레이터 vitamin을 만들기 시작했다. 첫 편은 이벤트 구동 시뮬레이터가 회로를 “실행한다”는 게 무슨 뜻인지에서 시작한다. 1년쯤 지난 지금은 크레이트 17개에 테스트 6,240개짜리 물건이…