Windows10 + WSL2 + VScode + Docker で Chisel 開発環境を作る

## 関連リンク
- [Chisel 3 (Github)](https://github.com/freechipsproject/chisel3)
- [VSCode](https://azure.microsoft.com/ja-jp/products/visual-studio-code/)
- [Docker](https://www.docker.com/)

## Windows10のバージョン
WSL2のために，Windows10はバージョン2004以上にする．

Windowsのバージョンは，以下から確認できる．

[設定]->[更新とセキュリティ]->[Windows Update]->[OSビルド情報 (ウィンドウ右側，[関連するリンク]欄) ]
## WSL2のセットアップ
[参考](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)に従って，WSL2を有効化する

手順:

1. [コントロールパネル] -> [プログラム] -> [Windowsの機能の有効化または無効化] -> [Linux用Windowsサブシステム]にチェック. (再起動)

2. [Windows Powershell (管理者権限)]から

    ```powershell
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    ```

3. [Windows Powershell (管理者権限)]から

    ```powershell
    wsl --set-default-version 2
    ```

    ```
    WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください  
    WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
    ```

    と表示される場合は，[https://aka.ms/wsl2](https://aka.ms/wsl2)にアクセスし，最新の WSL2 Linux カーネル更新プログラム パッケージをダウンロード/インストールする．
4. Microsoft Storeから，Ubuntu 20.04 LTS をインストールする．
5. Ubuntuを起動し，初期設定を完了する．
以下のコマンドは実行しておく．

    ```bash
    sudo apt update
    sudo apt upgrade -y
    ```

## Dockerのセットアップ
[参考1](https://code.visualstudio.com/blogs/2020/07/01/containers-wsl), [参考2](https://code.visualstudio.com/blogs/2020/03/02/docker-in-wsl2)に従って，Dockerをインストール

1. [Docker Desktop WSL2 backend](https://docs.docker.com/docker-for-windows/wsl/)より，Docker Desktop Stable 2.3.0.2以降のバージョンをインストールする．

2. [Settings] -> [General] にて`Use the WSL 2 based engine`にチェックが入っていることを確認する．

3. [Settings] -> [Resources] -> [WSL INTEGRATION] にて `Enable integration with additional distros:`の`Ubuntu-20.04`を有効にする．

## VSCodeのセットアップ
[参考1](https://code.visualstudio.com/blogs/2020/07/01/containers-wsl), [参考2](https://code.visualstudio.com/blogs/2020/03/02/docker-in-wsl2)に従って，VSCode上でWSL2およびDockerを使用可能にする．

1. VSCodeの[Extensions]より`Remote - WSL`, `Remote - Containers`をインストール

2. VSCode左下にある緑の`><`マーク(Open a Remote Window)をクリックし，`Remote - WSL: New Window Using Distro...`->`Ubuntu 20.04`を選択．

    以降はWSL側のVSCodeで作業．

3. [Extensions]より`Docker`をインストール

4. VSCode上部のタブより`Terminal`->`New Terminal`を選択し，ターミナルを開く．
    以下のコマンドを実行する (開発フォルダを設定)

    ```bash
    mkdir workspace
    mkdir workspace/chisel
    ```

5. VSCodeの[Explorer]->[Open Folder]より，`\home\<user_name>\workspace\chisel`を開く．

6. [New File]より`Dockerfile`を作成し，以下の内容を書き込む．

    ```dockerfile
    # Reference: https://github.com/freechipsproject/chisel3/blob/master/SETUP.md
    FROM ubuntu:20.04

    # Install sbt
    RUN apt update
    RUN apt upgrade -y
    RUN apt install -y gnupg2
    RUN apt install -y default-jdk
    RUN echo "deb https://dl.bintray.com/sbt/debian /" | tee -a /etc/apt/sources.list.d/sbt.list
    RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 642AC823
    RUN apt update
    RUN apt install -y sbt
    RUN apt install -y git make autoconf g++ flex bison

    # Install Verilator
    WORKDIR /tmp
    RUN git clone http://git.veripool.org/git/verilator verilator

    WORKDIR /tmp/verilator
    RUN git pull
    RUN git checkout v4.016
    RUN unset VERILATOR_ROOT
    RUN autoconf
    RUN ./configure	
    RUN make
    RUN make install

    # Set volume
    VOLUME [ "/volume" ]
    WORKDIR /volume
    ```

7. 右下の緑の`>< WSL:Ubuntu-20.04`をクリックし，`Remote-containers: Reopen in Container` -> `From Dockerfile`をクリック

    以降はDockerコンテナ内のVSCodeで作業

8. [Extensions]より`Scala(Metals)`をインストール(`Install on Dev Container: Existing Dockerfile`ボタン)

## Chiselの動作確認
[参考](https://github.com/freechipsproject/chisel-template)に従って，Chiselのプロジェクトテンプレートをダウンロードし，動かしてみる.

1. テンプレートをダウンロードする．
    
    ```bash
    git clone https://github.com/ucb-bar/chisel-template.git MyChiselProject
    cd MyChiselProject
    ```

2. Gitの履歴をクリアする．
    
    ```bash
    rm -rf git
    git init
    git add .gitignore *
    ```

3. Projectの名前を変更する．

    `build.sbt`を開き，`name := "my-chisel-project"`となっている箇所を変更する．

4. `README.md`を適宜変更する

5. 変更をコミットする.
   
    ```bash
    git commit -m "Starting MyChiselProject"
    ```

6. 動作確認をする

    ```bash
    sbt test
    ```

    最後の行に`[Success] Total time: ... `と表示されていれば成功