Altifigence Academy

15 / 37 · 개념

Nonblocking 대입과 동시 상태 갱신

이전 값과 다음 값을 분리해 파이프라인·카운터 RTL을 정확히 해석합니다.

오른쪽 식은 이전 상태로 평가합니다

클록 기반 순차 블록에서 <=는 오른쪽 식을 평가한 뒤 nonblockingnonblocking 순차 RTL에서 <=로 표현하는 대입입니다. 우변을 평가한 뒤 갱신을 예약하므로 같은 에지의 레지스터들이 이전 상태를 기준으로 계산할 수 있습니다. 갱신 단계에 결과를 반영합니다. 같은 에지에 여러 레지스터레지스터 여러 비트의 상태를 저장하는 회로입니다. 이 과정의 동기식 레지스터는 클록 에지에서 정해진 입력을 저장합니다. 자세히 보기를 갱신할 때 코드의 줄 순서 때문에 새 값이 연쇄적으로 통과하지 않도록 작성할 수 있습니다.

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    a <= 8'd0;
    b <= 8'd0;
  end else begin
    a <= d;
    b <= a;
  end
end
ak+1=dk,bk+1=aka_{k+1}=d_k,\qquad b_{k+1}=a_k

초기 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를 저장하므로 두 행이 한 단계 어긋납니다.

a와 b는 같은 이전 상태를 읽습니다
파형 데이터 보기
파형 데이터: 각 문자는 한 구간, 점은 이전 상태 유지, p는 클록 한 주기입니다.
신호파형버스 값
edge234E0 → E1 → E2
d2345 → 9 → 2
a after2345 → 9 → 2
b after2340 → 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가 될 수 있어 같은 기능이 아닙니다.

선택은 이 브라우저에만 적용됩니다. 언제든 푸터에서 변경할 수 있습니다.