HDL과 검증
always @(*) begin
sum = sum + in;
end입력 in을 계속 더하는 누산기로 만들 생각으로 위와 같이 작성했다. 이 기술의 문제점과 수정 방법의 조합으로 올바른 것은?
- A문제는 없으며, in이 바뀔 때마다 sum에 in을 1번씩 더하는 회로가 합성된다
- B감도 목록에 빠진 신호가 있어 시뮬레이션과 합성 결과가 어긋난다. @(in)으로 고쳐 쓴다
- C가산기의 출력이 플립플롭을 거치지 않고 자신의 입력으로 되돌아가 값이 정해지지 않는다. always @(posedge clk) 안에서 sum <= sum + in;으로 작성하여 클록마다 1번씩 더한다
정답과 해설 보기
정답: C. 가산기의 출력이 플립플롭을 거치지 않고 자신의 입력으로 되돌아가 값이 정해지지 않는다. always @(posedge clk) 안에서 sum <= sum + in;으로 작성하여 클록마다 1번씩 더한다
always @(*)는 조합 회로를 나타내므로, 이 기술은 'sum을 입력으로 하는 가산기의 출력을 그대로 sum에 연결하는' 회로가 됩니다. 플립플롭이 없으므로 가산기의 출력이 바뀌면 입력도 바뀌어, 값이 계속 돌면서 정해지지 않는 조합 루프가 됩니다. 정적 타이밍 분석으로도 다룰 수 없으며, 많은 Lint 도구나 논리 합성 도구가 경고나 오류를 냅니다. 값을 누적하는 회로에는 클록의 상승 에지에서 1번씩 값을 갱신하는 플립플롭을 넣습니다. always @(posedge clk) 안에서 논블로킹 대입을 사용하고, 리셋으로 초기값도 정합니다.