해결된 질문
작성
·
13
0
wire a_and_b;
assign a_and_b = a&b;
이런 식으로 wire를 선언하고 assign을 하는 것과
wire a_and_b = a & b
이런 식으로 wire 선언하면서 값을 할당하는 것이 합성할 때 차이가 없나요? 둘 중에 편한 것을 사용하면 되나요?
두 번째 방식을 사용하면 합성할 때 문제가 생길 수도 있다고 들은 것 같아서 질문드립니다.
답변 1
0
안녕하세요, 답변 남겨드립니다.
작성해주신 두 가지 Verilog 코드 스타일
wire a_and_b;
assign a_and_b = a & b;
와
wire a_and_b = a & b;
는 합성(Synthesis) 결과 측면에서는 동일한 하드웨어 구조를 만듭니다. 즉, 논리 게이트 수준에서 보면 단순히 a & b
를 구현하는 AND 게이트가 생성되므로 RTL에서 차이는 없습니다.
다만 차이가 발생하는 부분은 Verilog 문법 해석 방식과 합성 툴의 지원 범위입니다.
첫 번째 방식은 전통적인 Verilog 스타일로, wire
신호를 선언한 뒤 assign
을 통해 값을 바인딩하는 구조입니다. 대부분의 합성 툴과 시뮬레이터에서 명확하게 지원되며, RTL 코딩 가이드라인에서도 가장 많이 권장되는 방식입니다. 예를 들어 ASIC 설계 시 Synopsys Design Compiler, Cadence Genus 같은 툴에서 안정적으로 합성됩니다.
두 번째 방식은 Verilog-2001 이후 문법에서 허용된 wire 선언과 동시에 continuous assignment 방식입니다. 합성 툴에 따라 지원이 다르거나 제한이 있을 수 있으며, 특히 구형 합성기나 Lint 툴에서는 warning을 발생시키는 경우가 있습니다. 예를 들어, Mentor Questa Lint 같은 환경에서는 일부 rule set에서 "declaration with assignment is discouraged"라는 메시지를 띄우기도 합니다.
실무적으로는 팀에서 정한 코딩 컨벤션을 따르는 것이 중요합니다. 예를 들어 삼성전자나 하이닉스 RTL 코딩 가이드라인에서는 첫 번째 방식(assign
)을 권장하는 경우가 많습니다. 이유는 코드의 가독성과 디버깅 편의성 때문입니다. 예를 들어,
wire a_and_b = a & b;
wire c_and_d = c & d;
wire result = a_and_b | c_and_d;
와 같이 연속적으로 선언·할당하는 방식은 깔끔해 보이지만, signal dependency 추적이나 gate-level netlist 확인 시 assign
구문이 명확한 연결을 보여주는 장점이 있습니다.
정리하자면, 합성 결과 자체에는 차이가 없으므로 둘 다 사용해도 하드웨어적으로 동일합니다. 다만 합성기 호환성과 팀 코딩 스타일을 고려할 때는 첫 번째 방식(assign 사용)이 더 안정적이고 널리 권장됩니다. 실제 대규모 SoC 프로젝트에서는 Lint tool, CDC tool, Formal tool 등이 모두 assign
구문에 최적화된 parsing rule을 적용하는 경우가 많습니다.