인프런 커뮤니티 질문&답변

scryid님의 프로필 이미지
scryid

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

[HDL 17장] HW 의 동작을 제어하는 FSM 을 이해해보자. (실습응용편)

chapter17 tb_fsm_counter_test.v 코드 질문드립니다.

작성

·

207

·

수정됨

1

// reset_n gen
$display("Reset! [%d]", $time);
# 100
    reset_n <= 0;
# 10
    reset_n <= 1;
# 10
@(posedge clk);

tb_fsm_counter_test.v파일의

47line인 "@(posedge clk);" 문장에 대한 질문입니다.

왜 reset_n신호를 셋팅해주고 난다음에 "@(posedge clk);" 구문을 적어준 의미가 있을까요?? 해당 always문장에 아무내용도 없이 종료한 이유와 의미가 궁금합니다!.

감사합니다

답변 2

1

scryid님의 프로필 이미지
scryid
질문자

빠르고 자세한 답변 감사드립니다!

0

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

안녕하세요 🙂

문법은 기본적으로 숙지하고 계시다 생각하고 강의를 제작하였습니다.

별도 문법설명은 GPT4 를 통해서 답변드립니다.

제 설명을 먼저 드리면, testbench 내의 @(posedge clk); 은 positive edge clock 신호를 기다리겠다는 뜻의 한줄입니다.

해당 줄에 따라 waveform 을 보시면 바로 감이 오실꺼에요.

@(posedge clk);

@(posedge clk);

@(posedge clk);

...

@(posedge clk);

 

@(posedge clk); 의 개수에 따른 waveform 을 비교해보시겠어요?

 

====================GPT===============================

Testbench에서 사용되는 @(posedge clk); 구문은 Verilog HDL의 이벤트 제어 구문 중 하나로, 클록(clk)의 상승 에지(posedge)가 발생할 때까지 시뮬레이션의 실행을 일시 중지하는 역할을 합니다. 이 구문은 주로 동기식 디자인 테스트에서 클록 주기의 시작을 나타내기 위해 사용됩니다.

 

  • @(posedge clk); 구문은 시뮬레이션 중 clk 신호가 0에서 1로 변경되는 순간, 즉 상승 에지가 감지될 때까지 현재 실행 중인 프로세스를 일시 정지합니다. 상승 에지가 감지되면 이후의 명령어나 프로세스가 실행됩니다.

사용 목적

  • 시간 동기화: Testbench에서는 디자인의 정확한 동작을 확인하기 위해 클록 주기에 맞춰 입력을 주고 출력을 검사해야 합니다. @(posedge clk); 구문을 사용하면, 클록의 상승 에지에 동기화하여 입력 신호를 변경하거나 출력 신호를 검사할 수 있습니다.

  • 동기식 설계 테스트: 대부분의 디지털 시스템은 클록 기반으로 동작합니다. 클록의 상승 에지에서 데이터를 샘플링하거나 상태를 변경하는 등의 동작이 발생합니다. 이러한 동작을 모의하고 검증하기 위해 @(posedge clk); 구문을 사용합니다.

예제 사용

verilogCopy codeinitial begin
    // 초기 조건 설정
    reset = 1;
    @(posedge clk); // 첫 번째 클록의 상승 에지까지 기다림
    reset = 0;
    // 이후의 시뮬레이션 동작
end

이 예제에서는 시뮬레이션을 시작하고, 첫 번째 클록의 상승 에지를 기다린 후에 리셋 신호를 비활성화합니다. 이러한 방식으로 테스트벤치에서 클록 주기에 맞춰 테스트 시나리오를 수행할 수 있습니다.

정리

@(posedge clk); 구문은 Verilog에서 클록 주기의 시작을 정확히 포착하고, 동기식 디자인의 동작을 테스트하기 위해 필수적으로 사용됩니다. 디자인의 동작을 클록 신호에 맞춰 정확하게 검증하고자 할 때 유용하게 사용됩니다.

scryid님의 프로필 이미지
scryid

작성한 질문수

질문하기