인프런 커뮤니티 질문&답변
latency 개념 구현
작성
·
20
1
안녕하세요 🙂
[1. 질문 챕터] : eg) 몇 장, 몇 분 몇 초 쯤. or 수강생 분들이 봤을 때 어디구나?! 할 수 있게 표기 부탁 드려요.
[2. 질문 내용] : eg) 질문 내용을 자유롭게 작성해주시면 되겠습니다 🙂
[3. 시도했던 내용, 그렇게 생각하는 이유] : eg) 설치영상은 이렇게 시도했는데 안되더라 or 본인의 생각을 적어주세요. (실습 내용 중에 이해가 안되거나 잘못된 내용이 있는데, 이러 이러한 근거로 나는 이렇게 생각합니다.)
================ 다음 내용은 읽어보시고 지우시면 됩니다.=================
질문 내용을 작성해주실 때, 위의 3단계로 제가 이해할 수 있게 작성해주시면 정확한 답변을 드릴 수 있을 것 같아요!!
현업자인지라 업무때문에 답변이 늦을 수 있습니다. (길어도 만 3일 안에는 꼭 답변드리려고 노력중입니다 ㅠㅠ)
강의에서 다룬 내용들의 질문들을 부탁드립니다!! (설치과정, 강의내용을 듣고 이해가 안되었던 부분들, 강의의 오류 등등)
이런 질문은 부담스러워요.. (답변거부해도 양해 부탁드려요)
개인 과제, 강의에서 다루지 않은 내용들의 궁금증 해소, 영상과 다른 접근방법 후 디버깅 요청, 고민 상담 등..
글쓰기 에티튜드를 지켜주세요 (저 포함, 다른 수강생 분들이 함께보는 공간입니다.)
서로 예의를 지키며 존중하는 문화를 만들어가요.
질문글을 보고 내용을 이해할 수 있도록 남겨주시면 답변에 큰 도움이 될 것 같아요. (상세히 작성하면 더 좋아요! )
먼저 유사한 질문이 있었는지 검색해보세요.
잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
================
clk 100번 튈때마다
end else if (i_run_en) begin
if(r_counter == i_freq -1) begin
r_counter <= 0;
o_one_sec_tick <= 1'b1;
이코드로 인해서 o_one_sec_tick 이 딸깍 올라오는 점은 너무 이해가됩니다 그런데 실제로 vivado에서 clk의 개수를 세어보면 100번의 clk이 딸깍되고 110 번 쯤 에서 실제로 o_one_sec_tick 이 1로딸깍 올라오는데 이부분이 설마 latency로 인한 지연으로 늦게 올라오는 점이 구현된건가요?
답변 3
0
(일반적인 Behavioral 시뮬레이션을 돌리셨다는 가정하에 말씀드립니다.)
tool 마다 다른 simulation 결과가 나온다는게.. 이해하기 힘든 상황이기때문에, tool 문제라는 생각은 안드는데요.
코드를 수정하신게 없는데, 제 영상과 다른 결과를 보인다는 말씀이실까요?
매번 시뮬레이션을 실행할때 마다 결과가 달라지시는건지도 궁금합니다.
0
저도 처음에는 reset 때문에 110번쯤에서 o_one_sec_tick 이 발생하나 싶었지만 o_one_sec_tick이 처음 발생하는 지점이 아니고 o_one_sec_tick이 발생하는 지점을 임의의로 중간지점을 하나 잡아서 o_one_sec_tick이 발생하고 그다음 o_one_sec_tick이 발생하는 그 사이 clk의 개수를 세보았는데도 100번을 훨씬 넘어간 다음 o_one_sec_tick이 발생해서 질문드렸습니다 다시 확인해보았는데도 124번후에 tick이 발생했습니다 왜그런지 코드상에는 문제가 없는데 waveform에서만 이런현상이 발생하는지 모르겠습니다.
그리고 r_counter를 waveform에 올려서 상태를 확인해보면 초기화가 안되고 100125ns 뒤에 2로 한번에 튀고 r_counter도 1씩증가하는 현상이 안보입니다. vivado 문제인건가요?
0
안녕하세요. 맛비입니다.
질문을 정확하게 이해를 했는지 모르겠는데요.
원하시는 답변이 아니면 Waveform 그림을 같이 올려서 설명해주시면 더 명확할 것 같아요.
이해한 내용으로 답변을 드려볼께요.
결론부터 말씀드리면, 질문자님이 생각하신 "Latency로 인한 회로적 지연"은 아닙니다. (일반적인 Behavioral 시뮬레이션을 돌리셨다는 가정하에 말씀드립니다.)
올려주신 코드를 보면 <= (Non-blocking assignment)를 사용하고 있습니다. 플립플롭의 특성상 r_counter == i_freq - 1 이라는 조건이 만족되면, 그 다음 클락(1 clock 뒤)에 값이 업데이트 되어 o_one_sec_tick이 1로 올라옵니다. 즉, 100번을 카운트했다면 101번째 클락 엣지에서 반응하는 것이 정상적인 RTL 동작입니다.
그런데 웨이브폼 상에서 101번째가 아닌 110번째 쯤에서 올라왔다면, 이건 코드가 느려서가 아니라 Testbench(TB)의 초기 동작 조건 때문일 확률이 매우 높습니다.
아마 아래 두 가지 케이스 중 하나일 것입니다.
Reset 유지 시간: 시뮬레이션 시작(0ns) 후 Reset 신호가 완전히 풀릴 때까지 대략 10 클락 정도의 시간이 소요되었을 수 있습니다. 카운터는 Reset이 풀린 이후부터 동작하니까요.
Enable 신호 인가 시점:
i_run_en신호가 0초부터 바로 1로 들어온 것이 아니라, 시뮬레이션 시작 후 약 10클락이 지난 뒤에 Testbench에서 1로 인가되었을 수 있습니다.
즉, 코드가 늦게 동작한 것이 아니라 카운터가 "실제로 숫자를 세기 시작한 시점"이 시뮬레이션 0초 지점이 아니었을 거라는 생각이 드네요.
즐공하세요 🙂




