Verilog 사칙연산(+-*/) 합성 가이드
⚡ Verilog 사칙연산 합성 완벽 가이드
RTL 코드가 실리콘 하드웨어로 변환되는 과정의 모든 것
assign c = a + b; 이 한 줄이 실제 칩에서 어떤 회로가 될까요? 합성 툴은 당신의 타이밍 제약을 보고 수십 가지 아키텍처 중 최적의 것을 자동 선택합니다. 이 글에서는 각 연산자가 어떤 하드웨어로 변환되는지, 그 과정을 시각화와 함께 상세히 설명합니다.
🔄 1. 합성 과정 개요
RTL 코드의 연산자가 하드웨어로 변환되는 과정입니다.
c = a + b
Inference
DW01_add
Netlist
1. Timing Constraints: 목표 클럭 주파수가 높을수록 빠른 아키텍처 선택
2. Area Constraints: 면적 제한이 있으면 작은 아키텍처 선택
3. Operand Width: 비트 폭이 클수록 아키텍처 차이가 커짐
4. Optimization Goal: -area vs -timing
➕ 2. 덧셈기 (+) 합성
assign sum = a + b;assign {cout, sum} = a + b + cin;
아키텍처: rpl, cla, pparch 중 선택
아키텍처별 구조
비트 폭별 합성 결과 예측
| 비트 폭 | 느슨한 제약 | 보통 제약 | 빡빡한 제약 | 예상 게이트 |
|---|---|---|---|---|
| 8-bit | RCA (rpl) | RCA (rpl) | CLA (cla) | ~50 |
| 16-bit | RCA (rpl) | CLA (cla) | PPA (pparch) | ~100 |
| 32-bit | CLA (cla) | PPA (pparch) | PPA (pparch) | ~200 |
| 64-bit | CLA (cla) | PPA (pparch) | PPA (pparch) | ~400 |
➖ 3. 뺄셈기 (-) 합성
뺄셈은 2의 보수 덧셈으로 변환됩니다!
a - b = a + (~b) + 1
assign diff = a - b;
diff = a + (~b) + 1→ Inverter + Adder (Cin=1)
✖️ 4. 곱셈기 (*) 합성
곱셈기는 덧셈기보다 10~20배 큰 면적을 차지합니다!
assign prod = a * b;결과 폭: N + M bits
Booth + Wallace Tree
곱셈기 구현 옵션
| 타입 | DW 모듈 | Latency | 면적 | 용도 |
|---|---|---|---|---|
| Combinational | DW02_mult | 1 cycle | 최대 | 고속 필요시 |
| 2-Stage Pipeline | DW02_mult_2_stage | 2 cycle | 중간 | 타이밍 완화 |
| Multi-cycle | DW_mult_seq | N cycle | 최소 | 면적 우선 |
비트 폭별 예상 게이트 수
| 비트 폭 | 예상 게이트 | 상대 비용 |
|---|---|---|
| 8 × 8 | ~400 | 1x |
| 16 × 16 | ~2,000 | 5x |
| 32 × 32 | ~8,000 | 20x |
| 64 × 64 | ~30,000 | 75x |
➗ 5. 나눗셈기 (/) 합성
하드웨어에서 나눗셈은 되도록 피하십시오!
assign q = a / b; 한 줄이 합성 시간 폭발과 Timing Violation의 주범이 됩니다.
나눗셈이 어려운 이유
| 연산 | Logic Depth | 32-bit 게이트 | 상대 비용 |
|---|---|---|---|
| 덧셈 (+) | ~10 levels | ~200 | 1x |
| 곱셈 (*) | ~30 levels | ~8,000 | 40x |
| 나눗셈 (/) | ~100+ levels | ~20,000+ | 100x |
나눗셈 대안 전략
🔢 6. 나머지 (%) 합성
나머지 연산은 나눗셈과 비슷한 복잡도를 가집니다.
a % 2n = a[n-1:0]
합성 툴이 자동으로 인식하여 게이트 없이 단순 wire 연결로 변환합니다!
⚖️ 7. 비교 연산자 합성
| 연산자 | DW 모듈 | 구조 | 게이트 (32-bit) |
|---|---|---|---|
| == | DW01_cmp2 | XOR + NOR Tree | ~50 |
| != | DW01_cmp2 | XOR + OR Tree | ~50 |
| <, > | DW01_cmp2 | Subtractor | ~100 |
| <=, >= | DW01_cmp2 | Subtractor + EQ | ~120 |
🔄 8. Signed vs Unsigned
데이터 타입에 따라 합성 결과가 완전히 달라집니다!
Unsigned
reg [7:0] a;
• 범위: 0 ~ 255
• 비교: 단순 magnitude
• 곱셈: 기본 multiplier
Signed
reg signed [7:0] a;
• 범위: -128 ~ 127
• 비교: MSB 고려 필요
• 곱셈: Sign extension 필요
한쪽만 signed이면 Verilog는 unsigned로 처리합니다!
반드시 $signed()로 명시적 변환하세요.
🔗 9. 연산 조합 최적화
합성 툴은 연산 조합을 인식하여 최적화된 단일 유닛으로 합성합니다.
MAC (Multiply-Accumulate)
c = a * b + d;
단일 MAC 유닛
인식되는 연산 패턴
| RTL 패턴 | DW 모듈 | 최적화 효과 |
|---|---|---|
| a * b + c | DW02_mac | Adder 공유 |
| a * b + c * d | DW02_multp | 부분곱 병합 |
| acc + a * b | DW02_mac | 누적 최적화 |
| a * b - c | DW02_mac | 감산 통합 |
🧙♂️ 10. 실전 최적화 팁
➕ 덧셈/뺄셈:
• 타이밍 여유 있으면 그냥 쓰세요 (툴이 알아서 최적화)
• 빡빡하면 파이프라인 분할 고려
✖️ 곱셈:
• 상수 곱셈은 Shift+Add로 변환 검토
• a * 3 = a + (a << 1)
• a * 5 = a + (a << 2)
➗ 나눗셈:
• 2의 거듭제곱이면 Shift 사용
• 상수 나눗셈은 역수 곱셈으로 변환
• 불가피하면 Sequential Divider 사용
% 나머지:
• 2의 거듭제곱이면 AND 마스크 사용
• a % 8 = a & 7
합성 로그 확인 포인트
📌 핵심 요약
| 연산 | DW 모듈 | 상대 비용 | 주의사항 |
|---|---|---|---|
| + / - | DW01_add | 1x | 기본 |
| * | DW02_mult | 20~40x | 상수는 Shift로 |
| / | DW_div | 100x+ | 가능하면 회피! |
| % | DW_div | 100x+ | 2^n은 AND로 |
| < > == | DW01_cmp2 | 0.5x | - |
황금률: 합성 툴을 믿되, 로그를 확인하라. rpl → pparch 변화를 관찰하면 아키텍처 선택을 이해할 수 있습니다.
댓글
댓글 쓰기