2025 전국 대학생 AI 반도체 회로 설계 경진대회 · 팀 반짝반짝
2 / 3
← 경진대회 기술 노트로 돌아가기

2. SNN 제어 회로와 RTL 구성

이 글에서는 LIF 뉴런의 상태 갱신을 RTL로 표현하고, 입력부터 네 방향 spike 출력까지 연결한 과정을 설명합니다. 99→32→4 실험망의 계층 구조와 시간 단계 FSM을 먼저 살펴본 뒤, 공개한 4채널 출력 제어 모듈을 코드와 파형으로 읽어봅니다. 막전위를 언제 읽고 갱신하는지, 발화와 reset이 어떤 순서로 일어나는지를 중심으로 정리했습니다.

네트워크와 RTL 모듈

최종 실험 네트워크는 위치 입력 99개, 은닉 뉴런 32개, 방향 출력 4개로 구성했다. 이 계층형 실험망은 weight 파일과 100개 time step을 사용해 계산한다. 공개한 error_encoder.v, lif_neuron.v, controller_top.v에서는 signed 위치 오차를 네 방향으로 나누고 LIF spike를 생성하는 출력 제어 경로를 살펴볼 수 있다.

뉴런
LIF: 누적 · 누설 · 임계값 · reset
시간
100 time steps
출력
방향별 spike count와 X/Y decoding
코드
error_encoder · lif_neuron · controller_top

LIF 뉴런 데이터 경로

Baby Neuron datapath는 입력 spike의 가중합, 막전위 누적, 누설, 임계값 판정, reset으로 구성된다. 누설은 오른쪽 shift로 구현되며, 나눗셈기 없이 시간에 따른 막전위 감소를 나타낸다.

막전위 U는 뉴런이 이전 time step까지 받은 자극을 저장하는 상태값이다. 흥분성 weight는 U를 증가시키고, 억제성 weight는 감소시킨다. leak는 입력이 없을 때도 상태가 무한히 남지 않도록 줄이고, threshold는 누적된 자극을 1-bit spike로 바꾸는 경계이다. 발화 뒤에는 막전위를 0으로 초기화하거나 임계값만큼 빼는 방식을 사용할 수 있으며, 최종 발표의 Baby Neuron은 reset-to-zero와 shift 기반 leak를 중심으로 설명한다.

입력 pre-synaptic spike 현재 time step의 활성 입력
가중합 Σ(weight × spike) 흥분은 더하고 억제는 뺌
누설 U − (U >> k) 시간이 지나면 막전위 감소
판정 U ≥ threshold 임계값을 넘으면 spike
상태 reset 또는 다음 U 다음 클록을 위한 레지스터
최종 발표자료의 LIF 뉴런 데이터 경로
입력 spike, 가중합, 막전위 적분, 막전위 레지스터와 출력 spike로 이어지는 LIF 뉴런 데이터 경로
발표자료의 Baby Neuron은 reset-to-zero와 shift 기반 누설을 사용한다. 아래에서는 이 동작을 먼저 살펴보고, 공개 출력 모듈의 subtractive reset과 비교한다.
항목전체 실험망의 Baby Neuron공개 lif_neuron.v
누설막전위 오른쪽 shift 기반기본값 LEAK=10을 매 clock 차감
임계값실험 1: 40 · 실험 2: 300기본값 U_THR=2000
입력pre-synaptic spike와 weight방향 magnitude X_in과 속도항 v_abs
발화 후 상태발표자료의 reset-to-zero임계값만큼 차감하는 subtractive reset
용도99→32→4 실험 네트워크4방향 출력 제어 경로 설명
뉴런 상태와 weight를 확인한 회로 시뮬레이션 파형
여러 membrane potential과 99개 입력 weight, clock 신호를 표시한 SimVision 파형
입력 weight와 뉴런별 막전위가 clock에 따라 갱신되는지를 확인한 실제 시뮬레이션 화면이다. 한 시점의 출력값만 보는 것이 아니라, 상태가 누적되고 발화 조건에 도달하는 순서를 확인하는 자료로 사용했다.

시간 단계 FSM

FSM은 초기화, 입력 처리, 누적 계산, 결과 산출, 표시 상태로 구성된다. 각 상태는 입력 생성과 막전위 갱신의 순서를 고정하며, 실험은 100개의 time step을 순차적으로 실행한다.

software에서는 반복문 하나로 100번 계산할 수 있지만, RTL에서는 어느 clock에 입력 spike가 유효한지, 어느 clock에 막전위가 갱신되는지, 언제 출력 count를 읽을지를 명시해야 한다. 특히 rate encoder의 counter와 LIF의 상태 레지스터가 같은 시간 기준을 공유하지 않으면, 의도한 spike 수와 실제 누적 횟수가 달라진다. FSM은 이 시간 경계를 고정해 done 시점에 방향별 count가 완성되도록 한다.

IDLE / INIT 상태와 counter 초기화 새 위치 입력 준비
RUN_INPUT 입력 spike 생성 one-hot 또는 rate encoding
RUN_ACCUM 뉴런 상태 갱신 가중합·누설·발화
CALC_DONE 방향별 spike 집계 X/Y 제어량 계산
DISPLAY 결과 유지 다음 입력 전까지 출력 확인
최종 발표자료의 time-step 제어 FSM
IDLE, INIT, RUN INPUT, RUN ACCUM, CALC DONE, DISPLAY 상태로 이어지는 SNN 제어 FSM
입력을 만드는 구간과 출력 spike를 누적하는 구간을 분리하고, TIME_STEPS가 끝난 뒤 결과를 확정하는 순서를 나타낸다. 상태 이름은 발표자료의 구현 흐름을 따랐다.

FSM을 읽을 때는 한 time step 안에서 입력 생성과 상태 갱신에 각각 몇 clock이 필요한지 살펴봐야 한다. 이 실험에서 100 time step은 입력 rate와 막전위 반응을 관찰하기 위해 정한 반복 횟수이다.

99→32→4 계층 구조

입력 계층의 99개 뉴런은 보드 위치를 나타낸다. 32개 은닉 뉴런은 위치별 흥분·억제 연결을 시간에 따라 통합하며, 출력 계층은 네 방향을 제공한다. 반대 방향의 spike 수 차이는 X축과 Y축의 순 제어량으로 변환된다.

입력 뉴런은 현재 좌표에 해당하는 weight 행을 선택하는 역할을 한다. 은닉층은 여러 흥분성·억제성 연결을 합쳐 좌표별 반응을 만들고, 출력층은 이를 네 방향으로 모은다. weight는 RTL 안의 상수 몇 개로만 표현되는 것이 아니라 실험 zip의 hidden_*.hex와 output_*.hex로 분리되어 있다. 이 구조는 네트워크 연결과 뉴런 계산을 분리하므로 같은 뉴런 datapath를 유지하면서 weight 조합을 바꿀 수 있다.

계층크기받는 정보내보내는 정보
입력9911×9 one-hot 위치와 rate 입력위치별 spike
은닉32흥분·억제 가중합시간축 상태와 spike
출력4은닉 계층 spike+X · −X · +Y · −Y
decoder2축방향별 spike countX/Y 제어량과 완료 상태

네 방향 출력 RTL

error_encoder는 signed X·Y 값을 부호에 따라 네 방향의 양수 크기로 나눈다. controller_top은 lif_neuron 네 개를 배치하고 각 spike를 방향 신호에 연결한다. 이 세 모듈을 따라가면 좌표 오차가 출력 이벤트로 바뀌는 과정을 확인할 수 있다.

error_encoder는 중앙 목표가 0이라는 조건을 이용해 ex=-x, ey=-y를 만든다. 양수 오차는 pull 채널, 음수 오차는 push 채널로 보내고 반대 채널은 0으로 둔다. 이 때문에 한 축에서는 정상적으로 한 방향만 자극된다. controller_top은 X축 두 채널에 v_abs_x, Y축 두 채널에 v_abs_y를 연결하고, 네 LIF의 1-bit spike를 각각 motor pull/push 출력에 직접 대응시킨다.

입력 signed X · Y 중앙 기준 위치 오차
error_encoder 네 방향 magnitude 부호와 절댓값 분리
lif_neuron × 4 막전위와 spike 클록 동기 상태 갱신
controller_top X/Y pull · push 방향별 1-bit 이벤트
모듈입력내부 동작출력
error_encodersigned x, y중앙 오차의 부호와 크기를 네 채널로 분리X/Y pull·push magnitude
lif_neuronX_in, v_absleak, 입력 gain, 속도항, threshold, reset1-bit spike
controller_top위치와 축별 속도항encoder 1개와 LIF 4개 연결4방향 motor event

공개 lif_neuron의 sequential block에서는 nonblocking assignment를 사용한다. 따라서 현재 clock의 spike 판정은 갱신 전 막전위 U를 기준으로 하고, 같은 edge에서 다음 U가 계산된다. 파형을 읽을 때 입력 변화와 spike 사이에 clock 경계가 존재하는 이유가 여기에 있다.

현재 clock에서 읽는 값조건다음 clock을 위해 저장하는 값
기존 막전위 UU > U_THRspike=1, 막전위에서 threshold 차감
기존 막전위 UU < LEAKU=0
U, X_in, v_abs그 외U-LEAK+W_GAIN×X_in-K_V×v_abs

공개 RTL의 lif_neuron은 발화할 때 막전위에서 임계값을 빼는 subtractive reset을 사용한다. 남은 막전위가 다음 clock으로 이어지므로 강한 입력에서는 연속 발화가 가능하다. 발표자료의 계층형 Baby Neuron은 발화 후 막전위를 0으로 초기화한다. 두 reset 방식을 비교하면 발화 뒤 남는 상태가 다음 출력에 어떤 영향을 주는지 이해할 수 있다.

RTL을 읽으며 확인한 핵심

상태와 인터페이스

뉴런 출력과 모터 구동 신호

출력 spike는 방향과 반응량을 전달하는 이벤트이다. 이후 모터를 연결할 때는 spike count를 구동 시간이나 PWM으로 대응시키는 규칙이 필요하다.

검증 가능성

time step과 상태 갱신 순서

입력 생성, 막전위 갱신, 출력 집계 순서를 FSM으로 나누었다. 파형에서도 이 순서대로 신호를 따라가면 값이 처음 어긋난 구간을 찾기 쉽다.

입력 신호

좌표와 속도항

RTL 입력에는 위치와 축별 속도항이 디지털 값으로 들어온다. 위치 오차의 부호는 방향을 나누고, 축별 속도항은 해당 LIF 채널에 연결된다.

발화 조건

leak·threshold·gain

leak, threshold, gain은 막전위가 누적되는 속도와 발화 빈도에 영향을 준다. 입력 자극이 같아도 이 값에 따라 spike count가 달라지므로 실험 조건과 함께 기록했다.

출력 경로를 살펴보며 signed 오차의 방향 분리, LIF 상태 갱신, 1-bit spike 전달을 하나의 흐름으로 정리했다. 특히 수식의 계산 순서와 레지스터가 갱신되는 clock을 함께 읽어야 파형을 이해할 수 있었다. 다음 글에서는 입력 방식과 뉴런 설정을 바꿨을 때 방향별 출력이 어떻게 달라졌는지 살펴본다.