FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

Vivado-HLSを使って高位合成でCPUを作ってみる(4. RTL合成後のシミュレーションとサイクル測定)

Vivado-HLSを使って簡単なRISC-V CPUを作ってみている。

とりあえず基本的なパタンが動くようになったので、Co-Simulationの実施とサイクル測定を実施する。 Co-Simulationを実施すると、RTLシミュレーションでも無事に動作していることが確認できた。 では、サイクル数を測定する。

現在実行しているのはrv32ui-p-simpleという最も簡単なテストパタンだが、Vivado-HLSのレポートを見るとものすごいサイクル数がかかっている。 55命令程度の簡単なパタンだけれども、237936サイクルもかかっているって本当?

f:id:msyksphinz:20190217194339p:plain
Co-Simulationの結果。シンプルなパタンだが、非常に多くの時間がかかっている。

RTLの動作を確認するためにサイクル確認をしてみると、意外にサイクルを消費していないように見えるぞ? っていうか見方が分からん。

f:id:msyksphinz:20190217195407p:plain
Vivado-HLSのパイプライン解析結果

パイプライン化するとどうなるのだろう?ということで以下のディレクティブを挿入したのだが、論理合成に失敗してしまった。

diff --git a/vivado_hls/cpu_hls/cpu_hls.cpp b/vivado_hls/cpu_hls/cpu_hls.cpp
index 128a5a1..0e73261 100644
--- a/vivado_hls/cpu_hls/cpu_hls.cpp
+++ b/vivado_hls/cpu_hls/cpu_hls.cpp
@@ -9,7 +9,7 @@ XLEN_t cpu_hls (uint32_t mem[MEMORY_SIZE])
 {
   rv32_cpu u_rv32_cpu (mem, 0x1000, 0x1004);

-  do {
+  L0:do {
     u_rv32_cpu.fetch_inst();
     u_rv32_cpu.decode_inst();
     u_rv32_cpu.execute_inst();
diff --git a/vivado_hls/cpu_hls/directives.tcl b/vivado_hls/cpu_hls/directives.tcl
index 980ab9b..2f64891 100644
--- a/vivado_hls/cpu_hls/directives.tcl
+++ b/vivado_hls/cpu_hls/directives.tcl
@@ -1,2 +1,4 @@
+set_directive_pipeline -II 2 "cpu_hls/L0"
+
 set_directive_interface -mode s_axilite -bundle slv0 "cpu_hls"
 set_directive_interface -mode s_axilite -bundle slv0 "cpu_hls" mem