다른 수강생분들이 코드 짜는 연습을 하실 때, 실수하실 수 있는 부분인 것 같아 학습 내용을 공유합니다!
핵심
fsm_counter_test.v의 line 59에서, n_state = S_IDLE; 의 할당을 non-blocking 할당(<=)으로 하면 c_state가 영원히 IDLE에 머물게 되어 시뮬레이션이 끝나지 않습니다.
문제가 생긴 이유
non-blocking 할당문(<=) 사용 시: begin-end block 내의 모든 문장이 동시에 실행됨(정확히는 event list에 같은 시점에 올라감). 따라서 case문과 n_state <= S_IDLE;이 동시에 이루어지며, 이 때문에 c_state는 영원히 IDLE에 머무른다.
blocking 할당문(=) 사용 시: begin-end block 내의 문장들이 위에서 아래로 순차적으로 실행되기 때문에, n_state = S_IDLE;은 latch 방지라는 본연의 역할을 잘 수행함.
내용공유 감사합니다 :)
Combinational Logic 은 blocking (=) 문
Sequential Logic 은 Non-blocking(<=) 문
을 사용한다는 Rule 을 잘 지키시면, 오류를 줄일 수 있을 것 같아요.
읽어보면 좋을 link https://dreamsailor.tistory.com/7
훌륭합니다 :)
답글