RTL design engineer 업무

석사 과정 동안 반도체 공정 및 소자 연구를 진행했지만, 직무를 바꿔 팹리스 회사에 입사해 RTL design engineer로 성장하고 있습니다. 성장하면서 했던 업무에 대해 간략하게 설명할까 합니다.

계속 업데이트할 예정이에요~

RTL design engineer OJT

Study

2023년 2월 초에 입사하고 한 달 동안은 공부만 했어요. 반도체 설계 flow, CPU 작동, Bus Architecture, Memory, Peripheral을 주제로 공부했고 3월 초부터 실제로 Verilog를 쓰기 시작했어요.

처음 받은 숙제는 I2C controller의 testbench를 작성하고 시뮬레이션을 돌려보는 거였는데 시작부터 문제가 생겼죠. 아니, 나는 Verilog는커녕 C언어도 모르고 리눅스도 안 써봤는데 갑자기 testbench를 짜서 시뮬레이션을 돌려보라고??

우선 리눅스를 쓰는 이유는, Verilog로 RTL 설계하고 Synopsys나 Cadence 사의 EDA 툴을 통해 합성해야 해요. 근데 그 툴들이 다 리눅스 환경 기반이기 때문에 RTL도 리눅스에서 해야 한다는 점. 그래서 출근해서 컴퓨터 켜면 VNC viewer라는 프로그램 켜서 회사 서버 컴퓨터 접속해서 일을 합니다. (사실 집에서 재택근무 해도 됨)

얘기가 셌는데, 어쨌든 첫 번째 과제는 I2C 컨트롤러에 대한 testbench와 시뮬레이션이었어요. 그러면서 I2C 컨트롤러 RTL 코드 던져주면서

‘그거 Master 모드, Slave 모드 둘 다 되니까 각각 APB BFM 달아서 연결하고 파일에서

데이터 불러와서 데이터 Loop back 테스트해 봐’

와……… ^^;; 진짜 눈물 나더라고요…

Testbench

Checklist 작성

어떤 모듈에 대해 검증하려면 먼저 체크리스트를 작성해야 합니다.

I2C standard에도 나와 있는데 Standard-mode, Fast-mode, Fast-mode Plus를 지원한다고 하네요. 모듈에 timing 세팅하는 레지스터가 있는데요, 내가 설정했던 대로 제대로 작동하는지 확인해야겠죠?

Master mode, Slave mode로 설정할 수 있고 7-bit / 10-bit address mode 확인해야 합니다(DMA는 아직 몰라서 넘김….). 그리고 모듈 레지스터들의 기본값이 제대로 읽히는지, Writeable 한 경우 입력한 대로 값이 설정되는지 확인해야 합니다.

마지막으로 제 숙제였던 Data Loop back test로 checklist를 마무리했어요.

Block diagram

어떤 테스트를 할지 정해졌으면 Block diagram을 그려야 합니다. 저도 처음에는 왜 그려야 하는지 몰랐는데요, 확실히 그림을 그리고 코딩을 시작하니까 실수가 줄더라고요. 나중에 말씀드릴 integration에서는 이 Block diagram을 잘 그리는 게 진짜 진짜 진짜 진짜 진짜 중요합니다.

RTL design

그럼, 본격적으로 Verilog로 RTL design을 해야겠죠?? 지금도 잘 모르지만, 당시에는 문법에 대해서 아무것도 몰라서 chatGPT 도움을 많이 받았어요. 얘가 코딩 전체를 해줄 수는 없는데 어떤 기능에 대한 기초적인 스크립트는 짜주더라고요. Verilog 문법에 대해서는 따로 정리된 글을 참고해 주세요.

다시 말씀드리자면 RTL design은 리눅스 환경에서 진행합니다. Design을 하고 Synthesis 과정을 거치기 위해 Synopsys나 Cadence 사의 tool을 사용하는데, 이 tool이 리눅스 환경에서 돌아가기 때문입니다. 그래서 오피스에 도착하면 컴퓨터 켜고 VNC Viewer라는 원격 프로그램으로 회사 서버 컴퓨터에 접속해서 작업합니다. 리눅스는 CentOS를 쓰는데 window 쓸 일은 거의 없다고 생각하시면 돼요.

RTL Simulation

Testbench의 목적은 RTL design 된 모듈의 기능 검증입니다. 그래서 앞에서 설명한 checklist로 시뮬레이션과 waveform을 확인해야 합니다.

처음 I2C controller module을 테스트할 때는 2주의 시간이 걸렸는데 그 후로는 점점 빨라져서 UART 1주, GPIO / PIT 합쳐서 1주 만에 test를 끝낼 수 있었네요 ㅠㅠ

Time table 추천, 엑셀 간트(XLGantt)

제가 OJT를 시작할 때 이사님이 엑셀 파일을 하나 주시면서 time table로 사용하라고 하셨어요. 너무 편리하고 좋은 기능이 많아서 추천해 드리려고 작성합니다.

엑셀 간트는 매크로 프로그램이어서 따로 설치가 필요 없습니다. xlsm으로 저장되어서 바로바로 사용할 수 있거든요.

간트 사용 예시
간트 사용 예시

업무 이름을 입력하고 노란색 부분에 시작 날짜, 초록색 부분에 마쳐야 할 날짜를 입력하면 빨간 박스에 보이는 것처럼 일정이 자동으로 생성됩니다. 주황색 부분에 업무가 몇 퍼센트 진행됐는지 입력해 주면 빨간 박스 부분이 자동으로 업데이트됩니다.

간단하게 설명을 해드렸는데 자세한 내용은 엑셀웍스 사이트를 참고하시면 되겠습니다.

SoC integration

다음부터는 회사 프로젝트 중 하나에 참여해서 간단한 업무를 했는데요, 바로 integration입니다.

ARM같이 자체 IP를 만드는 회사도 있지만 저희 회사는 고객사의 요청을 받아 SoC platform을 설계하는데요, 설계하려는 칩의 spec에 맞는 IP를 사서 chip으로 design 하는 작업을 합니다. 반도체 설계 flow는 나중에 따로 정리하겠습니다.

그래서 제가 작업한 부분을 살짝 보여드리면 굉장히 간단한데요,

SoC integration
SoC integration

AHB 버스와 APB 버스가 bridge로 연결되어 있고 각각의 APB 버스에 여러 가지 peripheral들이 달려있는 구조입니다. 저는 APB0 부분을 맡았는데요, RTL design 자체는 어렵지 않았어요. 왜냐하면 여러 모듈을 인스턴스화해서 연결만 잘해주면 됐거든요.

다만, 힘들었던 부분은 여러 사람이 같이 일을 하다 보니까 코딩 룰이라고 할까요?? 컴파일에 영향을 주지는 않지만, 내부적으로 정해진 규칙을 지켜야 했거든요. 그래야 협업하는 데 편하고 보기도 좋습니다. 근데 저희 회사가 생긴 지 얼마 안 돼서 저희만의 룰이 아직 정해지지 않은 상황이었어요. 그래서 integration 다 했는데 수석님이 다른 방법이 더 좋을 것 같다고 하시면서 룰 수정하면 일일이 다 수정해야 하는 번거로움이;;;

제가 처음에 testbench 작성할 때 코딩 방식과 룰이 정해진 뒤에 코딩 방식이 어떻게 바뀌었는지 보여드릴게요.

coding rule
coding rule

별거 아니지만 확실히 바뀐 다음이 보기 편하죠?? 그 이유가 align이라고, 정렬이 잘 되어 있기 때문인 것 같네요. 코딩 룰 중 또 다른 하나는 signal 이름 세팅인데, 위의 APB signal의 이름을 정할 때 I2C와 APB0의 ‘pwrite’ signal을 예시로 보여드리면

pwrite_i2c / pwrite_apb0 라고 세팅하고 둘을 assign을 통해 이어줘야 합니다.

assign  pwrite_i2c  =  pwrite_apb0;

근데 i2c_pwrite으로 정할 건지, pwrite_i2c로 정할 건지 왔다 갔다 하면 또 그때마다 수정수정수정수정수정(단순히 integration만 했는데 스크립트 4000줄이 넘었습니다, 거의 5000줄임. 거기서 수정할 부분 일일이 다 찾아서 바꿔야 함)

또 한 가지 번거로운 점은 탭을 쓰지 못한다는 거예요. 사람마다 탭의 띄어쓰기 설정이 다른데(저는 띄어쓰기 2칸입니다.) 탭을 쓰면 다른 사람이 볼 때 align이 다 틀어진다고 못 쓰게 하시고 띄어쓰기 4번으로 통일하라고 하시더라고요. 그래서 수정할 때 ‘지우기 + space bar 4번 따다다닥’ 반복했어요. 진짜 단순노동 ㅠㅠ;;;

주니어는 초반에 회사 스타일에 맞게 코딩 습관을 잘 들여야 할 것 같습니다.

FPGA test

반도체 설계는 여러 단계를 통해 검증 검증, 또 검증을 반복합니다. 프로그램을 만들거나 앱을 만들어서 출시한 뒤에 뭔가 오류를 발견하면 수정해서 업데이트하면 되지만 반도체는 한번 만들고 Fab in 하면 TSMC 같은 파운드리에서 정해진 수량만큼 생산하는 동안 RTL 수정이 안 됩니다 ㅎㄷㄷ… 업데이트가 없어요!!

그래서 RTL simulation으로 기능을 검증하고 FPGA test를 진행해서 실물로도 잘 작동하는지 확인합니다. FPGA는 따로 정리를 해야겠지만 간단히 말하면 수정이 가능한 반도체를 말합니다.

Data sheet

RTL design engineer, 특히 SoC 관련 팹리스에서 근무하는 engineer라면 data sheet를 끼고 살 수 밖에 없습니다. Data sheet는 IP에 대한 세부적인 내용이 담겨있는 사용자 매뉴얼이라고 보시면 돼요. Spec(feature, block diagram, input/output signal, function 등)에 대한 설명과 레지스터에 대한 설명이 있어서 매우 중요합니다.

제가 맡았던 업무는 FPGA 파트에 대한 전반적인 부분과 IP 설계였습니다. IP RTL design 후 data sheet를 작성하는데요, IP에 대한 정보를 data sheet에 아주 상세히 기록해야 합니다. 그래야 소프트웨어 팀이 register description을 보고 testcase 코드(검증 코드)를 제대로 작성할 수 있거든요;;

Timing diagram 그리기

Excel로 그리기

Data sheet를 작성하면 Timing diagram을 그려야 하는 경우가 있습니다. 처음에는 엑셀의 테두리 기능을 사용해서 Timing diagram을 그렸습니다.

Excel로 timing diagram 그리기
Excel로 timing diagram 그리기

위 그림과 같이 셀 구분 선 때문에 사진 자료로 사용할 수 없습니다. 이럴 경우 엑셀의 옵션에서 구분 선을 없앨 수 있습니다.

엑셀 표 구분선(눈금선) 지우는 방법
엑셀 표 구분선(눈금선) 지우는 방법
  1. 먼저 엑셀 옵션에 들어가서
  2. 고급 탭을 선택하고
  3. 눈금선을 없앨 시트를 선택해서
  4. 눈금선 표시를 해제하면 됩니다.

Wavedrom으로 그리기

그런데 엑셀로 timing diagram을 그리면 너무 번거로운데요, wavedrom으로 편하게 그릴 수 있습니다. 설치 프로그램이 아니라 다운받고 exe 파일만 실행하면 됩니다. 코드를 작성해서 diagram을 그리는 방식인데요, 홈페이지에 튜토리얼도 있으니 참고하시면 됩니다.

Wavedrom 사용 예시
Wavedrom 사용 예시

참고: The Role of the RTL Engineer

Similar Posts