강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

dontknow님의 프로필 이미지
dontknow

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 1 (Clock부터 Internal Memory까지)

FSM case문 default 와 latch 관련 질문있습니다.

작성

·

688

1

always @(c_state or i_run or is_done) 

begin

case(c_state)

S_IDLE: if(i_run)

n_state = S_RUN;

S_RUN : if(is_done)

n_state = S_DONE;

S_DONE: n_state = S_IDLE;

        default : n_state = S_IDLE;

endcase

end 

 

always @(c_state)

begin

case(c_state)

S_DONE: o_done = 1;

default : o_done = 0;

endcase

end

 

위 코드 처럼 FSM 예제 코드 중에 // To prevent Latch. 부분을 지우고 case문에 default로 같은 값을 부여했는데

제 생각엔 예제 처럼 case문 위에 넣거나 case문 안에 default 로 넣거나 둘다 같은 동작이 돼서 예외적인 상황일 때를 기술했으니까 래치가 생성 되지 않을거라 생각했는데 툴을 돌려서 schematic을 확인해보니 래치가 생성되었습니다.

이게 어떠한 이유로 그런지 도저히 모르겠어서 질문 드립니다. 혹시 그냥 툴이 해석하는것에 차이가 있어서 발생 된 일인건지 아니면 위에 적는게 default로 적는것보다 래치를 예방하는 효과가 큰건지 궁금합니다. 툴은 vivado가 아니라 다른 툴을 사용했습니다

답변 1

1

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

정말 full case 인가요..?

힌트를 드리면

 if else...?!

idle 상태에서 i_run 이 아니면 어떤 값을 가져야 할까요?

이 물음의 답을 찾아보세요 :)

dontknow님의 프로필 이미지
dontknow
질문자

아 맞네요 왜 그걸 못봤을까요. case문 안에 있는 if문도 else로 예외 적인 상황에 대해 기술해 줬어야했는데 시야가 좁았네요 ㅠㅠ 덕분에 뭔가 번뜩이면서 깨달았습니다. 덕분에 다음에 비슷한 코드를 짤 때 실수 안할거같습니다. 그럼 case문 밖에서   // To prevent Latch. 부분의 내용을 적으면 case문의 default와 if문의 else에 들어갈 내용이 한번에 기술된 효과가 있는건가요? 만약 그렇다면 이번 처럼 같은 실수를 방지 하기위해서 위에다 적어두는게 더 좋을거같다는 생각이 들어 물어봅니다! 

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

네 맞습니다. 실수를 줄일 순 있어요.

하지만, if else 의 else case 를 설계자가 보장해줘야해요. 그것만 주의 하시면 될 것 같아요 :)

dontknow님의 프로필 이미지
dontknow
질문자

정말 감사합니다!!  좁은 시야로 생각해서 이걸 못보고 있었네요 ㅠㅠ 덕분에 많은 깨달음을 얻었습니다 정말 최고의 선생님이십니다 다시 한번 감사합니다!! 

설계독학맛비님의 프로필 이미지
설계독학맛비
지식공유자

충분히! 헷갈릴만 합니다. 실전에서 실수안하면 되는거죠, 공부하는 단계니까요 ㅎ (저도 몰랐어요)

즐공입니다 :)

dontknow님의 프로필 이미지
dontknow

작성한 질문수

질문하기