절차적 할당문의 두 가지 형태
Blocking문
Blocking문은 순차적 블록에 열거된 순서대로 수행된다. "=" 연산자를 사용한다.
reg x, y, z;
reg [15:0] reg_a, reg_b;
integer count;
// 모든 행위 수준 문장은 반드시 initial 또는 always블록 안에서 수행.
initial
begin
x = 0; // 스칼라 할당
y = 1;
z = 1;
count = 0; // 정수 변수의 할당
reg_a = 16'b0;
reg_b = reg_a; // 벡터의 초기화
#15 reg_a[2] = 1'b1; // 지연을 가지고 있는 비트 선택 할당
#10 reg_b[15:13] = {x, y, z}; // 벡터의 부분적 선택에 연결의 결과를 할당.
count = count + 1; // 카운트 증가
end
blocking문의 특성에 따라 모든 문장은 begin-end내에서 순차적으로 수행된다.
Non-blocking문
Non-blocking할당은 순차적 블록내 앞선 문장이 끝나지 않아도 할당 스케줄링을 할 수 있게 해 준다. "<=" 연산자를 이용한다. 관계 연산자와 헷갈리지 말자.
reg x, y, z;
reg [15:0] reg_a, reg_b;
integer count;
// 모든 행위 수준 문장은 반드시 initial 또는 always블록 안에서 수행.
initial
begin
x = 0; // 스칼라 할당
y = 1;
z = 1;
count = 0; // 정수 변수의 할당
reg_a = 16'b0;
reg_b = reg_a; // 벡터의 초기화
#15 reg_a[2] <= 1'b1; // 지연을 가지고 있는 비트 선택 할당
#10 reg_b[15:13] <= {x, y, z}; // 벡터의 부분적 선택에 연결의 결과를 할당.
count <= count + 1; // 카운트 증가
end
값의 초기화는 순차적으로 진행되지만, 마지막 3개의 non-blocking문장은 다음과 같은 시뮬레이션 시간에 수행된다.
디지털 설계에서 non-blocking문은 공통적인 사건 후에 동시에 데이터 전송이 일어나는 곳에서 사용한다. (ex. flip-flop과 같은 clk에 동기화되는 sequential logic)
단점으로는 시뮬레이터 성능을 하락시키고 메모리 사용량을 늘리는 것의 원인이 될 수도 있다.