본문 바로가기

HW

Xilinx HLS tutorial (2) - Creating HLS project

설치가 정상적으로 마무리 되었다면 이어서 내용을 진행 해보겠습니다. 

 

우선 앞선 글에서 나온 tutorial용 design file인 ug871-design-files의 압축을 C:\에 풀어줍니다.

 

그럼 C:\Vivado_HLS_Tutorial\ <- 이런 경로가 생기게됩니다.

 

 

 

 

첫번째 HLS project를 시작하기 위해서 HLS를 실행합니다.

 

Vivado HLS 2019.2

위 아이콘을 실행하면 아래와 같이 프로그램이 실행되고

 

Create New Project를 클릭합니다.

 

 

Create New Project를 클릭하고

 

다음에 이어서

 

 

 

 

위 사진과 같이 진행합니다.

 

 

정상적으로 진행하면 위와 같을 것입니다. 

 

Next 버튼을 누르고 

 

 

Add file을 선택해줍니다.

 

 

 

fir.c를 추가합니다.

 

Top Function에 fir이라고 쓰는거 잊지마세요~!

 

이렇게 됬으면 이제 Next를 누릅니다.

 

이어서 C 기반(C-based)의 Testbench를 추가하라고 하네요

 

Add Files를 눌러서 추가하면 되겠습니다.

 

그런데 여기서 fir_test.c 추가할 때 out.gold.dat 도 같이 추가하라고 하네요 

 

C simulation이 솔루션의 하위 폴더에서 실행되는데 만약에 testbench에서 사용되는 모든 파일을 추가 하지않으면(예를들어 테스트 벤치가 읽어서 쓰는 data file. 여기서는 out.gold.dat) C 그리고 RTL simulation에서 아마 에러가 날겁니다. 데이터를 찾을 능력이 없기 때문이죠

 

 

고로 위와 같이 두개를 다 추가하고 Next를 누르도록 하겠습니다. 

 

이어서 이게 나오는데 solution1은 그대로 두고

 

Clock을 보면 Period가 10이라고 적혀 있는데 단위가 ns 인거 같네요.

 

오른쪽에 Uncertainty는 직역하면 불확실성인데 Clock의 불확실성 부분을 비우두면 default로 12.5%가 들어간다고 합니다. 

 

그 밑에 Part Selection 부분에서는 Part를 골라야 하는데 본인이 사용하는 FPGA chip에 맞게 고르시면 됩니다.

 

example에서는 xcvu9p-flgb2104-1을 사용하라고 하네요 저는 별도로 사용하는 보드가 있어서 그걸 쓰도록 하겠습니다.

 

여기까지 마무리 됬으면 Finish

 

그럼 

 

 

이런 창이 나오게 됩니다 

 

각 부분별 명칭은 위와 같다고 하네요 

 

 

잘 켰다면  왼쪽에 Test Bench에서 fir_test.c를 더블 클릭해서 열어 보겠습니다.

 

 

 

코드가 잘 나오네요!

 

코드를 대충 보면

 

SAMPLES 600개 정도 테스트 하고 

파일 stream은 fp로 잡았네요 

 

signal 이랑 output을 data_t라는 변수로 선언했는데 해당 내용은 fir.h에 적혀 있겠죠?

 

coef_t로 마찬가지 일겁니다.

 

out.dat라는 file을 쓰기모드로 열고 

for 문은 SAMPLE만큼(600번) 돌리네요 

 

ramp_up이 1이냐 아니냐를 통해서 signal 값에 +1 인지 아닌지가 결정되고 

 

fir.c 에 정의된 fir 함수에 &output, taps, signal을 입력값으로 주어서 fir함수를 실행하고 

 

결과에 따라 ramp_up을 결정하고 결과를 fprintf를 이용해서 fp에 해당하는 out.dat에 적는 모습이네요

 

for문 밖에서는 fp를 닫고

 

system 명령을 이용해서 방금 testbench를 통해 생성한 out.dat와 out.gold.dat를 비교한뒤 그 결과를

출력하며 정상 통과 됬다면 return 0 아니면 return 1을 출력하면서 마무리합니다.

 

자 이제 C testbench 코드는 싹 봤고 

 

tutorial pdf를 보니

run c simulation을 클릭하라고 하는데 

 

 

project > Run C Simulation도 있고 

 

위 사진에 제가 체크한 것도 Run C Simulation 입니다. 

 

맘에 드는걸 클릭하시면 

 

이런게 나옵니다!

 

그냥 OK를 누르라고 하는군요 눌러보면

 

뭔가 쭉 실행되고 정상적으로 잘 돌아가는 모습을 볼 수 있습니다. 

 

 

 

잘된걸 아는 이유는! 

터미널 창에 위 사진과 같이 나왔기 때문이죠~!

 

아까 테스트 벤치에서 봤던

 

 

이 모습이 있으니까요 ㅎㅎ

 

내 아무튼 여기까지 일단 test 코드 올려서 돌리는거 해봤고 

 

tutorial pdf에 따르면

 

여기까지 하면 합성을 할 준비가 된거라고 하네요!

 


저는 지금 u871-vivado-high-level-synthesis-tutorial.pdf 20p를 보고 있는데요

 

이제 Step 3: High-Level Synthesis를 볼 순서입니다

 

여기서는 C design을 RTL design으로 합성(synthesis)하고 합성 report를 review한다고 하는데요

 

이걸 하려면 Run Synthesis를 클릭하면 됩니다!

이게 합성이 끝나면 report file이 자동으로 열린다고 해요.

 

눌러 볼까요?

 

여러분이 정상적으로잘 따라왔다면 에러가 나지 않고 바로 report가 나올텐데 

 

그렇지 않은경우에

 

 

Top function must be specified!

이런 에러가 날수 있습니다. 

 

이건 앞에서 add source 할때 fir을 top function이라고 지정하지 않았기 때문인데요

 

이걸 지정하는 방법은 위에 나와 있는것 처럼

 

project Setting -> Synthesis -> Top Function에서 설정해주면 됩니다. 

 

 

 

 

자 이게 다 끝났고 원래 대로 합성 버튼을 눌러보면

 

 

이런식으로 나올겁니다. 

 

fir fileter가 어떻게 합성되었는지 

 

Timing은 어땠고 Utilization 부분을 보면 FPGA 자원을 얼마나 사용했는지가

 

나타납니다.

 

 

 

 

 

interface 부분에 보면 합성된 모듈이 어떤 interface pin을 사용하는지가 나옵니다. 

 

 

위와 같이 합성이 잘 되었네요 

 

보면 interface에 ap_clk랑 ap_reset이라는 핀이 있습니다. fir이라는 module을 구성하면서 HLS 시스템이 자동으로 추가 했군요

 

추가적인 포트들고 포함되어 있어서 ap_start, ap_done, ap_idle, ap_ready 라는 port도 있는데 pdf에 따르면 block level control을 위한 port라고 하네요.

 

interface synthesis tutorial은 이런 포트에 대한 정보를 제공한다고 하네요. 뒤에있는 목차중에 하나겠구나 하고 보니까 60p의 Chapter4에 interface synthesis가 있네요! 그럼 chapter 4까지는 가야 왜 ap_clk, ap_reset, ap_start, ap_done, ap_idle, ap_ready가 생겼는지 알수 있겠네요!

 

함수의 출력인 y는 32bit data-port로 되어 있고 값이 나갈때 유효함을 알려줄 y_ap_valid라는 port도 같이 있습니다. 

값을 가져올때는 y_ap_valid값이 high일때만 가져온다는 규칙이 적용되어 있겠네요!

 

함수의 입력 요소인 c (an array)는 block RAM interface 동작을 수행한다고 해요.

이 interface는 block RAM과 연결되는 4bit의 output address port, CE port, 32bit input data port도 있네요.

 

마지막으로 scalar input 요소인 x는 32-bit data input port로 별도의 I/O protocol이 없는(ap_none)상태로 수행된다고 하네요.

 

나중에 Lab3: Using Solutions for Design Optimization에서 port x에 맞게 어떻게 I/O protocol을 최적화 할수 있는지 알수 있다고 하네요!

 


자 여기까지해서 23p까지 읽어봤는데 이어서 Step 4 RTL Verification을 보겠습니다. 

 

HLS는 C로 작성한 Testbench를 합성된 RTL code에 적용해서 다시 사용할 수 있다고 하는데요.

 

Run C/RTL Cosimulation을 누르면 된다고 해요!

 

 

 

이런식으로 옵션들이 있는데 그대로 두면 

 

vivado simulator를 사용해서 verilog RTL code를 검증에 사용합니다. 

다른 simulator도 사용할수 있는데 위에 옵션에서 선택해주면 되겠지요?

 

일단은 그냥 OK를 누릅니다. 

 

이 Co-simulation이 시작되면

 

C testbench가 RTL design에 맞는 input vector를 생성하고

RTL design 에서 simulation을 수행합니다. 

 

RTL로부터 나온 output vector는 C testbench에 적용되고 result-check작업이 진행됩니다.

그리고 결과를 return하면서 RTL simulation이 마무리 됩니다. 

 

이 과정에 대한 자세한 내용은 Chapter 8. RTL Verification tutorial에서 다뤄진다고 하네요!

 


이제 마지막 Step 5. IP Creation입니다. 

 

원래 Verilog로 했으면 한참 걸렸을 내용인데 벌써 여기까지 한큐에 오다니 신기하네요 ㅎㅎ

 

본 Step에서 배우는 IP Creation은 HLS flow의 마지막 단게로 방금 합성한 design을 IP block화 해서 Vivado Design Sutie에서 사용할 수 있도록 하는 겁니다.

 

바로 시작해보죠!

 

 

 

 

이렇게 Export RTL을 수행합니다. 

 

위와 같이 나오는데 그냥 OK를 누릅니다. 

 

그러면 뭔가 동작하기 시작하는데 

IP Packager가 Vivado IP Catalog를 위한 package를 만드는 겁니다. 

 

다 끝나면 왼쪽에 Solution1을 펼쳐 봅니다. 

 

그러면

 

 

 

 

이렇게 되어 있을겁니다. 

 

여기까지 완료되면 이제 Vivado IP Catalog에 지금 만든 IP를 추가할 준비가 끝난겁니다.

 


여기까지가 25p에 있는 Introduction의 Lab1을 끝낸거네요!

 

엄청나게 길이가 길죠?

 

다음 Lab2도 천천히 진행해보도록 하겠습니다. 

 

그럼 다음시간에 만나요