FPGA開発日記

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

自作RISC-VコアをYosysで合成する試行 (2. sv2v によるデザインの修正試行、の以前)

f:id:msyksphinz:20220103010108p:plain

前回、自作コアをYosysで合成しようとしてSystemVerilogの文法制約の影響でコンパイルに失敗したのだった。 GitHub Issueにはsv2vを使うように指示があったのでそれを試行してみようとした。

github.com

以下でインストールを試みる。

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