HDL과 검증
2단 시프트 레지스터를 의도하여 위와 같이 블로킹 대입(=)으로 작성했다. 발생하는 문제로 올바른 것은?
always @(posedge clk) begin
q1 = d;
q2 = q1;
end
- Aq2에는 같은 에지에서 갱신된 q1(즉 d)이 들어가, 1단만큼만 지연되는 회로가 된다
- Bq1과 q2의 값이 영원히 0으로 유지된다
- C올바르게 2단 시프트 레지스터가 되며 문제는 없다
정답과 해설 보기
정답: A. q2에는 같은 에지에서 갱신된 q1(즉 d)이 들어가, 1단만큼만 지연되는 회로가 된다
블로킹 대입에서는 첫 번째 행에서 q1이 곧바로 d 값으로 갱신되고, 두 번째 행의 q2에는 갱신 후의 q1, 즉 d가 들어갑니다. 그 결과 q2는 q1과 같은 값이 되어, 시뮬레이션에서도 합성한 회로에서도 1단만큼만 지연됩니다. "q1 <= d; q2 <= q1;"로 쓰면 q2에는 에지 이전의 q1이 들어가 의도대로 2단 시프트 레지스터가 됩니다. 행의 순서를 반대로 하면 동작하기도 하지만 오류의 원인이 됩니다.
- A. 올바릅니다. <=로 쓰면 2단이 됩니다.
- B. 값은 갱신됩니다.
- C. 블로킹 대입에서는 다음 행이 새로운 값을 사용해 버립니다.