해결된 질문
작성
·
315
·
수정됨
1
안녕하세요 21장 의 testbench를 돌려서 waveform을 살펴보는 중에 질문이 생겼습니다.
// Step 4. Registering (Capture) number of Count reg [CNT_BIT-1:0] num_cnt; always @(posedge clk or negedge reset_n) begin if(!reset_n) begin num_cnt <= 0; end else if (i_run) begin num_cnt <= i_num_cnt; end else if (o_done) begin num_cnt <= 0; end end
위는 제공해주신 data_mover_bram.v 코드 의 일부분입니다.
위 waveform을 보면 i_run이 1이 되는 순간 바로 num_cnt 값이 i_num_cnt로 바뀌지만
o_done 이 1이 되는 순간에는 num_cnt 값이 0이 되지 않고 1cycle 뒤에 반영이 되나요?
보통은 o_done과 같이 한 cycle 뒤에 값이 stable 할때 값이바뀌는것이 맞이 않나요?
그것이 맞다면 i_run에서 125ns 일때 이미 i_run 하고 i_num_cnt 가 stable 상태라는 것인데 i_num_cnt 는 이미 그전에 stable한것을 볼 수 있지만 i_run은 그 전에 stable 하다고 볼 수 있는 이유를 못찾겠습니다.
답변 1
0
안녕하세요 🙂
코드를 보니 o_done 이면, 다음 cycle 에 num_cnt 가 0 으로 돌아가도록 설계가 되어 있네요.
o_done 이 1이 되는 순간에는 num_cnt 값이 0이 되지 않고 1cycle 뒤에 반영이 되나요?
F/F 이기 때문에 다음 cycle 에 반영됩니다. 지극히 정상이에요.
그것이 맞다면 i_run에서 125ns 일때 이미 i_run 하고 i_num_cnt 가 stable 상태라는 것인데 i_num_cnt 는 이미 그전에 stable한것을 볼 수 있지만 i_run은 그 전에 stable 하다고 볼 수 있는 이유를 못찾겠습니다.
질문이 잘 이해가 안되는데요.
생각하고 계시는 stable 의 정의에 대해서 적어주시겠어요? 해당 답변을 봐야 제가 답을 드릴 수 있을 것 같아요.
안녕하세요 🙂 설명해주신 부분 이해했습니다.
현 실습코드의 Testbench 의 문제이고요. (Verilog HDL Season1 에서 만 반영이 되었네요. 금일중으로 전부 반영해 놓겠습니다.) 현상에 대해서는 다음 링크를 참고하시면 될 것 같습니다.
https://www.inflearn.com/news/996958
TB main 부분 내부의 assign 을 non-blocking 으로 수정하시면 됩니다.
수정하면 다음과 같이 나오네요. DUT 부분은 문제가 없으니, Testbench 만 수정하시면 되겠습니다.
실습코드 업데이트 하고, 공지로 남겨드릴께요!
리포팅 감사합니다 :)
제가 질문을 너무 헷갈리게 말한것 같네요 죄송합니다
저의질문은 간단히 말해서 o_done이 1로 바뀔때 다음 cycle에 num_cnt <= 0 이 반영되는것이 일반적으로 맞는것 같은데 i_run이 1로 바뀌는 순간 바로 그 cycle에 num_cnt <= i_num_cnt 이 반영되는 이유가 궁금합니다