コスモリサーチの凄腕エンジニアたちが日々、難題と格闘した記録
Copyright Cosmo Research Corp.

Windows 10でWSLを有効時、Quartus PrimeのDDR3 Memory Controller IP生成でエラー

前置き

Windows 10でWSLを有効時、Quartus PrimeのDDR3 Memory Controller IP生成でエラーになって、IPの生成ができない現象に遭遇した。
ひとまずはWSLを無効にすれば正常に生成できるが、気になったので調査してみた。

エラー内容

Quartus Primeのバージョン16.1のエラー表示(17.1でも同様)。

Error: Error during execution of "{C:/intelfpga/16.1/quartus//../nios2eds/Nios II Command Shell.bat} make all 2>> stderr.txt": child process exited abnormally
Error: Execution of command "{C:/intelfpga/16.1/quartus//../nios2eds/Nios II Command Shell.bat} make all 2>> stderr.txt" failed

Quartusで自動生成されたMakefileの下記部分でエラーになっている。

D:/intelfpga/17.1/quartus//../nios2eds/sdk2/bin/nios2-bsp hal sequencer_bsp .. --default_sections_mapping sequencer_mem --use_bootloader DONT_CHANGE

調査内容

nios2-bspでエラーになるようだが、これの中身はシェルスクリプトであり、Quartus(Nios II)のmakeからシェルスクリプトを呼ぶとbash nios2-bspが実行される事がわかった。

このbashは、WSLが有効な環境ではC:\Windows\System32\bash.exeに展開されてしまうのでエラーになってしまう。本当はNIOS II Command Shellのbashを呼んでほしい。

対策

かなり無理矢理だが、自作のnios2-bsp.exeをオリジナルのnios2-bspと同じフォルダに置くことで解決した。

nios2-bsp.exeについては、特に理由はないが今回はgolangで作ってみた。(shebang書き換えでスマートに対応できたかもしれない)

package main

import (
    "fmt"
    "os"
    "os/exec"
)

func main() {
    cmd := exec.Command(
        os.Getenv("QUARTUS_ROOTDIR")+`\bin64\cygwin\bin\bash.exe`,
        append([]string{os.Getenv("SOPC_KIT_NIOS2") + "/sdk2/bin/nios2-bsp"}, os.Args[1:]...)...,
    )
    cmd.Stdin = os.Stdin
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr
    if err := cmd.Run(); err != nil {
        fmt.Fprintln(os.Stderr, err)
        os.Exit(1)
    }
}