前回、自作コアをYosysで合成しようとしてSystemVerilogの文法制約の影響でコンパイルに失敗したのだった。 GitHub Issueにはsv2vを使うように指示があったのでそれを試行してみようとした。
以下でインストールを試みる。
git clone https://github.com/zachjs/sv2v.git
cd sv2v
make
単純にビルドが始まるのかと思ったらGHCのダウンロードとビルドが始まってしまった。WSL1のUbuntuで試行しているからなのか、途中で落ちてしまう。
Installing library in /home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/lib/ghc-8.10.7/ghci-8.10.7 "utils/ghc-cabal/dist-install/build/tmp/ghc-cabal-bindist" copy libraries/libiserv dist-install "strip" '' '/home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7' '/home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/lib/ghc-8.10.7' '/home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/share/doc/ghc-8.10.7/html/libraries' 'v p dyn' Installing library in /home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/lib/ghc-8.10.7/libiserv-8.10.7 "utils/ghc-cabal/dist-install/build/tmp/ghc-cabal-bindist" copy compiler stage2 "strip" '' '/home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7' '/home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/lib/ghc-8.10.7' '/home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/share/doc/ghc-8.10.7/html/libraries' 'v p dyn' Installing library in /home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/lib/ghc-8.10.7/ghc-8.10.7 "/home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/lib/ghc-8.10.7/bin/ghc-pkg" --force --global-package-db "/home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/lib/ghc-8.10.7/package.conf.d" update rts/dist/package.conf.install ghc-pkg: Couldn't open database /home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/lib/ghc-8.10.7/package.conf.d for modification: {handle: /home/msyksphinz/.stack/programs/x86_64-linux/ghc-tinfo6-8.10.7/lib/ghc-8.10.7/package.conf.d/package.cache.lock}: hLock: invalid argument (Invalid argument)
WSL2で実行してみることにした。こっちの方が上手く行った。
git clone https://github.com/zachjs/sv2v.git
cd sv2v
make
ちょっとやってみる。以下のbus_or.sv
を使ってみる。
module bit_or #( parameter WIDTH = 32, parameter WORDS = 4 ) ( input logic [WIDTH-1:0] i_data[WORDS], output logic [WIDTH-1:0] o_selected ); /* verilator lint_off UNOPTFLAT */ logic [WIDTH-1:0] w_selected_array[WORDS]; assign w_selected_array[0] = i_data[0]; generate for (genvar i = 1; i < WORDS; i++) begin : loop assign w_selected_array[i] = w_selected_array[i-1] | i_data[i]; end endgenerate assign o_selected = w_selected_array[WORDS-1]; endmodule
./bin/sv2v ../msrh/src/bit_or.sv
出力結果は以下のようになった。なるほど、配列の入力は分解してフラットなベクトルになるのか。
module bit_or ( i_data, o_selected ); parameter WIDTH = 32; parameter WORDS = 4; input wire [(WORDS * WIDTH) - 1:0] i_data; output wire [WIDTH - 1:0] o_selected; wire [WIDTH - 1:0] w_selected_array [0:WORDS - 1]; assign w_selected_array[0] = i_data[(WORDS - 1) * WIDTH+:WIDTH]; genvar i; generate for (i = 1; i < WORDS; i = i + 1) begin : loop assign w_selected_array[i] = w_selected_array[i - 1] | i_data[((WORDS - 1) - i) * WIDTH+:WIDTH]; end endgenerate assign o_selected = w_selected_array[WORDS - 1]; endmodule