[VerilogHDL] 10_블록킹과 논블록킹

10_블록킹과 논블로킹

verilogHDL

[VerilogHDL] 10_블록킹과 논블록킹

Verilog HDL에서 블록킹(=)과 논블록킹(<=) 할당은 신호 할당에 사용되는 두 가지 주요 연산자입니다. 이들 간에는 중요한 동작 및 사용 방식의 차이가 있습니다.

1. 블록킹 할당 (Blocking Assignment)

  • 블록킹 할당은 동작이 순차적으로 진행되며 한 줄씩 실행됩니다.
  • 할당 연산자인 '='를 사용하여 변수에 값을 할당합니다.
  • 블록킹 할당은 동작이 완료될 때까지 대기하고 다음 문장으로 진행합니다.
  • 따라서 블록킹 할당 이후의 문장들은 할당문이 완료되어야 해당 값을 사용할 수 있습니다.
  • 블록킹 할당은 일반적으로 순차적인 동작이 필요한 경우에 사용됩니다.
module BlockingAssignmentExample;
  reg [3:0] a = 5;
  reg [3:0] b = 3;
  reg [3:0] result;

  always @* begin
    result = a + b;  // 블록킹 할당
    $display("Result: %d", result);
    a = 8;          // 블록킹 할당
    $display("Updated a: %d", a);
  end
endmodule

위의 예제에서 첫 번째 블록킹 할당 문장은 a + b의 결과를 result에 할당합니다. 그리고 이후에 result 값을 출력하고, 두 번째 블록킹 할당 문장은 a에 새로운 값을 할당합니다. 이 때, 두 번째 할당 문장이 실행되기 전까지는 result 값이 업데이트 되지 않습니다.

2. 논블록킹 할당 (Non-blocking Assignment):

  • 논블록킹 할당은 동작이 동시에 진행되며 모든 할당문이 동시에 실행 됩니다.
  • 할당 연산자인 '<='를 사용하여 변수에 값을 할당합니다.
  • 논블록킹 할당은 동작이 완료되지 않고 다음 문장으로 진행합니다.
  • 따라서 논블록킹 할당 이후의 문장들은 할당문이 완료되지 않아도 해당 값을 사용할 수 있습니다.
  • 논블록킹 할당은 동시성을 표현하고자 할 때 주로 사용됩니다.
module NonblockingAssignmentExample;
  reg [3:0] a = 5;
  reg [3:0] b = 3;
  reg [3:0] result;

  always @* begin
    result <= a + b;  // 논블록킹 할당
    $display("Result: %d", result);
    a <= 8;          // 논블록킹 할당
    $display("Updated a: %d", a);
  end
endmodule

위의 예제에서 첫 번째 논블록킹 할당 문장은 a + b의 결과를 result에 할당합니다. 그리고 이후에 result 값을 출력하고, 두 번째 논블록킹 할당 문장은 a에 새로운 값을 할당합니다. 이 때, 두 번째 할당 문장이 실행되더라도 result 값이 즉시 업데이트되지 않고 이전 값을 유지하고 있습니다.

블록킹 할당과 논블록킹 할당은 동작 방식에 차이가 있으므로, 상황에 맞게 적절한 할당 방식을 선택하여 사용해야 합니다.

3. 블로킹과 논블로킹 고려사항

블로킹 할당과 논블로킹 할당을 사용할 때는 몇 가지 제약 조건과 주의사항이 있습니다. 다음은 블로킹 할당과 논블로킹 할당의 사용 제약 조건과 주의사항에 대한 설명입니다.

1. 블로킹 할당 제약 조건

  • 블로킹 할당은 순차적인 동작을 나타내기 때문에 하나의 시점(t)에 하나의 블록을 실행해야 합니다.
  • 동일한 시점(t)에 여러 개의 블록이 동작한다면, 마지막으로 할당된 값만 유효하게 됩니다.
  • 블로킹 할당 문장을 사용할 때는 다른 블록과의 우선순위와 실행 순서를 고려 해야 합니다.

2. 논블로킹 할당 제약 조건

  • 논블로킹 할당은 병렬 동작을 표현하므로, 동일한 시점(t)에 여러 개의 논블로킹 할당 문장이 실행될 수 있습니다.
  • 따라서 동시에 실행되는 논블로킹 할당 문장들은 서로 독립적인 신호나 변수를 대상으로 해야 합니다.

3. 주의사항

  • 블로킹 할당과 논블로킹 할당을 일관되게 사용 해야 합니다. 혼합해서 사용하면 예측이 어려워지고 디버깅이 어려워질 수 있습니다.
  • 복잡한 조건문이나 반복문에서는 블로킹 할당과 논블로킹 할당을 혼합하여 사용할 때 주의가 필요합니다.
  • 시뮬레이션과 실제 하드웨어 동작 간의 차이를 고려해야 합니다. 시뮬레이션에서는 순서대로 동작하지만 실제 하드웨어에서는 동시에 실행되므로 결과가 달라질 수 있습니다.
  • 동기화가 필요한 경우 논블로킹 할당을 사용하여 동시에 실행되는 동작 을 모델링할 수 있습니다.
  • 순차적인 동작이 필요한 경우 블로킹 할당을 사용하여 동작 순서를 보장할 수 있습니다.
  • 신호의 갱신과 관련된 병렬 동작에서는 논블로킹 할당을 사용하여 모든 동작이 동시에 실행 되도록 합니다.

4. 경쟁 조건(race condition)

4.1 블로킹(Blocking) 예제

always @(posedge clk)
    a = b;
always @(posedge clk)
    b = a;

위와 같이 블로킹을 사용하게 되면 경쟁 상태 가 됩니다. a = b와 b = a 어느 것이 먼저 실행되는지는 물리적인 배치에 따라 달라집니다.

4.2 논블로킹(Non-blocking) 예제

always @(posedge clk)
    a <= b;
always @(posedge clk)
    b <= a;

클럭에 기반하여 동시에 실행되기 때문에 경쟁 상태가 발생하지 않습니다.

4.3 경쟁 조건 정리

경쟁 조건을 피하기 위해서는 블로킹과 논블로킹 할당을 일관되게 사용하거나, 상태를 명확하게 관리하여 동시에 접근하는 상황을 피해야 합니다. 일반적으로 논블로킹을 사용하여 병렬화와 파이프라인에 기반한 설계 등으로 응용합니다. 논블로킹의 단점으로 병렬화에 의한 디버깅 어려움, 복잡성 증가, 시뮬레이션 성능 저하 등의 이슈가 있습니다.

댓글 쓰기

0 댓글