절차적 할당(procedural assignments)는 연속적 할당과는 다른 개념이다.
연속 할당문의 경우 lvalue가 넷이었던 반면, 절차적 할당에서는 레지스터가 온다.
절차적 할당은 한번 할당되면 다른 값으로 갱신하기 전까지 그 값을 유지한다.
절차적 할당에서 lvalue가 될 수 있는 것으로는 다음과 같은 것들이 있다.
- reg, integer, real, 시간 레지스터, 메모리 요소
- 이러한 변수들의 비트, 부분적 비트 선택
- 위의 것들 중 몇몇의 결합
절차적 할당문에는 블록킹 문장과 논블록킹 문장, 두 가지가 있다.
- 블록킹 문장
블록킹 할당 문장은 순차 처리 블록(begin, end)에 열거된 순서대로 수행한다.
initial
begin
x = 0;
#10 count = 0;
y = 1;
end
반드시 x = 0의 문장이 수행되고 난 뒤에야 count = 0의 문장이 수행된다.
x = 0의 문장이 수행되고 다음 문장인 count = 0를 만난 뒤 10의 지연시간을 가진 후 문장이 수행되고,
문장의 수행이 모두 끝나고 다면 다음 문장인 y = 1로 넘어가게 된다.
- 논블록킹 문장
논블록킹 할당은 순차 처리 블록에서 앞선 문장의 수행이 종료되지 않았어도 할당 스케쥴링을 할 수 있게 한다.
할당을 위해서는 <= 연산자를 사용한다.
여러 개의 논블록킹 문장이 있다면, 한 논블록킹 문장을 수행한 뒤 그 문장이 수행을 마치기를 기다리지 않고 다음 논블록킹 문장을 연속적으로 스케쥴링하게 된다.
같은 블록 안에 블록킹과 논블록킹 할당이 섞여있다면 모든 블록킹 할당이 수행된 후 논블록킹 할당이 마지막에 수행되게 된다.(그러나 같은 블록 안에서 혼용하는 것은 추천하지 않음)
논블록킹 할당은 여러 데이터를 동시에 전송하기 위해 사용되곤 한다.
다음의 예제를 보자.
always @(posedge clock)
begin
reg1 <= #1 in1;
reg2 <= @(negedge clock) in2 ^ in3;
reg3 <= #1 reg1;
end
클럭의 상승 엣지에서 always 블록이 수행되고, 클럭의 하강 엣지에서 reg2 값이 갱신된다.
reg1에 대한 할당문과 reg3에 대한 할당문은 동시에 수행되는데, 먼저 rvalue인 in1, reg1을 읽는 작업이 수행되고, 지연 시간 이후 lvalue에 쓰기 작업이 수행된다.
따라서 reg3에 저장되는 값은 in1 값이 할당되기 이전의 reg1의 값이 할당된다.
다음과 같은 상황 역시 생각해볼 수 있다.
//경우 1 - 블록킹 할당
always @(posedge clock)
a = b;
always @(posedge clock)
b = a;
//경우 2 - 논블록킹 할당
always @(posedge clock)
a <= b;
always @(posedge clock)
b <= a;
경우 1에서는 a = b라는 할당문과 b = a라는 할당문이 순차적으로 실행되어야 하므로 경쟁상태가 된다.
두 구문 중 어느 구문이 먼저 실행되는가는 알 수 없지만, 먼저 실행된 구문이 작업을 모두 끝마친 뒤에야 다른 구문이 수행된다.
따라서 결론적으로 a와 b의 값은 모두 이전의 a, b 둘 중 하나의 값만을 갖게 될 것이다.
반면 경우 2에서는 두 구문이 동시에 수행되게 된다.
rvalue인 b와 a의 값을 읽어오는 행위가 함께 수행되며, lvalue에 값을 쓰는 작업 역시 각각 독립적으로 수행되게 된다.
따라서 이 경우에는 a와 b의 값이 swap된다.
다만 논블록킹 할당은 시뮬레이터의 성능을 하락시키고 메모리 사용량을 늘릴 수 있다는 단점을 가지고 있다.
Reference: Samir Palnitkar - Verilog HDL 2판
'EE > Verilog' 카테고리의 다른 글
[Verilog] 사건 기반 타이밍 제어 (0) | 2023.01.17 |
---|---|
[Verilog] 지연 기반 타이밍 제어 (0) | 2023.01.17 |
[Verilog] initial과 always 구문 (0) | 2023.01.16 |
[Verilog] 연산자 정리 (0) | 2023.01.11 |
[Verilog] 데이터 플로우 모델링, assign 연속 할당문 (0) | 2023.01.11 |