31 / 63 · 개념
Nonblocking 대입과 동시 상태 갱신
이전 값과 다음 값을 분리해 파이프라인·카운터 RTL을 정확히 해석합니다.
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
오른쪽 식은 이전 상태로 평가합니다
클록 기반 순차 블록에서 <=는 오른쪽 식을 평가한 뒤 nonblockingnonblocking 순차 RTL에서 <=로 표현하는 대입입니다. 우변을 평가한 뒤 갱신을 예약하므로 같은 에지의 레지스터들이 이전 상태를 기준으로 계산할 수 있습니다. 갱신 단계에 결과를 반영합니다. 같은 에지에 여러 레지스터레지스터 여러 비트의 상태를 저장하는 회로입니다. 이 과정의 동기식 레지스터는 클록 에지에서 정해진 입력을 저장합니다. 자세히 보기를 갱신할 때 코드의 줄 순서에 따라 새 값이 다음 레지스터로 연달아 전달되지 않도록 작성할 수 있습니다.
always_ff @(posedge clk) begin
if (rst) begin
a <= 8'd0;
b <= 8'd0;
end else begin
a <= d;
b <= a;
end
end초기 a=b=0이고 입력이 5, 9, 2라면 에지 이후 (a,b)는 (5,0), (9,5), (2,9)입니다. 두 번째 줄이 갱신된 a를 읽는다고 해석하면 파이프라인파이프라인 계산을 레지스터로 구분한 단계로 나누어 여러 입력을 겹쳐 처리하는 구조입니다. 데이터와 valid, 제어 신호의 단계 정렬이 필요합니다. 자세히 보기의 한 단계를 건너뛰어 계산한 셈입니다.
각 열에는 한 상승 에지상승 에지 클록이 0에서 1로 바뀌는 순간입니다. CLK=1인 구간 전체를 뜻하는 레벨과 구별합니다. 자세히 보기에서 관찰한 값을 기록했습니다. 입력은 에지 직전의 값이고, 이름에 after가 붙은 상태는 갱신 직후의 값입니다. 열은 값을 관찰한 순서대로 배치한 것이며, 실제 전파 지연전파 지연 입력이 바뀐 뒤 출력이 올바른 값으로 안정되기까지 걸리는 시간입니다. 논리식의 등가성과 시간 특성은 별개입니다. 자세히 보기을 나타내지는 않습니다. a=b=0에서 시작합니다. a가 새 d를 저장하는 동안 b는 이전 a를 저장하므로 두 행에 나타난 값은 한 에지씩 차이가 납니다.
파형 데이터 보기
| 신호 | 파형 | 버스 값 |
|---|---|---|
| edge | 234 | E0 → E1 → E2 |
| d | 234 | 5 → 9 → 2 |
| a after | 234 | 5 → 9 → 2 |
| b after | 234 | 0 → 5 → 9 |
blocking으로 바꾸면 왜 위험한가
같은 블록에서 a=d; b=a;로 바꾸면 b의 계산은 그 블록에서 이미 바뀐 a를 사용할 수 있습니다. 다른 순차 블록과의 실행 순서에 따라 race가 생길 수도 있습니다. 조합 계산에는 blocking, 상태 저장에는 nonblocking을 기본 원칙으로 삼고, 다른 방식을 쓸 때는 이벤트 처리 순서에 어떤 영향을 주는지 설명할 수 있어야 합니다.
같은 레지스터에 여러 번 대입하지 않기
한 절차 안에서 같은 q에 여러 nonblocking 대입을 실행시키면 마지막으로 실행된 대입이 결과를 정할 수 있습니다. 여러 개의 독립적인 if문으로 우선순위를 알아보기 어렵게 만들기보다 if / else if / else 또는 명시적인 next-state 변수로 기능을 표현하세요. 여러 블록에서 같은 레지스터를 구동하는 것은 피해야 합니다.
RTL 검토에서는 각 레지스터마다 다음 상태 식을 하나씩 적어 보면 효과적입니다. 식이 두 개 나오거나 특정 조건에서 다음 상태가 정해지지 않으면 코드의 제어 우선순위를 다시 살펴봐야 합니다.
직접 생각해 보기
초기 a=1, b=4인 상태에서 같은 클록 블록에 a<=b; b<=a;를 실행하면 한 에지와 두 에지 뒤 상태는 무엇인가요?
해설 보기
한 에지 뒤 (a,b)=(4,1), 두 에지 뒤 (1,4)입니다. 두 대입이 같은 이전 상태를 읽으므로 a와 b의 값이 서로 바뀝니다. a=b; b=a;로 작성하면 순서에 따라 둘 다 이전 b가 될 수 있어 같은 기능이 아닙니다.