카테고리 없음
Verilog에서 =와 <= 연산자 차이
Captain Herlock
2025. 4. 17. 10:48
반응형
Verilog에서 =와 <= 연산자는 매우 다른 의미와 동작을 가집니다.
= (블로킹 할당, Blocking Assignment)
- 실행 시점: 즉시 실행되며, 순차적으로 처리됩니다.
- 하드웨어 해석: 조합 논리(combinational logic)를 표현합니다.
- 특징: 같은 always 블록 내에서 이후 문장에 영향을 줍니다.
- 주요 용도: 조합 논리 회로, always @(*) 블록 내에서 주로 사용합니다.
<= (논블로킹 할당, Non-blocking Assignment)
- 실행 시점: always 블록 내 모든 우변이 평가된 후 일괄적으로 변수에 할당됩니다.
- 하드웨어 해석: 순차 논리(sequential logic), 즉 플립플롭을 표현합니다.
- 특징: 같은 always 블록 내에서 이후 문장에 영향을 주지 않습니다.
- 주요 용도: 순차 논리 회로, always @(posedge clk) 블록 내에서 주로 사용합니다.
제시된 코드에서의 사용 예시
예를 들어, 코드에서 다음 부분을 보면:
verilog
// 블로킹 할당(=) 사용:
interp_h1 <= ((8'd255 - alpha) * top_left + alpha * top_right) >> 8;
// 논블로킹 할당(<=) 사용:
if (!rst_n) begin
state <= IDLE;
out_x_counter <= 0;
out_y_counter <= 0;
}
- 순차 논리에 <= 사용: 레지스터(state, counter 등)는 클럭 에지에서 값을 갱신하는 순차 논리이므로 논블로킹 할당(<=)을 사용합니다.
- 계산에 <= 사용: 원칙적으로는 조합 논리 계산에 블로킹 할당(=)을 사용하는 것이 일반적이지만, 이 코드에서는 계산 결과도 레지스터에 저장하기 위해 논블로킹 할당을 사용했습니다.
잘못된 사용으로 인한 문제
잘못된 할당 연산자 사용은 다음과 같은 문제를 일으킬 수 있습니다:
- 레이스 컨디션: 순차 로직에 블로킹 할당을 사용하면 예상치 못한 데이터 레이스가 발생할 수 있습니다.
- 합성 불일치: 시뮬레이션과 합성 결과가 다를 수 있습니다.
- 래치 생성: 조합 로직에서 모든 조건을 처리하지 않고 논블로킹 할당을 사용하면 의도치 않은 래치가 생성될 수 있습니다.
제시된 코드에서는 대부분 적절하게 논블로킹 할당(<=)을 사용하고 있습니다. 이는 대부분의 로직이 순차 로직(클럭에 동기화된 레지스터)이기 때문입니다. 하지만 성능 최적화와 하드웨어 구현 명확성을 위해 조합 로직 계산에는 블로킹 할당(=)을 사용하고, 그 결과를 레지스터에 저장할 때만 논블로킹 할당(<=)을 사용하는 것이 더 좋은 관행입니다.