인프런 커뮤니티 질문&답변
21강(16장) 초기값 설정이 적용되는 시점 질문
작성
·
8
·
수정됨
0
안녕하세요 🙂
[1. 질문 챕터] : 21강(16장)
코드: 7분 20초(Prevent latch 부분, 코드 라인 = 54, 68)
파형: 9:30초(0ns, 5ns에서의 o_done, n_state값)
[2. 질문 내용] : 파형에서 o_done 값이 왜 0ns에서 바로 0으로 되지 않고 5ns에서 0으로 되는지 궁금합니다.
[3. 시도했던 내용, 그렇게 생각하는 이유] :
코드 라인 54, 68 라인을 보면 o_done값과 n_state 모두 똑같이 prevent latch를 위해 값을 0으로 블라킹으로 할당해주었습니다.
그러면 둘 다 파형에서 똑같이 0ns에서 바로 0으로 값이 되어야 한다고 생각합니다. 파형에서 n_state를 추가해서 보면 제 생각대로 바로 0ns에서 0으로 설정이 되었습니다. 그럼 o_done도 0ns에서 0으로 설정이 되어야 하는 거 아닌가 하는 생각이 들었습니다. 하지만 파형을 보면 클락 상승 엣지인 5ns에서 0이 되었습니다. 혹시 제가 간과한 부분이 있었는지도 조금 궁금합니다. 예를 들어 always문에 있는 c_state값이 바뀔 때만 always 블록이 실행된다고 치면 o_done이 5ns에서 0이 되는 게 이해가 되지만, 그럼 n_state도 0ns가 아닌 5ns에서 0이 되어야 하는 게 아닌가 그런 생각도 듭니다. 이거는 그냥 시뮬레이터의 우선순위가 다른 개념인 건가요?
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
각 신호의 값이 왜 특정 시간에서 변경되는지, 그리고 o_done과 n_state가 서로 다르게 동작하는 이유에 대해 설명드리겠습니다.
Verilog와 같은 하드웨어 설명 언어에서는 항상 블록(always block)과 할당 구문(assign)을 사용하여 동작을 정의합니다. 각 블록과 구문에는 우선순위와 실행 조건이 있으며, 이러한 특성은 시뮬레이션에서 시간에 따라 결과가 달라질 수 있습니다.
1. o_done이 5ns에서 0으로 설정되는 이유:
o_done이 클락의 상승 에지에서만 업데이트된다면, 이는always @(posedge clk)블록 내부에서 설정된 경우일 것입니다. 이 경우, 클락 신호의 변화(즉, 상승 에지)가 있을 때만 값이 변경되기 때문에 0ns가 아닌 5ns에서 설정이 반영될 수 있습니다.
o_done의 초기화가reset신호가 트리거되거나 특정 상태 전환에 의해 이루어진다면, 이러한 트리거 이벤트가 클락 에지와 동기화되어 발생할 수 있습니다.
2. n_state가 0ns에서 바로 0으로 설정되는 이유:
n_state의 경우,always @(posedge clk)이나 비동기적인 이벤트에 의해 초기화되지 않고, 초기화가 즉각적으로 발생하는 할당이 사용되었다면 0ns에서 바로 값이 설정될 것입니다.
- 또는,
n_state는 다른 비동기적 신호나 초기화 로직에 의해 즉각적으로 설정될 수 있습니다.
참고 방법:
비슷한 상황과 관련된 강의나 기존 질문을 참고하면 많은 도움이 될 수 있습니다. 최근 비슷한 주제로 논의된 질문들이 있습니다. Verilog의 동작 원리나 시뮬레이션의 특성에 대한 더 깊은 이해를 원하신다면 아래 유사 질문 답변을 참조하는 것을 추천드립니다:
- HDL 16장 실습편 시뮬레이션 결과 질문: 여기서는 비슷한 맥락에서 시뮬레이션 결과와 초기값 설정에 대해 언급되고 있습니다. 참고하시면 더 많은 이해가 될 수 있습니다.
결론적으로, o_done과 n_state의 값 변화는 언제 업데이트 로직이 실행되는지(동기 비동기), 클락 신호 변화와의 관계에 따라 결정됩니다. 시뮬레이터의 우선순위 설정 개념보다는, Verilog의 동작 원리를 잘 이해하는 것이 필요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.





'o_done이 클락의 상승 에지에서만 업데이트된다면, 이는always @(posedge clk)블록 내부에서 설정된 경우일 것입니다.'라고 하셨는데, 제가 언급한 코드라인은 always @(*) 블록 내부의 코드입니다.