VS code + docker

以下、Visual Studio Code(VS Code)+Dockerを用い、かつ Yosys(Verilog合成ツール)を例に「ホストフォルダを使ってコンテナ開発環境を整える手順」を 優しくステップバイステップ で示します。


? 前提条件

  • あなたのパソコンに Docker がインストールされていて、起動できる状態。

  • VS Code がインストールされており、拡張機能「Remote – Containers」または「Dev Containers」が入っている。 VSCode Docs Arc+2tech.pepabo.com+2

  • 任意のホスト側フォルダを作成できる(例:~/projects/picorv32-yosys/ 等)。


? 手順

1. ホスト側でフォルダを作る

  1. 例:Ubuntu/Linux を使っているならターミナルで:

    cd ~
    mkdir -p projects/picorv32-yosys
    cd projects/picorv32-yosys
  2. Windows/macOSでも、エクスプローラーやFinder/ターミナルで同様にフォルダを作ってください。

  3. そのフォルダを VS Code で「フォルダを開く」で選びます。


2. プロジェクトに必要な設定ファイルを作る

ホスト側のフォルダ(例:~/projects/picorv32-yosys/)内に次のようにファイルを作ります。

Dockerfile(コンテナの中身を定義)

プロジェクトルートに Dockerfile を作成。中身の例:

FROM ubuntu:22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
build-essential \
git \
yosys \
&& apt-get clean && rm -rf /var/lib/apt/lists/*
WORKDIR /workspace
CMD ["/bin/bash"]

VS Code用 Dev Container 設定 .devcontainer/devcontainer.json

プロジェクトルートに .devcontainer フォルダを作り、その中に devcontainer.json を置きます。例:

{
"name": "Yosys Dev Container",
"dockerFile": "Dockerfile",
"context": ".",
"workspaceFolder": "/workspace",
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind",
"extensions": [
"mshr-h.veriloghdl"
],
"settings": {
"files.associations": {
"*.v": "verilog",
"*.sv": "verilog"
},
"editor.formatOnSave": true
}
}

3. VS Code からコンテナで開く

  1. VS Code で先ほどのフォルダを開く。

  2. コマンドパレット(Ctrl + Shift + P)を開き、「Dev Containers: Reopen in Container」または「Remote‑Containers: Open Folder in Container…」を選択。 Docker+1

  3. VS Code が Docker イメージを自動ビルド+コンテナ起動するので少し待ちます。 blog.jp.square-enix.com+1

  4. 起動後、VS Code のターミナルを開くと、コンテナ内シェルが使えるようになっています。


4. Yosys を使って動作確認

  1. コンテナ内ターミナルで次を実行:

    yosys -V

    バージョンが出ればインストール成功です。

  2. ホスト側の src/ 等に簡単な Verilog ファイル(例:top.v)を入れ、コンテナ内 /workspace にマウントされていることを確認。

  3. 次のように Yosys で合成処理を実行:

    yosys -p "synth -top top; write_verilog top_synth.v" src/top.v

    エラーなく top_synth.v が生成されれば OK。


✅ 補足・注意点

  • ホストフォルダとコンテナの両方で同じファイルを共有しているため、編集して保存するとそのままコンテナ内にも反映されます。

  • workspaceMountsource=${localWorkspaceFolder},target=/workspace,type=bind によって、「ホスト側フォルダをコンテナ内 /workspace として使う」設定になっています。

  • 初回ビルド時は Docker イメージ作成に時間がかかることがあります。2回目以降は速くなります。 Zenn

  • 将来的に FPGA 実機書き込みなどを行う場合、USBデバイスアクセス・JTAGツール・ベンダー合成ツール等、別途設定が必要になります。今は「編集+Yosys合成」までに絞ることでハードルが低くなります。


もしよければ、この構成に VS Code 用の tasks.json(Yosys用のタスク定義) を追加して、「ワンクリックで合成を実行できる」ように設定する手順もご案内できます。どうしますか?

了解しました。では、「3. Docker/VS Code 開発コンテナの準備」について、一つ一つを詳細に段階分けして説明します。ボードがない段階でも、この環境を確実に構築できるようにします。


ステップ 3-A:Docker イメージを準備する

目的:Ubuntu ベースのコンテナ内で Verilog の編集/シミュレーションができる環境を作る。

  1. プロジェクトフォルダ(例:fpga-dev/)を作成し、その中に Dockerfile を配置。

  2. Dockerfile 内容(例):

    FROM ubuntu:22.04

    ENV DEBIAN_FRONTEND=noninteractive
    ENV TZ=Etc/UTC

    RUN apt-get update && apt-get install -y \
    git \
    build-essential \
    autoconf \
    automake \
    autotools-dev \
    curl \
    python3 \
    python3-pip \
    bison \
    flex \
    texinfo \
    libmpc-dev \
    libmpfr-dev \
    libgmp-dev \
    gawk \
    libtool \
    patchutils \
    bc \
    zlib1g-dev \
    libexpat-dev \
    iverilog \
    gtkwave \
    vim \
    nano \
    cmake \
    && apt-get clean && rm -rf /var/lib/apt/lists/*

    WORKDIR /workspace

    CMD ["/bin/bash"]

    • ubuntu:22.04 をベースに。

    • Verilog シミュレータ iverilog、波形ビューア gtkwave をインストール。

    • ワークディレクトリを /workspace に設定。

  3. Docker イメージをビルド:

    docker build -t fpga-dev-sim:latest .
  4. コンテナを起動(ホストの作業フォルダをマウント):

    docker run -it --name sim-container \
    -v $(pwd):/workspace \
    fpga-dev-sim:latest

    ここで、ホスト側のプロジェクトフォルダが /workspace にマウントされ、コンテナ内で編集/実行作業が可能になります。


ステップ 3-B:VS Code の Dev Container 設定

目的:VS Code 上から「このフォルダを開くだけ」で上記 Docker 環境を起動し、作業できるようにする。

  1. プロジェクトフォルダ内に .devcontainer/ フォルダを作成。

  2. その中に devcontainer.json を配置。例:

    {
    "name": "FPGA Dev Container – Verilog Sim Only",
    "dockerFile": "Dockerfile",
    "context": "..",
    "workspaceFolder": "/workspace",
    "mounts": [
    "source=${localWorkspaceFolder},target=/workspace,type=bind"
    ],
    "extensions": [
    "mshr-h.veriloghdl",
    "ms-vscode.cpptools",
    "eamodio.gitlens"
    ],
    "settings": {
    "terminal.integrated.shell.linux": "/bin/bash",
    "files.associations": {
    "*.v": "verilog",
    "*.sv": "verilog"
    },
    "editor.formatOnSave": true
    },
    "postCreateCommand": "chmod -R a+rw /workspace || true",
    "remoteUser": "root"
    }
    • dockerFile に上記 Dockerfile を指定。

    • mounts にホスト → コンテナのバインドマウントを設定。

    • Verilog 編集向け拡張を指定。

    • .v.sv を Verilog として扱う設定。

    • postCreateCommand でワークスペースの権限調整。

  3. VS Code でプロジェクトフォルダを開き、コマンドパレット → “Remote-Containers: Reopen in Container” を選択。これにより、VS Code が Docker を使って「開発用コンテナ」を起動し、その中で編集・ターミナル作業ができます。


ステップ 3-C:動作確認(Verilog 編集+シミュレーション)

目的:ボードが無くても、「編集/シミュレーション」がコンテナ+VS Code 上で正常動作することを確認。

  1. VS Code 上でターミナルを開き、コンテナ内シェルが使えることを確認。

    iverilog -V
    gtkwave -V

    などでバージョン表示できれば OK。

  2. 簡単な Verilog モジュール+テストベンチを作成。例:

    // led_blink.v
    module led_blink(
    input clk,
    output reg led
    );
    always @(posedge clk) begin
    led <= ~led;
    end
    endmodule

    // led_blink_tb.v
    module led_blink_tb;
    reg clk = 0;
    wire led;

    led_blink uut(.clk(clk), .led(led));

    initial begin
    $dumpfile("led_blink.vcd");
    $dumpvars(0, led_blink_tb);
    #100 clk = 1;
    forever #5 clk = ~clk;
    end

    initial #1000 $finish;
    endmodule

  3. ターミナルで以下を実行:

    iverilog led_blink.v led_blink_tb.v -o led_blink.vvp
    vvp led_blink.vvp
    gtkwave led_blink.vcd &
    • シミュレーションが成功し、led_blink.vcd が生成され、GTKWave で波形が見られれば OK。

    • 参考:オープンソース Verilog シミュレーション方法として、$dumpfile$dumpvars を用いて波形ファイル (VCD) を生成する流れが説明されています。 Steve Icarus+1

  4. VS Code 上で Verilog ファイルのシンタックスハイライト・エラーなしを確認。拡張機能が有効であれば、誤記などもすぐに出ます。


ステップ 3-D:Git 管理・再現性確保

目的:この環境構成(Dockerfile/.devcontainer/プロジェクト構成)を Git リポジトリ化し、チーム共有・再現可能状態にする。

  1. プロジェクトフォルダで Git を初期化:

    git init
    git add Dockerfile .devcontainer devcontainer.json
    git commit -m "Initial container setup for Verilog simulation"
  2. .gitignore を作成して、生成ファイル(例:*.vvp, *.vcd, *.vlog, *.log)やビルド成果物を無視するように:

    *.vvp
    *
    .vcd
    *.log
    *
    .rpt
  3. リモートリポジトリ(GitHub, GitLab 等)に push すれば、他の開発者が「クローン → VS Code で開く → Reopen in Container」で即開発できる環境になります。

  4. README.md に「このコンテナの立ち上げ手順」「仮想環境でのVerilogシミュレーションの実行手順(上記動作確認ステップ)」などを記載しておくと、導入がスムーズです。


注意点・補足

  • コンテナ内で Verilog シミュレーション用ツール(Icarus Verilog / GTKWave)を使うため、X-Window や GUI が必要な場合(GTKWaveの波形表示)にはホスト-コンテナ間で X11 転送や VNC 等の仕組みを検討してください。あるいは波形ファイル (.vcd) をホスト側で開く手順もありです。

  • 将来的に FPGA 合成/書き込みツール(例:GOWIN/Lattice/Xilinx)を使う場合、ライセンス・GUI・USB/JTAGデバイス/ホスト側の USB 通過設定などが必要になります。今は「シミュレーションOnly」段階なのでその手間を後回しにできます。

  • コード編集/シンタックスチェック/シミュレーションまでの流れをまず確立しておくと、ボードが到着した時点で「ハードウェア書き込み/実機動作確認」にスムーズに移行できます。

  • 開発コンテナは CPU/メモリ割当を大きめにしておくと、後段(合成プロセス)を入れた時に快適です。例えば docker run --cpus=4 --memory=8g ... など。

  • VS Code の拡張機能で Verilog HDL のサポートを入れておくと、モジュールヘッダ/ポート定義の補完・エラー表示が出るので効率が上がります。