HDL과 검증

2단 시프트 레지스터를 의도하여 위와 같이 블로킹 대입(=)으로 작성했다. 발생하는 문제로 올바른 것은?

always @(posedge clk) begin
    q1 = d;
    q2 = q1;
end
  1. Aq2에는 같은 에지에서 갱신된 q1(즉 d)이 들어가, 1단만큼만 지연되는 회로가 된다
  2. Bq1과 q2의 값이 영원히 0으로 유지된다
  3. 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. 블로킹 대입에서는 다음 행이 새로운 값을 사용해 버립니다.
이 분야 연습하기 분야로 돌아가기

HDL과 검증의 다른 문제

  1. Verilog에서 대입 종류를 구분해 사용할 때의 일반적인 가이드라인으로 올바른 것은?
  2. Verilog에서 "always @(*)"라고 쓰는 의미로 올바른 것은?
  3. 조합 회로를 의도하여 위와 같이 작성했다. 발생할 수 있는 문제로 올바른 것은?
  4. 조합 회로를 의도하여 위와 같이 작성하면 논리 합성으로 무엇이 만들어지는가?
  5. 위 기술에서 래치가 만들어지는 이유와 대책의 조합으로 올바른 것은?

이 분야의 비교