FPGA開発日記

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

LuaからC++の機能を呼び出す(ISSにLuaを組み込み)

どうにかこうにか、ISSLuaを組み込んだ。

github.com

Luaのインタフェースを使用して、CPUコアを生成して、シミュレーションをすることができる。 インタフェースのサンプルとして、以下を用意した。

github.com

riscv = make_core ("risc-v")
set_pc (riscv, 0x00100)
run (riscv)

まず、make_coreを利用して、RISC-VのCPUコアを生成する。 実際に動くのは、C++側の以下のプログラムになる。

int Lua_MakeCore (lua_State *L)
{
    // Getting Arguments
    std::string arch_name = lua_tostring (L, 1);

#ifdef ARCH_MIPS
    MipsEnv *env;
    if (arch_name == "mips") {
        env = new MipsEnv (g_debug_fp, false, g_debug_enable);
        env->DebugPrint ("<make core: %s %d>\n", arch_name.c_str(), g_debug_enable);
    } else {
        std::cout << "<Unsupported Architecture : " << arch_name << ">\n";
        return 0;
    }
#else  // ARCH_MIPS
#ifdef ARCH_RISCV
    RiscvEnv *env;
    if (arch_name == "risc-v") {
        env = new RiscvEnv (g_debug_fp, false, g_debug_enable);
        env->DebugPrint ("<make core: %s %d>\n", arch_name.c_str(), g_debug_enable);
    } else {
        std::cout << "<Unsupported Architecture : " << arch_name << ">\n";
        return 0;
    }
#else  // ARCH_RISCV
#error "No architecture is specified."
#endif // ARCH_RISCV
#endif // ARCH_MIPS

    env->SetMaxCycle (g_max_cycle);
    env->SetPC (g_init_pc);

    env->SetMaxCycle (g_max_cycle);
    env->LoadSrec (g_srec_fp);

    lua_pushlightuserdata (L, static_cast<void *>(env));

    return 1;
}

シミュレーション環境をenvを生成して、各種設定をした後、

    lua_pushlightuserdata (L, static_cast<void *>(env));

で、make_coreの戻り値としてCPUコアを返す。 それ以降の命令では、全てこの環境を引数として指定している。

int Lua_Run (lua_State *L)
{
    // Getting Arguments
#ifdef ARCH_MIPS
    MipsEnv *env = static_cast<MipsEnv *>(lua_touserdata (L, 1));
    env->DebugPrint ("<Run: MIPS>\n", env->GetMaxCycle());
#else  // ARCH_MIPS
#ifdef ARCH_RISCV
    RiscvEnv *env = static_cast<RiscvEnv *>(lua_touserdata (L, 1));
    env->DebugPrint ("<Run: RISC-V>\n", env->GetMaxCycle());
#endif // ARCH_RISCV
#endif // ARCH_MIPS

    env->StepSimulation (env->GetMaxCycle());

    return 0;
}

Lua_Run ()はCPUをシミュレーションする関数だ。第一引数にCPUコアを指定している。

set_pc (riscv, 0x00100)
run (riscv)

これのスクリプトは今のところCPUの生成、PCの設定、シミュレーション開始の3つしかコマンドを用意していないが、いろいろ増やしていって、デバッグで利用できるようにしたい。