$30 off During Our Annual Pro Sale. View Details »

RTL talk #16 dalance

dalance
November 10, 2019

RTL talk #16 dalance

dalance

November 10, 2019
Tweet

More Decks by dalance

Other Decks in Programming

Transcript

  1. RustでSystemVerilogパーサを
    書いた話
    dalance

    View Slide

  2. 自己紹介
    ● 名前:初田 直也
    ● Githubアカウント:dalance
    ● 所属:株式会社PEZY Computing
    ● 業務:プロセッサLSI開発
    PEZY-SC2

    View Slide

  3. 目次
    ● Rustとは
    ● SystemVerilogパーサを書く
    ● 出来たもの
    ● 今後の展開

    View Slide

  4. Rustとは

    View Slide

  5. プログラミング言語Rust(1/4)
    ● システムプログラミング言語
    ○ C/C++と同じ領域
    ■ Goと比較されることもあるが、それほど被ってない
    ○ GCやVMなし。ベアメタル環境でも使える
    ■ OS実装やUEFI実装あり
    ○ 組み込みプロセッサ対応
    ■ ARM・RISC-Vの公式サポート
    ■ (当然非公式ですが) PEZY-SCもいける
    “rust-logo-512x512.png” by Mozilla is licensed under CC BY 4.0

    View Slide

  6. プログラミング言語Rust(2/4)
    ● モダンな言語機能
    ○ 基本は命令型プログラミング
    ○ 関数型言語由来の機能も取り込んでいる
    ■ 型クラス、型推論、式志向、イミュータブル
    ○ 独特のメモリ管理
    ■ メモリ解放タイミングをコンパイル時に決定する
    ● GCがなくてもメモリは自動解放される
    ■ 決定できないコードを書くとコンパイラに怒られる
    ● いわゆる「ボローチェッカとの戦い」
    “rust-logo-512x512.png” by Mozilla is licensed under CC BY 4.0

    View Slide

  7. プログラミング言語Rust(3/4)
    ● 整備された公式ツール群
    ○ コンパイラバージョン管理
    ■ rustup
    ○ ビルドツール
    ■ cargo
    ○ ライブラリリポジトリ
    ■ crates.io
    ○ ドキュメントホスティング
    ■ docs.rs
    ○ リンタ・フォーマッタ・ Language Server
    ■ cargo-clippy/rustfmt/rls
    ○ テストフレームワーク
    “rust-logo-512x512.png” by Mozilla is licensed under CC BY 4.0

    View Slide

  8. プログラミング言語Rust(4/4)
    ● ちょっと辛いライブラリ周り
    ○ 標準ライブラリは最小限
    ○ デファクトスタンダードが決まってないものは選択が難しい
    ○ 非同期の言語仕様が fixしてないので非同期ライブラリが混乱してる
    ■ 年内にはなんとか
    ■ Webフレームワークとかは辛そう
    “rust-logo-512x512.png” by Mozilla is licensed under CC BY 4.0

    View Slide

  9. 業務でRustを使う
    ● みんなで触るコードに導入するのは難しい
    ○ 本業はASIC屋なので…
    ● 業務を効率化するツールをRustで書く
    ○ EDA絡みのニッチな需要を満たせる
    ○ 引き継ぎとか考慮しなくていい

    View Slide

  10. 作ったツール(1/2)
    ● amber
    ○ grep/sedの代替
    ○ 巨大なネットリストを高速に検索するために作った
    ● procs
    ○ psの代替
    ○ ライセンスを掴みっぱなしで暴走する EDAツールをスムーズに殺すため
    ● ptags
    ○ ctagsラッパー
    ○ ネットリストなどを無視して並列にタグ生成する

    View Slide

  11. 作ったツール(2/2)
    ● pipecolor
    ○ EDAツールのコンソール出力を色付けする
    ● git-skel
    ○ 複数プロジェクトでスクリプト類の同期を取る
    ● flexlint
    ○ 正規表現ベースのリントチェッカ
    ○ 今回はこれをSVパーサベースのものに置き換えるのが目標

    View Slide

  12. SystemVerilogパーサを書く

    View Slide

  13. 用意するもの
    ● SystemVerilog言語仕様
    ○ IEEE Std 1800-2017
    ○ ユーザ登録すれば無料で手に入る
    ● パーサコンビネータライブラリ/パーサジェネレータ
    ○ 量が多いので手書きは厳しい
    ○ 今回はRustの型システムの恩恵を得たかったのでパーサコンビネータ
    ● 時間
    ○ 量が多いので
    ○ 会社の業務に絡めて時間を捻出
    ● 根気
    ○ 量が

    View Slide

  14. 量が多いってどのくらい?
    ● BNF定義は仕様書のAnnex.Aにある
    ○ 全44ページ
    ○ BNF定義の数は1300弱

    View Slide

  15. パーサを作っていく
    ● BNFを見ながらパーサコンビネータに落としていく
    ○ 型定義を厳密にしたかったので構文木の型定義も
    function_declaration ::=
    function [ lifetime ] function_body_declaration
    #[tracable_parser]
    #[packrat_parser]
    pub(crate) fn function_declaration(s: Span) -> IResultFunctionDeclaration> {
    let (s, a) = keyword("function")(s)?;
    let (s, b) = opt(lifetime)(s)?;
    let (s, c) = function_body_declaration(s)?;
    Ok((s, FunctionDeclaration { nodes: (a, b, c) }))
    }
    #[derive(Clone, Debug, PartialEq, Node)]
    pub struct FunctionDeclaration {
    pub nodes: (Keyword, Option, FunctionBodyDeclaration),
    }

    View Slide

  16. 作業量
    ● 実装期間
    ○ 約3か月
    ● ソースコード
    ○ 全35000行
    ○ 何度か全書き直しに近いことをしたので差分はかなり多い

    View Slide

  17. 言語仕様のミス?発見
    ● パースできないサンプルソース多数
    ○ Typo、括弧の対応漏れ
    ■ 一目で分かるものから、なんだかよく分からないものまで
    ○ Unicode記号
    ■ “-”(ハイフン)と思いきや “–”(ENダッシュ: U+2013)
    ○ 通りそうなソースコードが BNFで受理できそうにない
    ■ パラメータオーバーライド付き classのstaticメソッド
    ■ [x: $]みたいなレンジアクセス
    ■ 階層付きのrandomize引数
    ● Accelleraに報告を試みたが音信不通
    ○ お金払ってないとダメなのか

    View Slide

  18. 出来たもの

    View Slide

  19. sv-parser
    ● Rustのライブラリとして公開
    ○ https://crates.io/crates/sv-parser
    ○ 中央サーバに登録されていて、 Rustプログラマなら簡単に組み込める

    View Slide

  20. テストしてみた
    ● sv-tests
    ○ OSSなSystemVerilogツールのコンプライアンステスト
    ■ ターゲットはIcarusとかVerilatorとか
    ○ SystemVerilogのソースは色々なOSSプロジェクトから貰っている
    ■ 各ツールのテスト
    ■ RISC-Vコア
    ● sv-parserも追加してもらった

    View Slide

  21. テスト結果
    ● 今のところPass率トップらしい
    ○ パースしかしないので高めに出るというのはある

    View Slide

  22. 今後の展開

    View Slide

  23. ライブラリを使ってツールを作る(1/2)
    ● リントチェッカ
    ○ https://github.com/dalance/svlint
    ○ 社内で使っている正規表現ベースのリントを置き換えた
    ■ 従来対応できなかったルール追加ができた
    ■ 正規表現のミスによるチェック漏れを発見
    ■ メンテナンス性向上

    View Slide

  24. ライブラリを使ってツールを作る(2/2)
    ● フォーマッタ
    ○ 次の目標
    ○ リントよりはハードル高そう。マクロ絡みの扱いなど
    ● Language Server
    ○ VSCodeのSV拡張がいまいちらしい(伝聞)
    ○ Language Server実装にしてどのエディタでも使えるようにしたい

    View Slide