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