Inflearn brand logo image

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

2024620043님의 프로필 이미지
2024620043

작성한 질문수

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

27.[프로젝트-1] Mem copy IP를 FPGA에 올려보기

작성

·

48

·

수정됨

1

[1. 질문 챕터] :

29:00

 

[2. 질문 내용] :

질문 : BASE_ADDR의 Addr read exception.

OS Name : Ubuntu 22.04.2 LTS

Xilinx version : 2024.02

 

[3. 시도했던 내용, 그렇게 생각하는 이유] :

전체 코드 :

#define AXI_DATA_BYTE 8 // 64 / 8

#define BASE_ADDR 0x10000000

int main()

{

init_platform();

Xil_DCacheEnable();

Xil_ICacheEnable();

u32 transfer_cnt;

u32 add_val;

while (1)

{

printf("======= Verilog Season2 matbi_mem_copy_test ======\n");

do{

printf("plz input transfer_cnt\n");

scanf("%u",&transfer_cnt);

}while( !( (0 < transfer_cnt) && (transfer_cnt%AXI_DATA_BYTE == 0) && (transfer_cnt <= 67108864) ) ); // 64 *(2^20) = 64 MBytes // max count 32-6 = 26. 2^26 = 64MBytes

do{

printf("plz input add_val (0~255)\n");

scanf("%u",&add_val);

}while( !( (0 <= add_val) && (add_val<256) ) );

u8* rdma_baseaddr = (u8*)BASE_ADDR;

volatile u8 data = Xil_In8(rdma_baseaddr);

 

}

cleanup_platform();

return 0;

}

오류 발생 :
xil_io.h 파일

static INLINE u8 Xil_In8(UINTPTR Addr)

{

return (volatile u8 ) Addr;

}

xil_exception.c 파일

static void Xil_DataAbortHandler(void *CallBackRef)

{

xdbg_printf(XDBG_DEBUG_GENERAL, "Address of Instruction causing Data abort %lx\n",DataAbortAddr); // 0x00100588

while(1)

{

}

}

 

원인 ? :

image.png

 

 

여기서 무엇을 진행해야 할까요?

 

 

답변 3

0

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

아.. 이해했습니다.

전달드린 코드 수정 없이, 영상까지 따라하셨는데 문제가 있으신 거군요.

현실적으로 디버깅을 대신 해드린다는건 말이 안되서, 실습파일을 보시면, 프로젝트를 통째로 압축해서 드리고 있는데요. 2022.2 에서 해보시면 가장 좋을 것 같아요.

image.png

2024.2 에서 어떤일이 벌어지고 있는지 파악하기에는 어려워서,

몇 가지 확인해보라고 하고 싶은 부분을 말씀드리면

  1. BASE_ADDR 을 수정해보기.
    0x10000000 번지면, Zybo board 의 1GB 영역에서 25% 해당하는 구간이라. (큰 기대는 안하지만..) 혹시나 겹칠 수 있으니, 0x10000000 -> 0x20000000 도 해보시고 값을 변경해보시면 좋을 것 같아요.

  2. ILA 를 이용하여 각 SW 코드의 line by line 에 HW 의 명령어가 정상적으로 전달되는지 확인. 시간은 오래 걸리지만 가장 확실한 방법입니다. 정석 디버깅 입니다.
    FPGA 시간에 ILA 사용방법을 다룬 적이 있고요. HW 의 실제 동작의 waveform 을 dump 하여 눈으로 볼 수 있는 기능입니다. 이것과 SW 의 break point 를 조합해서 내가 주고있는 command 가 잘 가고 있구나 눈으로 직접 보시면서 step by step 으로 가시면 되겠습니다.

즐공하세요!

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

답변 감사합니다.
Xil_DataAbortHandler 무한 루프 문제는 말씀하여 주신 1번으로 해결되었습니다.
2번은 "28. [프로젝트-2] Mem copy IP 의 Performance 분석하기"에서 설명되는 아래 사진을 말씀하시는 건가요?

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

네, 맞아요. 실제 FPGA 에서 동작하는 파형을 dump 합니다.

즐공하세요!

0

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

안녕하세요 🙂

질문이 잘 이해가 안되는데요.

전달드린 실습코드 자체에 문제가 있는걸까요? 아니면 수정을 하신 걸까요?

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

안녕하세요

제공하여 주신 SW폴더에서 matbi_mem_copy_test.c를 z7-20에 적용하고

scanf에 해당되는 1024 하고 0을 입력하면 Xil_DataAbortHandler 함수의 무한 루프에 있습니다.
코드 수정하면서 확인하고 있는데 아래 코드에서 문제가 발생하는 것 같습니다.
43 line → #define BASE_ADDR 0x10000000

85 line → u8* rdma_baseaddr = (u8*) BASE_ADDR;
91 line → rdma_baseaddr[addr] = data;

0

안녕하세요, 인프런 AI 인턴입니다. 2024620043님!

BASE_ADDRAddr read exception 문제에 대해 고민하고 계시는군요. 주어진 상황에서는 BASE_ADDR에 접근하는 과정에서 발생하는 오류일 가능성이 높습니다. 아래의 몇 가지 사항을 확인해 보시기 바랍니다.

문제 원인 및 해결 방법

  1. 메모리 맵핑 확인: 주어진 BASE_ADDR (0x10000000)이 실제 구현된 하드웨어의 메모리 맵에서 올바른 주소인지 확인하세요. 사용하려는 메모리 공간이 해당 주소 범위에서 존재하지 않는다면 접근 오류가 발생할 수 있습니다. VIvado에서 주소 공간을 할당했는지 확인해 보세요.

  2. Xil_In8 함수를 통한 데이터 읽기 방법 재검토: Xil_In8 함수에서 반환되는 Addr는 8비트 데이터로 캐스팅됩니다. 하드웨어 구현이 8비트 읽기에 적합한지 확인하시고, 필요에 따라 데이터 폭을 조정하세요.

  3. 권한 설정 및 접근 가능성: 만약 이 주소가 외부 메모리에 할당되어있는 것이라면, DDR 컨트롤러나 AXI 인터페이스 설정이 제대로 되었는지 확인하세요. 권한 문제가 발생할 수 있습니다.

  4. 디버그 정보 활용: 오류 발생 시 xil_exception.cXil_DataAbortHandler에서 발생한 주소(DataAbortAddr)를 활용하여 어떤 주소에서 문제가 발생했는지 확인하고, 해당 주소의 메모리 맵 및 하드웨어 설정이 올바른지 검토하세요.

관련하여 문제 해결에 도움이 되는 유사한 질문을 확인해 보시기 바랍니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

2024620043님의 프로필 이미지
2024620043

작성한 질문수

질문하기