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

김민성님의 프로필 이미지

작성한 질문수

설계독학맛비's 실전 Verilog HDL Season 2 (AMBA AXI4 완전정복)

[HDL 38장-2부] Mem copy IP. DMA RDMA 설계 - 실습편 - 코드리뷰

rdma.v 코드 수정 필요성 제기 후 수정본 검토 요청입니다!

24.05.27 21:54 작성

·

239

·

수정됨

1

=================

현업자인지라 업무때문에 답변이 늦을 수 있습니다. (길어도 만 3일 안에는 꼭 답변드리려고 노력중입니다 ㅠㅠ)

  1. 강의에서 다룬 내용들의 질문들을 부탁드립니다!! (설치과정, 강의내용을 듣고 이해가 안되었던 부분들, 강의의 오류 등등)

  2. 이런 질문은 부담스러워요.. (답변거부해도 양해 부탁드려요)

    1. 개인 과제, 강의에서 다루지 않은 내용들의 궁금증 해소, 영상과 다른 접근방법 후 디버깅 요청, 고민 상담 등..

  3. 글쓰기 에티튜드를 지켜주세요 (저 포함, 다른 수강생 분들이 함께보는 공간입니다.)

    1. 서로 예의를 지키며 존중하는 문화를 만들어가요.

    2. 질문글을 보고 내용을 이해할 수 있도록 남겨주시면 답변에 큰 도움이 될 것 같아요. (상세히 작성하면 더 좋아요! )

  4. 먼저 유사한 질문이 있었는지 검색해보세요.

  5. 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

==================

안녕하세요 맛비님 Matbi_rdma.v 모듈의 R FSM 코드 부분을 수정할 필요가 있는 것 같은데 혹시 제가 잘못 알고 있는 것이라면 알려주실 수 있는지 여쭤보기 위해 질문드립니다.

제가 지금 파악한 문제는 c_state_r이 어떠한 경우에도 다시 S_IDLE 상태로 갈 수 없다는 것입니다.

always @(*) 
begin
	n_state_r = c_state_r; 
	case(c_state_r)
	S_IDLE	: if(ar_fifo_empty_n)
              n_state_r = S_RUN;
	S_RUN 	: if(is_burst_done_r) begin
		     if(ar_fifo_empty_n) begin
	              n_state_r = S_RUN;
	end else begin
           n_state_r = S_IDLE;
	    end
        end  
endcase


이 부분에서 is_burst_done_r이 1이라면 마지막 Rdata가 들어오고 있는 중이고(아직 capture 전) 이 상황에서 FIFO안의 해당되는 ARLEN이 아직 빠져나가지않아 비어있지 않으므로

ar_fifo_empty_n이 무조건 1입니다.

그래서 n_state_r = S_IDLE; 이 구문이 절대 실행되지 않는다는 것입니다. 파형에서도 모든 데이터를 다 받고나서도 여전히 S_RUN 상태에 머물러있는 것을 확인하였습니다.
물론 무손실 데이터 전송에는 영향이 없겠지만 만약 현업에서 이 정도는 수정해야 필요성이 있다고 보시는지 의견 부탁 드립니다!
+ 이에 제가 생각한 방식대로 코드를 수정해보았는데 옳은 결과인지 확인부탁드립니다!

코드 수정 전에는 r_hs의 falling edge에서 여전히 state_r이 1이었으나 사진을 보시다시피 수정 후 0으로 제대로 떨어지는 것을 확인하였습니다.
혹시 제가 잘못생각하는 부분이 있다면 지적 부탁드립니다. 긴 글 읽어주셔서 정말 감사드리고 정말 맛비님 덕분에 설계실력이 늘어가는게 체감이 되어 너무 행복합니다. 항상 감사드리며 양질의 강의 앞으로도 부탁드리겠습니다!

코드 수정내용은 이러합니다!

if(is_burst_done_r) 조건 부분 제거

답변 2

0

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

2024. 05. 30. 21:48

안녕하세요 🙂

(의도하진 않았지만) 다행히?도 수정하지 않아도 전체 동작에는 영향은 없어 보이네요.

말씀해 주신대로 is_burst_done_r 부분을 제거해도 될 것 같습니다.

image

제가 의도했던건, 더 이상 read request 가 없으면, rdata channel 을 Idle 로 변경하고자 했었는데요.

그게 저 위의 코드였는데, state 가 완전꼬여서.. 0 으로 절대 안떨어지네요 ㅠ ㅎㅎㅎ

이렇게 고치시면 제 의도하고 부합합니다. (질문자님꺼랑 같은거 에요 ㅎㅎ)

always @(*) 
begin
	n_state_r = c_state_r; 
	case(c_state_r)
	S_IDLE	: if(ar_fifo_empty_n)
				n_state_r = S_RUN;
	S_RUN 	: if(!ar_fifo_empty_n) // No more read data transaction.
				n_state_r = S_IDLE; 
	endcase
end 

 

촬영해둔 영상하고 코드에 차이가 있고.. 더 혼란스러워 질 것 같아서 별도 코드 업데이트는 안할 예정이에요.

사실상 없어도 되는 state 같습니다. 동작에도 영향이 없네요.

엄지척!! 드립니다!!

즐공하세요 🙂

김민성님의 프로필 이미지
김민성
질문자

2024. 05. 30. 21:58

주말보다 일찍 답변주셔서 정말감사드립니다! 알겠습니다!

0

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

2024. 05. 28. 18:48

안녕하세요 🙂

어허.. 이런..

“파형에서도 모든 데이터를 다 받고나서도 여전히 S_RUN 상태에 머물러있는 것을 확인하였습니다.”

시뮬레이션이 종료되기 전까지에도 S_RUN이 유지되고 있르면 버그 맞는 것 같은데요...? ㄷㄷ

read request 했던 모든 rdata 를 컨슘하면 IDLE 로 가는게 맞아요.

코드는 주말에 확인해보고 수정해놓을께요!

리포팅 감사합니다 🙂

김민성님의 프로필 이미지
김민성
질문자

2024. 05. 29. 13:11

넵!