인프런 커뮤니티 질문&답변
simple bram ctrl 질문입니다 !
작성
·
308
2
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요 선생님! 맛비선생님의 BRAM Ctrl 설계를 학습하였는데 아래 맛비님의 코드 n_state = c_state를 case문 안에 default 문으로 넣었는데 시뮬레이션이 동작하지 않았습니다. 혹시 이유를 간략히 알 수 있을까요?
always @(*) begin
n_state = c_state;
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;
endcase
end
n_state = c_state;
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;
endcase
end
답변 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로 작성할 때는 어떻게 작성해야하는지 여쭙니다!..