inflearn logo
강의

講義

知識共有

デジタル回路設計実務:Computer ArchitectureとSoCプロトコルDigital IP設計

高集積 DRAM セル モデルと DRAM インターフェイスの設計 (プリチャージ/センシング/リストアなどのプロセスとそれに伴うコマンドを習得します。)

어떤 방식으로 이 강의를 듣고 공부를 해야 하는지 고민 됩니다.

解決済みの質問

23

seanok959237

投稿した質問数 13

0

아녕하세요. 지금 디지털 회로설계 실무 : Computer Architecture 와 SoC 프로토콜 Digital IP 수업을 듣고 있습니다.

이 수업을 들으면서 RTL 코딩 실력을 높이고 싶습니다. 일단 수업에 들었던 칩에서 어떤 인풋신호가 필요하고 또 아웃풋 신호가 필요한지 적어본 다음에 제공해 주시는 코드를 나름데로 분석한다고 하면서 코드 한줄 한줄 보면서 이 신호는 어느 신호고 왜 쓰였는지 공부하면서 보고있습니다. 하지만 이렇게 보는게 시간도 많이 걸리고 너무 나무만 보고 숲은 보지 않는 느낌도 듭니다. 또한 제가 직접 RTL 코드를 작성하지 않다 보니까 제 실력이 느는 것 같지도 않습니다. 이 경우 제가 어떻게 학습을 하는게 가장 효율 적일까요? 이 강의를 들으면서 여기서 진행하는 CPU설계나 UART를 제 프로젝트로 해서 직접 설계해보고 돌려 보는게 저의 목표입니다. 하지만 cache 같은 부분을 보면서 코드를 분석하는데 2주 정도의 시간이 걸리니 이렇게 공부하는게 맞는지 조바심을 느낌니다. 이렇게 공부하는게 맞는지 의문이 듭니다.

verilog-hdl fpga 임베디드 amba

回答 2

0

samcoach

안녕하세요, 답변 남겨드립니다.

지금처럼 input, output 신호를 먼저 적고 제공된 RTL 코드를 한 줄씩 따라가며 “이 신호가 왜 필요한가”를 보는 방식은 틀린 공부가 아닙니다. 오히려 처음 RTL을 배울 때 반드시 한 번은 거쳐야 하는 과정입니다. 다만 이 방식만 2주, 3주 계속 가져가면 말씀하신 것처럼 나무는 자세히 보이는데 전체 구조가 흐려지는 문제가 생깁니다. 실무에서도 신입이 IP 코드를 처음 받을 때 모든 line을 처음부터 끝까지 해석하지 않습니다. 먼저 block diagram, interface, state machine, data path, control path를 잡고, 그 다음에 중요한 always block과 assign 구문을 추적합니다.

이 강의에서 Cache, DRAM Controller, FIFO, AMBA, UART 같은 내용을 다루는 이유는 단순히 문법을 많이 보라는 뜻이 아니라, “스펙을 RTL 구조로 바꾸는 사고방식”을 익히기 위해서입니다. 특히 DRAM 쪽은 Pre-charge, Sensing, Restore 과정이 그냥 이론 단어로 끝나는 게 아니라 command sequence, timing interval, state transition으로 바뀌어야 합니다. 예를 들어 ACTIVATE 이후 READ/WRITE가 가능해지고, PRECHARGE 이후 bank가 닫히는 식으로 동작 순서가 생기죠. 이런 부분은 코드 한 줄보다 FSM 그림 하나가 먼저입니다. 이 수업 안에서도 SRAM, DRAM Interface, DRAM Controller, FIFO, AMBA, AXI, I2C, SPI, UART까지 설계 과제로 연결되도록 구성해둔 이유가 여기에 있습니다.

앞으로는 코드를 읽는 시간을 전체 공부 시간의 30% 정도로 제한하는 게 좋습니다. 나머지 70%는 직접 작은 버전으로 다시 짜보는 데 써야 RTL 실력이 늘어납니다. 예를 들어 Cache 코드를 2주 동안 분석했다면, 그 다음에는 제공 코드 없이 direct-mapped cache의 최소 버전을 직접 짜보는 식입니다. 처음부터 완성도 높은 cache를 만들 필요는 없습니다. address를 tag/index/offset으로 나누고, hit = valid && (tag_array[index] == addr_tag) 정도의 핵심 조건을 직접 RTL로 구현해보는 게 먼저입니다. 이 정도만 해도 “읽은 코드”가 “내가 쓸 수 있는 구조”로 바뀌기 시작합니다.

학습 순서는 크게 바꾸시는 게 좋습니다. 첫날에는 해당 IP의 역할을 한 문장으로 정의하고, input/output 신호를 표처럼 정리합니다. 둘째 날에는 FSM state를 5개 이하로 줄여서 직접 그립니다. 셋째 날에는 제공 코드 없이 아주 작은 RTL을 작성합니다. 넷째 날에는 testbench를 만들어 최소 10개 이상의 test vector를 넣고 waveform을 봅니다. 다섯째 날에야 제공 코드를 열어서 내가 짠 코드와 비교합니다. 이렇게 해야 “코드 분석”이 목적이 아니라 “내 설계의 빈틈을 찾는 리뷰”가 됩니다.

CPU나 UART를 본인 프로젝트로 가져가겠다는 목표는 아주 좋습니다. 다만 처음부터 CPU 전체를 프로젝트로 잡으면 datapath, control FSM, register file, ALU, memory interface가 한꺼번에 들어와서 진도가 막힐 가능성이 큽니다. 실무 기준으로도 CPU는 작은 구조라도 검증 포인트가 많습니다. instruction 5개만 지원해도 reset, fetch, decode, execute, writeback, branch, memory access까지 확인해야 해서 testbench가 최소 20~30개 케이스는 필요합니다. 그래서 RTL 실력 향상이 목적이면 UART를 먼저 추천드립니다. UART는 baud rate generator, tx FSM, rx FSM, shift register, parity 정도로 구조가 분리되고, tx_start가 들어왔을 때 tx_busy가 올라가고 start bit, data bit 8개, stop bit가 순서대로 나가는 waveform을 눈으로 확인하기 좋습니다.

UART 프로젝트를 잡는다면 목표를 작게 쪼개야 합니다. 처음에는 8N1, 즉 data 8bit, parity 없음, stop 1bit만 구현하세요. baud tick은 실제 115200 bps를 바로 맞추기보다 simulation에서는 divider를 4나 8 정도로 줄여서 파형을 빠르게 확인하는 게 낫습니다. 그 다음 tx만 구현하고, 이후 rx를 붙이고, 마지막에 loopback으로 tx_data가 rx_data로 돌아오는지 확인하면 됩니다. 이 과정에서 always @(posedge clk) 안에서 register가 갱신되는 감각, non-blocking assignment인 <=를 써야 하는 이유, state와 counter가 어떻게 맞물리는지가 자연스럽게 잡힙니다.

Cache에서 2주가 걸린 것은 이상한 일이 아닙니다. Cache는 초보자 입장에서는 RTL 문법 문제가 아니라 컴퓨터 구조 문제에 가깝습니다. tag, index, offset, valid bit, dirty bit, hit/miss, refill, write-through, write-back 개념이 동시에 들어옵니다. 여기에 memory latency까지 들어가면 state가 IDLE, TAG_CHECK, MISS_REQ, REFILL, UPDATE처럼 늘어납니다. 그러니 2주 동안 코드를 읽었는데도 불안한 건 실력이 부족해서가 아니라, 처음부터 난도가 꽤 높은 블록을 너무 정밀하게 파고든 겁니다. 이 경우에는 cache를 잠시 내려놓고 SRAM, FIFO, UART처럼 입출력과 상태 전이가 선명한 블록으로 RTL 근육을 먼저 만드는 게 효율적입니다.

실무에서 RTL 엔지니어를 볼 때 “남의 코드를 오래 읽었다”보다 더 강하게 보는 건 본인이 만든 산출물입니다. 최소한 module spec, RTL code, testbench, waveform, synthesis report, timing report까지 있어야 설계 경험으로 인정받기 쉽습니다. 예를 들어 UART 프로젝트라면 “8N1 UART TX/RX를 Verilog로 설계했고, 50MHz clock 기준 baud divider를 parameter화했으며, 20개 test vector로 tx/rx loopback을 검증했고, FPGA 합성 후 LUT 사용량과 Fmax를 확인했다” 정도로 정리되어야 합니다. 여기서 Fmax가 100MHz 이상인지, critical path가 counter 쪽인지 FSM decode 쪽인지까지 적으면 단순 수강생 느낌이 아니라 설계자 느낌이 납니다.

DRAM Interface 강의도 같은 방식으로 접근하시면 됩니다. Pre-charge, Sensing, Restore를 물리 동작으로만 외우지 말고 command FSM으로 바꿔보세요. 예를 들어 IDLE에서 ACTIVATE로 가고, 일정 cycle을 기다린 뒤 READ나 WRITE로 넘어가고, 이후 PRECHARGE를 거쳐 다시 IDLE로 돌아오는 구조입니다. 실제 DRAM timing은 tRCD, tCL, tRP, tRAS 같은 제약이 붙기 때문에, 처음 학습용 RTL에서는 각 timing을 parameter로 두고 wait_counter >= tRCD 같은 형태로 구현하면 됩니다. 이 정도만 직접 짜도 DRAM Controller의 뼈대를 이해하는 데 충분합니다.

조바심이 날 때 기준을 “오늘 몇 줄을 이해했나”로 잡으면 계속 불안해집니다. 기준을 “이번 주에 내가 직접 만든 module이 몇 개 생겼나”로 바꾸셔야 합니다. 4주 기준으로 보면 첫 주는 counter, mux, register file, simple SRAM을 직접 작성하고, 둘째 주는 FIFO와 UART TX를 작성하고, 셋째 주는 UART RX와 testbench를 붙이고, 넷째 주는 작은 CPU나 DRAM Controller의 FSM skeleton을 만드는 흐름이 좋습니다. 이 정도 속도면 빠르지도 느리지도 않습니다. 복잡한 cache를 2주 동안 완벽히 해석하는 것보다, 작은 RTL 4~5개를 직접 작성하고 waveform으로 검증하는 쪽이 실력 상승은 훨씬 큽니다.

제가 이 강의를 공부하실 때 기대하는 모습은 제공 코드를 필사하듯 분석하는 것이 아니라, 제공 코드를 “내 코드와 비교하는 기준선”으로 쓰는 것입니다. 처음에는 코드 품질이 낮아도 괜찮습니다. state 이름이 투박하고, testbench가 단순하고, waveform이 지저분해도 직접 돌려본 설계는 머리에 남습니다. 현업에서도 첫 RTL은 대부분 수정됩니다. 중요한 건 reset이 제대로 들어가는지, 모든 state에서 next_state가 정의되는지, latch가 생기지 않는지, valid와 ready가 끊기지 않는지, setup timing을 깨는 긴 combinational path가 없는지를 반복해서 보는 습관입니다. 이 습관이 생기면 CPU, UART, AMBA, DRAM Controller 모두 같은 방식으로 확장됩니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 서윤님!

디지털 회로설계 실무 강의를 수강하면서 RTL 코딩 실력을 향상시키고자 하는 열정에 감명받았습니다. 특히, 실제 프로젝트를 목표로 하는 명확한 목표 설정도 매우 효과적인 접근법입니다. 그러나 현재의 학습 방법에서 시간이 많이 소요되고 실력 향상이 더디게 느껴지신다면 약간의 전략 수정이 필요할 수 있습니다.

몇 가지 팁을 드리겠습니다:

  1. 큰 그림을 이해하기:

    • 단순히 코드 한 줄 한 줄 보는 것이 아니라, 각 코드 블록의 전체적인 맥락과 설계를 먼저 이해하는 것이 중요합니다.
    • CPU 설계나 UART를 포함한 시스템 아키텍처의 흐름을 그림으로 그리거나, 블록 다이어그램으로 정리해 두면 복잡한 부분을 이해하는 데 도움이 됩니다.
  2. 코드 분석에서 벗어나 실습으로:

    • 기초적인 이해를 마친 후에는 작은 모듈을 직접 구현하면서 학습하는 것이 좋습니다. 기본적인 버스 인터페이스나 작은 컨트롤러 등을 설계하고 시뮬레이션 해보세요.
    • 예제를 따라하기 전에 스스로 설계를 시도해본 후, 실제 코드와 비교하는 방법도 좋습니다. 이를 통해 본인의 설계를 테스트하고 향상시킬 수 있습니다.
  3. 모듈화된 학습 접근:

    • Cache 같은 복잡한 구조는 각 컴포넌트를 나누어 공부하세요. 예를 들어, 먼저 Tag, Index, Offset의 개념을 잡고, 그 후에 Hit/Miss 판단 로직으로 넘어가는 순서입니다.
  4. 실습 프로젝트 설정:

    • 프로젝트 목표를 너무 크게 잡기 보다는, 학습 범위를 정해 점진적으로 확장해 나가세요. 예를 들어, 처음에는 간단한 UART 송수신 모듈을 구현하고, 점차 복잡한 기능을 추가해보는 방법을 추천드립니다.

유사한 질문에 대한 답변은 아래에서 확인하실 수 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

쿼터스 스케메틱에 대한 질문

0

26

2

FIFO 질문

0

25

2

cache관련 질문 드립니다

0

45

1

강의 만료일 연장 신청

0

66

2

강의자료 pdf파일

0

115

2

수강기간변경

0

85

2

프로그램 종류

0

106

1

안녕하세요 강의 도중 궁금한 점 있어서 질문드립니다!

0

98

1

수강기간 변경관련

0

73

2

수강기간 만료

0

77

2

수강 연장 문의

0

79

2

I2C SCL_Synched, SDA_Synched 질문

0

103

1

no data path질문

0

117

3

SRAM 강의 modelsim 시뮬레이션에서 inner 메모리를 Objects 리스트에서 찾으려고 하는데 안보입니다.

0

108

2

DataMem 스펙 질문

0

65

1

Hamming Code 질문

0

85

1

W_CRC 값 질문하기

0

76

1

Precharge에 대한 질문

0

194

1

tpsram spec 질문

0

77

2

학습 관련 질문 있습니다!

0

97

2

[과제7] AXI 통신 프로토콜 설계하기 문의드립니다

0

106

2

SRAM 강의 TB 작성 후 waveform 확인시에 dout이 모두 don't care 처리 관련 질문드립니다.

0

124

5

vivado와 quartus 프로그램의 systhesis 결과 차이에 대해 궁금한 점 있습니다

0

211

2

tool 질문

0

106

2