FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

Vivado 2015.4 HLSを試す(C Validation and Debug)

Vivado 2015.4 のチュートリアルの続きをやっていこう。

http://www.xilinx.com/support/documentation/sw_manuals/xilinx2014_2/ug871-vivado-high-level-synthesis-tutorial.pdf

まずは、C Validation tutorialのディレクトリに移動し、以下のコマンドを叩く。

vivado_hls -f run_hls.tcl

これは実際には、C言語でのシミュレーションおよびValidationが行われているだけだ。

...
###Specify a Xilinx device and clock period
###- Do not specify a clock uncertainty (margin)
###- Let the  margin to default to 12.5% of clock period
set_part  {xc7k160tfbg484-1}
create_clock -period 5
#set_clock_uncertainty 1.25

###Simulate the C code 
csim_design

###Do not perform any other steps
###- The basic project will be opened in the GUI 
exit

次に、hamming_window_prjを開いて、Windowを起動する。

vivado_hls -p hamming_window_prj

f:id:msyksphinz:20151128211030p:plain

hamming_window_test.c の構造はどのようになっているのか

テストベンチと、回答を作成する。

   for (i = 0; i < WINDOW_LEN; i++) {
      // Generate a test pattern for input to DUT
      test_data[i] = (in_data_t)((32767.0 * (double)((i % 16) - 8) / 8.0) + 0.5);
      // Calculate the coefficient value for this index
      in_data_t coeff_val = (in_data_t)(WIN_COEFF_SCALE * (0.54 -
         0.46 * cos(2.0 * M_PI * i / (double)(WINDOW_LEN - 1))));
      // Generate array of expected values -- n.b. explicit casts to avoid
      // integer promotion issues
      sw_result[i] = (out_data_t)test_data[i] * (out_data_t)coeff_val;
   }

test_dataは入力データであり、sw_resultは、C言語での計算結果となる。

シミュレーションの実行

   // Call the DUT
   printf("Running DUT...");
   hamming_window(hw_result, test_data);
   printf("done.\n");

そもそも、hamming_windowは、一定量の入力を受け取り、出力を行う機構になっている。だから、これでも上手く行く構造になっているのか。

結果の確認

   // Check the results returned by DUT against expected values
   fp=fopen("result.dat","w");
   printf("Testing DUT results");
   for (i = 0; i < WINDOW_LEN; i++) {
      fprintf(fp, "%d %d \n", hw_result[i],sw_result[i]);
      if (hw_result[i] != sw_result[i]) {
         err_cnt++;
         check_dots = 0;
         printf("\n!!! ERROR at i = %4d - expected: %10d\tgot: %10d",
               i, sw_result[i], hw_result[i]);
      } else { // indicate progress on console
         if (check_dots == 0)
            printf("\n");
         printf(".");
         if (++check_dots == 64)
            check_dots = 0;
      }
   }
   fclose(fp);
   printf("\n");

hw_resultとsw_resultを比較し、一致すればOK、不一致ならばエラーカウントを上げる。

C言語でのシミュレーション

まずは、C言語でのシミュレーションを行う。

f:id:msyksphinz:20151128212524p:plain

この場合は、通常通りシミュレーションが実行される。

f:id:msyksphinz:20151128212840p:plain

デバッグ環境でシミュレーションを実行する

デバッグ機能を有効化してシミュレーションを行ってみる。どうなるだろう。 [Project]→[Run C Simulation]をクリックする。下記の画面が表示されるが、ここで[Launch Debugger]を選択する。

f:id:msyksphinz:20151128213006p:plain

デバッガ画面が表示された。

f:id:msyksphinz:20151128213227p:plain

Variableペインに、それぞれの変数の値が表示されている。あるいは、ブレークポイントの機能も利用できる。

f:id:msyksphinz:20151128213620p:plain

ブレークポイントに到達すると、そこでストップし、変数の値を表示できる。

f:id:msyksphinz:20151128213849p:plain