FPGA開発日記

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

RISCVEMU(高速RISC-Vエミュレータ)には2つのビルドモードがある(Emscriptenの調査)

RISCVEMUは高速RISC-Vエミュレータだが、その実装の仕組みを探っていると、どうやら2つのビルドモードがありそうだということが分かった。

msyksphinz.hatenablog.com

RISCVEMUはLinuxも立ち上げることが出来る高速エミュレータだが、その実装の仕組みを探っていると、大きくソースコード#defineにより分割されていることが分かった。

  • risvemu.c
#ifdef EMSCRIPTEN
#include "list.h"
#include <emscripten.h>
#else
#include <getopt.h>
#include <termios.h>
#endif

EMSCRIPTENというのは何だろうと思ったが、どうやらC言語Javascriptを接続するためのツールらしい。

デフォルトでは、このEMSCRIPTENはオフになっており、C言語でごりごりに記述されたRISCVエミュレータが起動する。

  • riscvemu_template.h
        switch(opcode) {
#ifdef CONFIG_EXT_C
        C_QUADRANT(0)
            pc_next = (intx_t)(s->pc + 2);
...
            }
            if (rd != 0)
                s->reg[rd] = val;
            break;
#if XLEN >= 64
        case 0x3b: /* OP-32 */
            imm = insn >> 25;
            val = s->reg[rs1];
            val2 = s->reg[rs2];
            if (imm == 1) {
                funct3 = (insn >> 12) & 7;
                switch(funct3) {
                case 0: /* mulw */
                    val = (int32_t)((int32_t)val * (int32_t)val2);
                    break;
                case 4:/* divw */
                    val = div32(val, val2);
                    break;
                case 5:/* divuw */
                    val = (int32_t)divu32(val, val2);
                    break;
                case 6:/* remw */
                    val = rem32(val, val2);
                    break;
                case 7:/* remuw */
                    val = (int32_t)remu32(val, val2);
                    break;
                default:
                    goto illegal_insn;
                }
            } else {
                if (imm & ~0x20)
                    goto illegal_insn;
                funct3 = ((insn >> 12) & 7) | ((insn >> (30 - 3)) & (1 << 3));
                switch(funct3) {
                case 0: /* addw */
                    val = (int32_t)(val + val2);
                    break;
                case 0 | 8: /* subw */

EMSCRIPTENを有効にすると、Javascriptでの実装が有効になるみたいなのだが、このためにはEmscriptenのインストールが必要になる。

qiita.com

Download and install — Emscripten 1.36.14 documentation

emscripten.h — Emscripten 1.36.14 documentation

上記のウェブサイトの指示の元にインストールしてみたのだが、上手くいかなかった。

/emsdk_portable$ sudo ./emsdk install latest
Installing SDK 'sdk-master-64bit'..
Installing tool 'clang-master-64bit'..
Repository 'https://github.com/kripken/emscripten-fastcomp/' already cloned to directory '/home/vagrant/work/emsdk_portable/clang/fastcomp/src', skipping.
Fetching latest changes to the branch 'master' for '/home/vagrant/work/emsdk_portable/clang/fastcomp/src'...
Already up-to-date.
Successfully updated and checked out branch 'master' on repository '/home/vagrant/work/emsdk_portable/clang/fastcomp/src'
Current repository version: "Fri, 23 Dec 2016 15:47:53 -0800 881bd352731d21c7117ad7e2ece347aacae83965"
Repository 'https://github.com/kripken/emscripten-fastcomp-clang/' already cloned to directory '/home/vagrant/work/emsdk_portable/clang/fastcomp/src/tools/clang', skipping.
Fetching latest changes to the branch 'master' for '/home/vagrant/work/emsdk_portable/clang/fastcomp/src/tools/clang'...
Already up-to-date.
Successfully updated and checked out branch 'master' on repository '/home/vagrant/work/emsdk_portable/clang/fastcomp/src/tools/clang'
Current repository version: "Fri, 23 Dec 2016 15:47:47 -0800 60a7e9a9c22b67309e5b1258d38fadfa481a25d3"
Running CMake: ['cmake', '-G', 'Unix Makefiles', '-DCMAKE_BUILD_TYPE=Release', '-DPYTHON_EXECUTABLE=/usr/bin/python', '-DLLVM_TARGETS_TO_BUILD=X86;JSBackend', '-DLLVM_INCLUDE_EXAMPLES=OFF', '-DCLANG_INCLUDE_EXAMPLES=OFF', '-DLLVM_INCLUDE_TESTS=OFF', '-DCLANG_INCLUDE_TESTS=OFF', '/home/vagrant/work/emsdk_portable/clang/fastcomp/src']
CMake Error at CMakeLists.txt:3 (cmake_minimum_required):
  CMake 3.4.3 or higher is required.  You are running version 3.2.2


-- Configuring incomplete, errors occurred!
CMake invocation failed due to exception!
Working directory: /home/vagrant/work/emsdk_portable/clang/fastcomp/build_master_64
Command '['cmake', '-G', 'Unix Makefiles', '-DCMAKE_BUILD_TYPE=Release', '-DPYTHON_EXECUTABLE=/usr/bin/python', '-DLLVM_TARGETS_TO_BUILD=X86;JSBackend', '-DLLVM_INCLUDE_EXAMPLES=OFF', '-DCLANG_INCLUDE_EXAMPLES=OFF', '-DLLVM_INCLUDE_TESTS=OFF', '-DCLANG_INCLUDE_TESTS=OFF', '/home/vagrant/work/emsdk_portable/clang/fastcomp/src']' returned non-zero exit status 1
Installation failed!

まずはCMakeの最新版をダウンロードしてきた。

wget https://cmake.org/files/v3.7/cmake-3.7.2-Linux-x86_64.tar.gz

CMakeを最新版にアップデートしてemsdk insntall latestを実行すると前に進みだしたようだ。

これにはもうちょっと時間がかかる。今日は時間切れ。