FPGA開発日記

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

自作CPUのビルドとシミュレーション環境をDocker化する

自作CPUのシミュレーション環境は、ローカルで作業する場合と強力なリモートサーバ上で作業する場合があるのだが、強力なサーバを使用する場合は必要なツールが入っていないことが多くて、Docker環境を構築してそちらで回すようにしている。

ただ、シミュレーションスクリプトとDocker環境がリンクしておらず、毎度Dockerコンテナ内に入らないとスクリプトを起動できなかったので、シミュレーションスクリプトを変更して、オプションに応じてDockerを立ち上げるように変更した。

ビルドは、オプションに応じてDocker上で実行する。ローカルのディスクをDockerコンテナ内にマウントし、そのうえでMakefileを走らせるという単純な仕組みだ。

    if use_docker:
        command = ["docker",
                   "run",
                   "--cap-add=SYS_PTRACE",
                   "--security-opt=seccomp=unconfined",
                   "--rm",
                   "-it",
                   "-v",
                   current_dir + ":/work/scariv",
                   "--user", str(user_id) + ":" + str(group_id),
                   "-w",
                   "/work/scariv/verilator_sim/" + base_dir + "/" + testcase,
                   "msyksphinz/scariv:run_env"] + run_command
    else:
        command = run_command

    if use_docker:
        run_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=0, text=True)
    else:
        run_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=0, text=True,
                                       cwd=base_dir + '/' + testcase)

実行方式も同様。Dockerのコマンドラインを最初につけるかつけないかを制御しているだけである。

    if use_docker:
        command = ["docker",
                   "run",
                   "--cap-add=SYS_PTRACE",
                   "--security-opt=seccomp=unconfined",
                   "--rm",
                   "-it",
                   "-v",
                   current_dir + ":/work/scariv",
                   "--user", str(user_id) + ":" + str(group_id),
                   "-w",
                   "/work/scariv/verilator_sim/" + base_dir + "/" + testcase,
                   "msyksphinz/scariv:run_env"] + run_command
    else:
        command = run_command

    if use_docker:
        run_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=0, text=True)
    else:
        run_process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=0, text=True,
                                       cwd=base_dir + '/' + testcase)

余談だが、この際Pythonの書き方がよく分からずに、ChatGPTに大変にお世話になった。本当に便利だな。