본문 바로가기
HW Design/1. Verilog HDL Basic

[Using the Always Block] 2. Blocking, Non-Blocking 할당

by 한PU 2024. 1. 10.
728x90
반응형
  • blocking , non-blocking 할당
    • non-blocking 할당
      • 코드 작성시 <= 기호 사용
      • 순차 논리 회로 구현
      • 할당 직후 업데이트 X
        • 할당 스케줄링을 사용하여 값을 업데이트
    • blocking 할당
      • 코드 작성시 = 기호 사용
      • continuous assignment 사용 시 항상 blocking 할당만 사용 가능
      • 조합 논리 회로 구현
      • 이해하기 쉽다.
        • 신호 할당 시 코드 줄이 실행되는 즉시 신호가 값을 업데이
    • procedural 블록에서는 두 가지 유형 모두 사용 가능.

Assignment Scheduling

  • non-block 할당을 통해 코딩시 코드는 순차적으로 실행.
  • But, 할당하는 신호는 이러한 방식으로 업데이트 X
  • 트위스트 링 카운터 회로 예시

twisted ring counter

  • 코드
always @(posedge clock) begin
    q_dff1 <= ~q_dff2;
    q_dff2 <= q_dff1;
end
728x90
  • 신호가 즉시 업데이트 된다면?
    • 초기값 둘 다 0b 가정
    • 2번째 줄에서 q_dff1 에 1b 업데이트
    • 3번째 줄에서 곧바로 q_dff1이 1b가 되어 q_dff2도 1b가 됨.
  • 이 문제를 해결하기 위해
    • non-blocking 할당은 scheduled 할당을 사용.
      • 신호 변경은 할당 직후가 아닌 미래에 이루어지도록 예약.
        • 일반적으로 시뮬레이션 주기가 끝날 때 신호는 값을 업데이트.
  • 예약 할당의 이해를 위해 이중 플립플롭 회로를 보자.
  • 코드
always @(posedge clock) begin
    q_dff1 <= q_dff2;
    q_dff2 <= q_dff1;
end
  • 먼저 q_dff1에 값 입력.
  • 이후 원래 q_dff1의 값을 q_dff2에 입력.
    • Q(t)와 Q(t+1)의 관계.
    • 항상 Q(t)와 짝을 이루어야 함.
    • 디지털공학(2) 중간고사 틀린 내용
  • 한 사이클이 끝나고, 신호에 값 업데이트
  • 이후 동작 반복.

Synthesis Example

  • 두 할당 비교를 위해, 트위스트 링 카운터 회로를 다시 모델링
always @(posedge clock) begin
    q_dff1 <= ~q_dff2;
    q_dff2 <= q_dff1;
end
  • vivado 등을 통해 회로도를 볼 수 있다.

반응형

ring counter diagram

  • 2개의 FF, NOT gate는 LUT1을 사용해 구현

 

  • blocking 할당을 사용할 경우

blocking ring counter diagram

always @(posedge clock) begin
	q_dff1 = ~q_dff2;
    q_dff2 = q_dff1;
end
  • 두 번째 FF 제거
    • blocking 할당은 바로 신호를 업데이트
    • 즉, 두 번째 ff은 필요가 없음.
  • blocking 할당은
    • 조합 논리 회로 모델링 시에만 사용.
    • 코드 이해, 유지 관리 목적
728x90
반응형