FFT를 지난 두 레인의 거리-Doppler 맵이 들어와 속도와 거리가 정해지고 추적기로 나가기까지의 결정 경로를 레지스터, 비교기, 게이트로 옮긴 회로입니다. 위쪽 시트에서 블록을 누르면 그 블록의 내부 회로와 논리식, 신호가 아래에 나옵니다. 그 아래에 이 회로를 Verilog로 구현해 돌린 결과가 있습니다.
위 회로도를 Verilog로 구현했습니다. 결정 경로 전체(PKD, NBR, GRK, FV, LREG, CAND, MATCH, RC, FLAG, OREG, CTRL)가 dc_top 아래 네 모듈에 들어 있습니다. 한 레인의 맵은 한 클록에 한 셀씩 32,768사이클 동안 흘러 들어오고, 두 레인을 마친 뒤 한 사이클 안에 속도와 거리가 정해집니다. 시뮬레이션은 Icarus Verilog 12(이 환경에서 소스로 빌드)로 돌렸고, 같은 레지스터·고정소수점·나눗셈 순서를 따르는 Python 참조 모델의 로그와 줄 단위로 비교했습니다. 결과: 2,005프레임, diff 0줄.
| 파일 | 줄 수 | 내용 |
|---|
S1(반대 차선 차량, R 62.3 m, v −58.6 m/s, 맵 SNR 25 dB)에서 레인 2의 마지막 샘플이 들어온 뒤부터 결과가 나오기까지 24사이클입니다. 레인 1은 같은 과정을 먼저 지났습니다(v̂₁ = −9.92 m/s, 접힌 값). 파형은 tb_dc.v를 -DDUMP로 돌려 얻은 VCD에서 vcd_window.py로 하강 에지마다 뽑은 실제 RTL 신호입니다. 사이클 번호는 테스트벤치의 클록 카운터(리셋 포함)입니다.
| 사이클 | 상태 | i | q | 무슨 일이 일어났나 |
|---|
비교 분석 페이지의 시나리오 S1–S5를 같은 회로에 넣은 결과입니다. 피크 위치는 (n, m), m은 FFT 순서이고 64 이상이 음의 Doppler bin입니다.
| ID | 입력 | 레인 1 피크 · v̂₁ | 레인 2 피크 · v̂₂ | dmin | v̂ | R̂ | 플래그 | 판정 |
|---|
프레임 1,000개씩 두 설정을 RTL로 돌리고 모든 결정을 검사기로 대조했습니다. 검사기는 RTL 구조와 상관없이 맵에서 직접 최댓값과 이웃을 찾고, Grandke 보간, 접힌 속도, 후보, 최근접 쌍, 속도, 거리, 플래그를 부동소수점으로 다시 계산합니다. 고정소수점 반올림 차이는 허용 오차로, 임계값 2 LSB 안에서 갈리는 결정은 '경계'로 따로 셉니다.
| 항목 | 기본 설정 | 스트레스 설정 |
|---|
| 항목 | 값 | 근거 |
|---|
합성에서 새로 보인 것: COMB(CAND → MATCH → RC → FLAG)가 LUT의 3분의 2를 쓰고, 조합 경로도 4-LUT 기준 123단으로 가장 깁니다. PKD는 6단, GRK는 20단입니다. LUT 한 단에 배선 지연까지 더하면 이 경로만으로 10 ns(100 MHz)를 넘을 가능성이 커서, 위의 100 MHz는 아직 가정일 뿐입니다. 고칠 방향은 COMB를 순차화하는 것입니다. 후보 15쌍을 사이클마다 하나씩 비교하면 프레임당 사이클은 0.02% 늘고, 뺄셈기 15개가 1개로 줄어듭니다. 이 수정과 배치·배선(nextpnr)은 다음 단계로 남겨 두었습니다.
cd rtl
python3 gen_stim.py 5 0 scenario --hex # S1–S5, 또는: gen_stim.py 1000 101 base --hex
iverilog -g2005 -o tb.vvp -Ptb.NF=5 tb_dc.v dc_top.v dc_pkd.v dc_div.v dc_comb.v
vvp -n tb.vvp > run.log
python3 check.py run.log # exit 0, "errors": {} 이면 통과
python3 run_model.py OUT=model.log && diff <(grep -v END run.log) <(grep -v END model.log) # RTL = 참조 모델
iverilog -g2005 -DDUMP -o tbd.vvp -Ptb.NF=1 tb_dc.v dc_top.v dc_pkd.v dc_div.v dc_comb.v
vvp -n tbd.vvp > /dev/null && python3 vcd_window.py dc_wave.vcd > wave.json # 위 파형
yosys -q -s synth.ys # iCE40 자원 → synth_stat.txt
yosys -q -s depth.ys # 가장 긴 조합 경로 → synth_depth.txt
| 신호 | 폭 | 근거 |
|---|