작성
·
273
2
답변 1
0
안녕하세요 :)
안되는 코드하고, 변경했을 때, 어떻게 안되는지 알려주시면 안될까요? (변경 전, 변경 후 차이를 적어주시면 좋을 것 같아요. 막연히 안된다 라고 하셔서, 원하시는바를 모르겠습니다 ㅠ)
답변에 도움이 되어드릴께요!
즐공하세요 :)
안녕하세요 :)
답변드릴께요. 일종의 버그성이 되어버렸구요. 코드를 더 수정해야 할 것 같아요.
default 를 적었지만, default 가 아닌 상태입니다. 자세히살펴보니, full case 가 아니네요.
다음 처럼 "else" 를 모든 case 에 추가하셔서, full case 를 만들어 주시면, 정상동작 합니다.
직접 확인했어요. 좋은 질문 감사합니다.
즐공하세요 :)
// Before. 질문 주신 Test 하신 코드. (제가 생각이 짧았습니다.)
case(c_state)
S_IDLE : if(i_run)
n_state = S_WRITE;
S_WRITE : if(is_write_done)
n_state = S_READ;
S_READ : if(is_read_done)
n_state = S_DONE;
S_DONE : n_state = S_IDLE;
default : n_state = c_state;
endcase
// 수정하여야할 코드 (Fullcase 로 만들어야합니다.)
case(c_state)
S_IDLE : if(i_run)
n_state = S_WRITE;
else
n_state = c_state; // 다음과 같이, full case 를 만들셔야 합니다.
S_WRITE : if(is_write_done)
n_state = S_READ;
else
n_state = c_state; // 다음과 같이, full case 를 만들셔야 합니다.
S_READ : if(is_read_done)
n_state = S_DONE;
else
n_state = c_state; // 다음과 같이, full case 를 만들셔야 합니다.
S_DONE : n_state = S_IDLE;
default : n_state = c_state;
endcase
else 부분이 없다면, 어떤 값이 들어가야할지 모르는 unknown (x) 상태가 되어서 simulation 결과에 오동작을 만들었어요 :)
해보진 않았지만, full case 를 만드셔야 정상 동작 할 것 같아요.
수많은 로직들이 존재하기에.. 설계하시다보면, full case 가 아닌 상태에서 동작할 수 있구요.(simulation 상에서는..) 하지만, 절대로! 권하고 싶진 않아요.
왜냐하면, Combinational 로직에서 full case 를 만들지 못하면 Latch 가 발생하기 때문입니다.
즐공하세요 :)
always @(*) begin
case (c_state)
S_IDLE : if(i_run)
n_state = S_WRITE;
S_WRITE : if(is_write_done)
n_state = S_READ;
S_READ : if(is_read_done)
n_state = S_DONE;
S_DONE : n_state = S_IDLE;
default : begin
n_state = c_state;
end
endcase
end
FSM 강의 하실 때 default로 작성해도 된다고 하셔서 default로 n_state = c_state 이런식으로 작성해 보았습니다.
테스트 벤치 결과값이 매우 이상하게 나와서 default로 작성할 때는 어떻게 작성해야하는지 여쭙니다!..