최근 자동차 내용만 올리다가 간만에 학습내용을 쓰는듯 하다.

Xilinx의 VIVADO HLS관련하여 개인적으로 테스트한 내용을 정리겸 추후 복기하기 위해 작성하였다.

 

VIVADO HLS를 처음 접하면서

C to HDL의 For 루프에서 옵션 처리에 따른 속도 테스트를 진행 하였다.


테스트 코드 기능은 12채널 MUX이며,

12개의 입력신호에서 다중 채널로 출력이 가능 하도록 설계 되었다.

( 입력 : 출력 / 설정에 따라 1:n 또는 1:1 출력을 대응함.)


FPGA를 C로 구현하니 격세지감이다

(뭐 이미 한참 전에 나오긴 했지만 ㅋ)

 

추가적으로 테스트 진행중 참고 및 주의해야할 사항은 아래와 같다.

참고사항

1. AXI-LITE 를 사용하면 Latency 가 소폭 상승한다

2. AXI-LITE를 사용하고 각 제어 변수의 버스(bundle 옵션)를 다르게 적용하면 Latency가 일정부분 감소한다.

3. Time Critical 영역에서는 AXI interface 를 피하고 Block Level IO Protocol 설계방식이 유리해 보인다

(현재 내가 해본 수준에서는...)

4.설계한 IP에 Block Level IO Protocol을 사용하여 제어하려면(interface) Microblaze에서 AXI-GPIO IP를 미친듯이 뽑아내자(읭?????)

 

주의사항

1. 인터페이스용의 결과 리턴용 참조 변수는 함수 마지막 실제 Function의 리턴 직전에 넣을 것.

   (Co Simulation이 stall 현상이 발생 - User guide에서 Co - Simulation의 멈춤을 stall 이라고 명기함.)

2. Co Simulation은 Velilog로 진행 할것. (VHDL 진행시 진행이 되지 않는 경우가 발생)

사용한 VIVADO 버전은 2018.3 이다.

 

적용 테스트 코드는 블로그 하단에 첨부

Pipeline 적용

 

unroll 적용


For 문 없이 풀어서 적용



결과

입력에서 출력까지의 지연시간 (Co- simulation을 통한 Timing 확인)

for문 pipeline 적용 : 140ns

for문  pipeline 미적용 : 255ns

for문  unroll 적용 : 60ns

Fro문 없이 적용 : unroll 과 동일  60ns

결론  : unroll 적용시 시간 이 단축되며 FOR 문없이 풀어 적용한것과 동일한 효과를 나타냄

현 구조에서는 unroll 적용 가능 구조였으며 상황에 따라 소모 clock은 다를 것으로 보여짐.

 

 

파이프라인 적용 : Verilog

파이프라인미적용 : VHDL




unroll 적용



For 문 없이 적용


######AXI-LITE 인터페이스 사용에 따른 Latency 비교 #############

AXI -LITE 사용 리턴 미사용



AXI -LITE 사용 리턴 사용



AXI -LITE 사용 리턴 사용 / register 적용



AXI -LITE 사용 리턴 사용 / register 적용 / 동일 버스(bundle) 적용


AXI -LITE 사용 리턴 사용 / register 적용 / 개별 버스라인(bundle) 적용

 

MUX용 코드

//mux 12ch

 

// in12 out12

// select sel_led -> sel_sen

// Designed by S.Jung

// 2019--09-18

#include <stdio.h>

#include "ap_cint.h"

 

#define NofLED 12

 

 

typedef int12 CH_Width;

 

char LED_CH_SEL_SEN[NofLED];

char SELECT_LED, SELECT_CH;

CH_Width mux12ch(int *sel_led, int *sel_sen, int *set, CH_Width *out_monitor,CH_Width sen_in)

//CH_Width mux12ch(char *sel_led, char *sel_sen, char *set,CH_Width sen_in)

{

/*

#pragma HLS INTERFACE port=return

#pragma HLS INTERFACE s_axilite port=set bundle=a

#pragma HLS INTERFACE s_axilite port=sel_sen bundle=b

#pragma HLS INTERFACE s_axilite port=sel_led bundle=c

#pragma HLS INTERFACE s_axilite register port=out_monitor bundle=d

*/

CH_Width return_ch=0;

char i;

 

 

if ((*sel_led < NofLED) && (*set == 1))

{

LED_CH_SEL_SEN[*sel_led] = *sel_sen;

}

 

else

{

for(i=0;i<NofLED;i++)

{

#pragma HLS UNROLL

return_ch |= ((sen_in >> LED_CH_SEL_SEN[i]) &0x01 ) << i;

}

}

 

 

 

*out_monitor = return_ch;

 

 

return return_ch;

 

 

}



Test Bench Code

#include <stdio.h>

#include "ap_cint.h"

typedef int12 CH_Width;

int main(void)

{

FILE*fp;

int sel_led=0;

int sel_ch=0;

int set=1;

int i=0;

CH_Width return_data=0;

CH_Width pt_data=0;

int pt_data_conv;

fp=fopen("result.dat","w");

return_data = mux12ch(&i, &i,&set,&pt_data,i);

//return_data = mux12ch(&i, &i,&set,i);

for (i=0;i<12;i++)

{

return_data = mux12ch(&i, &i,&set,&pt_data,i);

//return_data = mux12ch(&i, &i,&set,i);

fprintf(fp,"loop: %d return_data : %d\r\n",i,return_data);

}

set = 0;

for(i=0;i<120;i++)

{

return_data = mux12ch(&set,&set,&set,&pt_data,i);

//return_data = mux12ch(&set,&set,&set,i);

fprintf(fp,"loop :pointer data : rtndata  [ %d: %d : %d ] \r\n",i,pt_data,return_data);

//fprintf(fp,"loop : rtndata  [ %d : %d ] \r\n",i,return_data);

}

fclose(fp);

return 0;

}

 

####Co-Simulation ###########



########추가 참고 자료#########

인터넷에서 주워옴  

#FPGA, #HLS, #Co-Simulation, #VIVADO, #VIVADO HLS

크리에이티브 커먼즈 라이센스
Creative Commons License
2019/09/21 00:36 2019/09/21 00:36

Trackback Address >> 이 글에는 트랙백을 보낼 수 없습니다

댓글을 달아 주세요

<< previous 1 2 3 4 5 ... 74 next >>