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

Taiwan님의 프로필 이미지
Taiwan

작성한 질문수

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

simple bram ctrl 질문입니다 !

작성

·

273

2

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 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

 

답변 1

0

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

안녕하세요 :)

안되는 코드하고, 변경했을 때, 어떻게 안되는지 알려주시면 안될까요? (변경 전, 변경 후 차이를 적어주시면 좋을 것 같아요. 막연히 안된다 라고 하셔서, 원하시는바를 모르겠습니다 ㅠ)

답변에 도움이 되어드릴께요!

즐공하세요 :)

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

 

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로 작성할 때는 어떻게 작성해야하는지 여쭙니다!..

 

 

 

 

 

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

안녕하세요 :)

답변드릴께요. 일종의 버그성이 되어버렸구요. 코드를 더 수정해야 할 것 같아요.

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 결과에 오동작을 만들었어요 :)

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

감사합니다 확인했습니다 !  이전  FSM 강의도 동일하게 default를 사용하고 싶으면 full case를 만들어야 하나요? 

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

해보진 않았지만, full case 를 만드셔야 정상 동작 할 것 같아요.

수많은 로직들이 존재하기에.. 설계하시다보면,  full case 가 아닌 상태에서 동작할 수 있구요.(simulation 상에서는..) 하지만, 절대로! 권하고 싶진 않아요.

왜냐하면, Combinational 로직에서 full case 를 만들지 못하면 Latch 가 발생하기 때문입니다.

즐공하세요 :)

 

 

Taiwan님의 프로필 이미지
Taiwan

작성한 질문수

질문하기