Skip to content
DevBJ
Go back

Verilog 곱셈 연산자 *는 FPGA에서 어떻게 합성될까

Updated:
Editor

합성 가능한 Verilog에서 *를 사용해 곱셈을 표현할 수 있다. 다만 전용 DSP block을 반드시 쓰는 것은 아니며, 결과 자원은 operand 폭, 대상 FPGA와 synthesis 설정에 따라 달라진다.

곱셈 결과 폭을 먼저 정하기

unsigned N-bit 두 값의 최대 곱을 모두 보존하려면 최대 2N bit가 필요하다. 아래 4-bit 입력은 최대 15 × 15 = 225이므로 8-bit 결과가 필요하다.

logic [3:0] a, b;
wire [7:0] a_ext, b_ext;
wire [7:0] product;

assign a_ext = {4'b0, a};
assign b_ext = {4'b0, b};
assign product = a_ext * b_ext;

피연산자를 목표 폭으로 명시적으로 확장해 표현식의 폭을 분명히 했다. 실제 parameterized 설계에서는 operand가 signed인지도 구분해 올바른 방식으로 부호 확장해야 한다. signed 숫자 표현은 Verilog 숫자 literal과 signed vector에서 다룬다.

DSP 사용 여부 확인

곱셈 연산자는 FPGA synthesis에서 DSP 자원으로 매핑될 수도 있고 LUT 기반 로직으로 구현될 수도 있다. 작은 곱셈은 최적화 과정에서 다른 논리와 합쳐질 수 있으며, device와 timing constraint도 구현에 영향을 준다.

합성 뒤에는 아래 항목을 확인한다.

  1. utilization report의 DSP와 LUT 사용량
  2. 합성 schematic의 곱셈 구현
  3. timing report의 곱셈 경로 지연
  4. signedness, operand 폭, 결과 폭과 잘림 warning

타이밍이나 자원 문제가 확인되기 전부터 곱셈을 직접 shift-add 회로로 바꿀 필요는 없다. 수동 구현은 결과 폭과 signed 동작을 다시 검증해야 한다.

파이프라인이 필요한 경우

곱셈 결과를 register로 나누면 timing을 맞추는 데 도움이 될 수 있지만 latency와 interface 동작도 함께 바뀐다. 곱셈만 따로 register하지 말고 관련 valid, control, operand 지연도 같은 cycle 기준으로 맞춘다.

공식 자료

원문 기록

한 줄 요약

곱셈은 *로 기술하고, 결과 폭과 signedness를 분명히 한 뒤 실제 DSP/LUT 사용량과 timing을 synthesis report에서 확인한다.


Share this post on:

Previous Post
Verilog case 문에서 default와 latch를 함께 확인하는 방법
Next Post
Verilog 숫자 literal과 signed vector의 폭 확인하기