Vivado-HLSを使って簡単なRISC-V CPUを作ってみている。
テストがこんなに遅いのはなんでだ?デザインに根本的な間違いがあるのではないかと思いいろいろ見直していたのだが、あれ、よく見るとCPUのバスがスレーブの設定になってるじゃないか。
directives.tcl
set_directive_interface -mode s_axilite -bundle slv0 "cpu_hls" set_directive_interface -mode s_axilite -bundle slv0 "cpu_hls" mem
これはダメだろう。CPUが能動的にバスを操作しなければならない。 以下のように変更した。
set_directive_interface -mode m_axi -bundle mst0 "cpu_hls" set_directive_interface -mode m_axi -bundle mst0 "cpu_hls" mem
これで論理合成を仕掛けた。すると以下のエラーが発生した。
WARNING: [XFORM 203-631] Renaming function 'rv32_cpu::csrrw' to 'csrrw.2' (./rv32_cpu.hpp:101:12) WARNING: [XFORM 203-631] Renaming function 'rv32_cpu::csrrs' to 'csrrs.2' (./rv32_cpu.hpp:104:12) ERROR: [XFORM 203-801] Cannot specify interface mode m_axi on a scalar argument 'data' for function 'csrrw.1' (rv32_csr.cpp:5:35). ERROR: [XFORM 203-801] Cannot specify interface mode 'm_axi' on a non-pointer argument 'data' for function 'csrrw.1' (rv32_csr.cpp:5:35). Please use a pointer (or reference) instead. ERROR: [XFORM 203-801] Cannot specify interface mode m_axi on a scalar argument 'imm' (./rv32_csr.hpp:14) for function 'csrrw' (./rv32_csr.hpp:14). ERROR: [XFORM 203-801] Cannot specify interface mode 'm_axi' on a non-pointer argument 'imm' (./rv32_csr.hpp:14) for function 'csrrw' (./rv32_csr.hpp:14). Please use a pointer (or reference) instead. ERROR: [XFORM 203-801] Cannot specify interface mode m_axi on a scalar argument 'data' for function 'csrrs.1' (rv32_csr.cpp:32:35).
うーん、csrrwというオブジェクトはCSRレジスタ群を管理するためのコードだ。確かに、ポインタを使わずに書いている。
ただし、ポインタを使わないのは私の配慮で、Vivado-HLSでポインタを多用すると論理合成できないのではないかと恐れたからだ。
rv32_csr.cpp
... case CsrAddr_mcycle : return m_mcycle .csrrw(data); case CsrAddr_minstret : return m_minstret .csrrw(data); case CsrAddr_mimpid : return m_mimpid .csrrw(data); case CsrAddr_marchid : return m_marchid .csrrw(data); ...
ちなみにポインタを使うように変更しても同様のエラーが発生した。Vivado-HLSのエラーを見てもよく分からない。XFORM 203-801
の情報があまりないなあ。
これはどうやって対処すればよいのだろう?分からん。
(続く)