작성
·
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
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에서 클록 주기의 시작을 정확히 포착하고, 동기식 디자인의 동작을 테스트하기 위해 필수적으로 사용됩니다. 디자인의 동작을 클록 신호에 맞춰 정확하게 검증하고자 할 때 유용하게 사용됩니다.