15 / 37 · 개념
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; b=a;로 작성하면 순서에 따라 둘 다 이전 b가 될 수 있어 같은 기능이 아닙니다.