해결된 질문
작성
·
175
1
안녕하세요 맛비님,
좋은 강의 항상 잘 보고 있습니다:) 큰 도움이 되고 있어요.
39장의 WDMA 설계에서 WVALID signal을 보면, slave의 valid signal을 그대로 연결해 주고 있는 것으로 이해했는데요, 후반부의 검증 환경을 보면(그리고 제가 실제 AXI interconnect를 이용해 FPGA상에 구현 후 ILA를 통해 볼때도 그렇고) wready는 항상 1이 되어있는 경우가 많은 것 같습니다.
이렇게 되면 AW channel을 통해 address를 전달해 주기 전에, write handshake가 먼저 발생할 수 있을 것 같습니다.(slave의 동작에 따라서요. 영상의 검증 환경에서는 address가 전달된 이후에 data가 들어오지만, 연결된 slave에서 valid signal이 on 되는 상황이면 WDMA의 state에 관계없이 write handshake가 발생할 수 있는 설계로 보입니다.)
여기서 궁금한 점은, awchannel을 통해 write address가 결정되지 않은 상황에서, wready는 왜 항상 1인 것일까요? 이번 강의에서 다루지는 않고 있지만, AXI4 (full) slave 를 설계할 때 data를 먼저 받고 address를 나중에 받을 수 있도록 data만 fifo에 저장한다거나 하는 설계가 일반적인가요?
AXI4 slave를 설계할 때 프로토콜상 그런 제약이 있다면 위와 같이(wvalid와 s_valid를 직접 연결) 설계해도 문제가 없을 것 같고, 그렇진 않고 implementation에 따라 달라질 수 있는 부분이라면 master를 설계하는 입장에서는 더 robust하게? 설계하는게 맞을 것 같아 wvalid = s_valid & w_s_run_w 와 같이 설계해야 할 것 같다는 생각이 들었습니다.
바쁘신 와중에 읽어주셔서 감사합니다:)
=================
현업자인지라 업무때문에 답변이 늦을 수 있습니다. (길어도 만 3일 안에는 꼭 답변드리려고 노력중입니다 ㅠㅠ)
강의에서 다룬 내용들의 질문들을 부탁드립니다!! (설치과정, 강의내용을 듣고 이해가 안되었던 부분들, 강의의 오류 등등)
이런 질문은 부담스러워요.. (답변거부해도 양해 부탁드려요)
개인 과제, 강의에서 다루지 않은 내용들의 궁금증 해소, 영상과 다른 접근방법 후 디버깅 요청, 고민 상담 등..
글쓰기 에티튜드를 지켜주세요 (저 포함, 다른 수강생 분들이 함께보는 공간입니다.)
서로 예의를 지키며 존중하는 문화를 만들어가요.
질문글을 보고 내용을 이해할 수 있도록 남겨주시면 답변에 큰 도움이 될 것 같아요. (상세히 작성하면 더 좋아요! )
먼저 유사한 질문이 있었는지 검색해보세요.
잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
==================
답변 1
0
안녕하세요 🙂
"여기서 궁금한 점은, awchannel을 통해 write address가 결정되지 않은 상황에서, wready는 왜 항상 1인 것일까요? "
저희가 설계한 모듈 바깥의, 연결된 signal 에 대해서 물어보시는 것으로 이해 했습니다.
당연히 어떤 모듈이 붙을지 알 수 없기 때문에, 바깥에 붙은 모듈에 대해서는 원인을 정확하게는 모르겠습니다.
설계시, Valid/Ready Handshake 의 rule 을 따라서 설계를 했기 때문에, slave 에서도 이 룰을 지킨다는 가정이면 동작에는 문제가 없을 것으로 보여집니다. 따라서 왜 항상 1인가에 대한 답은 정확하게 답을 못하겠습니다. (정말 궁금하시다면 VIP slave 모듈 코드를 참고해주세요)
이로 인하여 오동작이 발생한다면, Master, Slave 둘중 하나가 스펙을 잘못이해한 설계라고 봐야할 것 같아요.
"이번 강의에서 다루지는 않고 있지만, AXI4 (full) slave 를 설계할 때 data를 먼저 받고 address를 나중에 받을 수 있도록 data만 fifo에 저장한다거나 하는 설계가 일반적인가요?"
Channel 간 독립성 유지용으로 FIFO 에 저장하도록 설계하였고요. 설계방법에는 정답은 없습니다. 일반적이냐 물어보셨으니, High performance 를 만드려면 FIFO 를 사용해야한다고 보여집니다. (일반적입니다) 하지만 설계방법에는 차이가 있습니다.
설계방법도 중요하지만 더 중요한 건 "Spec in" 입니다.
"AXI4 slave를 설계할 때 프로토콜상 그런 제약이 있다면 위와 같이(wvalid와 s_valid를 직접 연결) 설계해도 문제가 없을 것 같고, 그렇진 않고 implementation에 따라 달라질 수 있는 부분이라면 master를 설계하는 입장에서는 더 robust하게? 설계하는게 맞을 것 같아 wvalid = s_valid & w_s_run_w 와 같이 설계해야 할 것 같다는 생각이 들었습니다."
제가 설계해서 드린 코드에 동작에 문제가 있었는지 확인 부탁 드려도 될까요? 혹시 제가 검증하지 못헌 case 가 있을 수 있을 수 있어서요. 문제가 있다면 리포팅 해주면 감사하겠습니다 🙂
만약 문제가 없는 상태인데, 질문자님이 생각하기에 더 robust 하다고 판단되시면 원하시는대로 바꿔서 사용하시면 되겠습니다.
즐공하세요 🙂
우선 답변 감사드립니다!
앞의 두 답변에 대해서는 이해하였습니다:)
맛비님께서 설계해주신 실습 코드상에서는 RDMA와 WDMA 사이에 붙는 IP (여기서는 adder)및 dma wrapper의 동작에 따라 문제가 생길 수 있지 않을까 합니다. 현재는 mem copy IP를 위한 설계이기 때문에, read가 일어난 후 write가 일어나므로 rdma와 wdma를 동시에 init해주면 RDMA를 통해 데이터를 읽는 동안 w channel의 state가 run이 되고 이후에 data가 들어오게 되어 문제가 발생하지 않습니다.
한편, 현재 w channel signal들은 w channel state와 관계없이 data를 주는 ip(여기서 adder output fifo)와 axi slave(데이터 받는 쪽)의 handshake가 일어납니다. 하지만 burst transaction의 wlast signal을 위한 write handshake count는 write channel state가 run일 때만 동작합니다. 따라서 wdma가 init되기 전에 in_r_dout이 먼저 준비된다면 slave의 상태에 따라 write channel에서의 handshake가 먼저 발생할 수 있게 되고(이 데이터는 slave input의 FIFO에 저장되겠지만) 이 때 w channel은 IDLE state이기 때문에 burst length 계산이나 hs count를 할 수 없어 올바른(spec에 맞는) burst transaction이 이루어지지 못하게 될 것 같습니다.
예를들어, aw handshake가 일어나기 전에 w handshake가 2번 일어났다면, 두번의 w handshake는
wlast signal과 함께 일어나게 됩니다w_hs가 count되지 않는 상태로 일어나게 됩니다. 이후 burst length가 16이라면 18번째 data와 함께 wlast signal이 발생하게 될 것이구요. 하지만 aw handshake에서 전달한 정보는 첫번째 address에 16개의 data로 이루어진 burst transaction이 이루어졌어야 하지만, 데이터는1개만18개가 온 것이 될 것입니다. 아래 사진은 그런 상황이 발생한 경우입니다. (master는 실습 코드를 이용해 설계한 DMA, slave는 alveo의 HBM IP에 연결된 axi interconnect입니다. data가 준비됨과 동시에 wdma가 init되었고, 이에 aw handshake가 일어나기 위해 burst length를 계산하는 중에 이미 write handshake는 발생한 상황입니다.)+) 추가: 구현에 수정한 부분이 있어 실습코드와는 다른부분이 존재해 본문을 수정했습니다. 실습코드에서는 awlen에 +1하여 burst length를 fifo에서 넘겨주어 count해 last signal이 발생하지 않을 것 같지만, 제가 한 구현은 awlen을 그대로 넘겨주어 앞에 last signal이 발생하네요.
정리하자면 현재 실습 환경(mem copy라는 목적 및 dma_wrapper의 동작)상에서는 문제되지 않지만, 이를 이용해 다른 목적의 dma를 설계하고자 하면 문제가 될 수 있지 않을까라는 생각입니다. (write하는 위치나 크기가 read와 다른 시점에 결정된다거나, read/write 횟수가 달라 동시에 init하지 않는 경우 등. 항상 read와 write를 동시에 init한다면 실제 write transaction이 일어날 때 까지 bus를 점유하게 되어 효율적이지 않을 것 같습니다!) 저도 실습 코드를 바탕으로 read/write 각각 instruction을 통해 off chip memory에 data를 읽고 쓰는 dma를 설계해보던 중에 해당 문제를 발견하기도 했구요.
읽어주셔서 감사합니다! 혹시 제가 쓴 글 중 틀린 부분이 있다면 알려주세요.