HDL과 검증

always @(*) begin
    sum = sum + in;
end

입력 in을 계속 더하는 누산기로 만들 생각으로 위와 같이 작성했다. 이 기술의 문제점과 수정 방법의 조합으로 올바른 것은?

  1. A문제는 없으며, in이 바뀔 때마다 sum에 in을 1번씩 더하는 회로가 합성된다
  2. B감도 목록에 빠진 신호가 있어 시뮬레이션과 합성 결과가 어긋난다. @(in)으로 고쳐 쓴다
  3. C가산기의 출력이 플립플롭을 거치지 않고 자신의 입력으로 되돌아가 값이 정해지지 않는다. always @(posedge clk) 안에서 sum <= sum + in;으로 작성하여 클록마다 1번씩 더한다
정답과 해설 보기

정답: C. 가산기의 출력이 플립플롭을 거치지 않고 자신의 입력으로 되돌아가 값이 정해지지 않는다. always @(posedge clk) 안에서 sum <= sum + in;으로 작성하여 클록마다 1번씩 더한다

always @(*)는 조합 회로를 나타내므로, 이 기술은 'sum을 입력으로 하는 가산기의 출력을 그대로 sum에 연결하는' 회로가 됩니다. 플립플롭이 없으므로 가산기의 출력이 바뀌면 입력도 바뀌어, 값이 계속 돌면서 정해지지 않는 조합 루프가 됩니다. 정적 타이밍 분석으로도 다룰 수 없으며, 많은 Lint 도구나 논리 합성 도구가 경고나 오류를 냅니다. 값을 누적하는 회로에는 클록의 상승 에지에서 1번씩 값을 갱신하는 플립플롭을 넣습니다. always @(posedge clk) 안에서 논블로킹 대입을 사용하고, 리셋으로 초기값도 정합니다.

이 분야 연습하기 분야로 돌아가기

관련 계산 도구

HDL과 검증의 다른 문제

  1. Verilog 등의 HDL로 작성한 기술과 C 언어 등의 소프트웨어 프로그램의 큰 차이로 올바른 것은?
  2. Verilog에서 module을 사용하는 목적으로 올바른 것은?
  3. Verilog의 wire형과 reg형의 차이로 올바른 것은?
  4. 위의 Verilog assign문이 나타내는 회로로 올바른 것은?
  5. 위의 Verilog 기술이 논리 합성으로 만드는 회로로 올바른 것은?

이 분야의 비교