Upgrade to Pro — share decks privately, control downloads, hide ads and more …

オープンソースでどこまでできる?フォーマル検証チャレンジ

Avatar for msyksphinz msyksphinz
October 08, 2025

 オープンソースでどこまでできる?フォーマル検証チャレンジ

近年、EDAツールの分野でもオープンソース化が進み、フォーマル検証にも無償で利用できる環境が登場しています。

本講演ではSymbiYosysを使った論理回路レベルのフォーマル検証に挑戦し、その有効性や限界を実例と共に紹介します。
さらにCPU設計への応用としてriscv-formalとRVFIを用いたISA準拠性検証の事例も取り上げ、オープンソースでどこまで可能かを探ります。

Avatar for msyksphinz

msyksphinz

October 08, 2025
Tweet

More Decks by msyksphinz

Other Decks in Technology

Transcript

  1. 本日のゴール ◼ 形式検証とは? ◼ SymbiYosysで簡単な検証を実践できるようになる  小規模なVerilogモジュール ◼ SymbiYosysの応用 

    RISC-Vコアのフォーマル検証事例 ◼ まとめ オープンソースでどこまでできる?フォーマル検証チャレンジ 2
  2. 本日のゴール ◼ 形式検証とは? ◼ SymbiYosysで簡単な検証を実践できるようになる  小規模なVerilogモジュール ◼ SymbiYosysの応用 

    RISC-Vコアのフォーマル検証事例 ◼ まとめ オープンソースでどこまでできる?フォーマル検証チャレンジ 4
  3. ◼ 本日は「形式検証」に焦点を当てて説明します ◼ 背景:近年のプロセスの高度化により、より半導体の設計・製造コストが増加  バグにより大きな損害を招く  検証はより慎重かつ網羅的に行う必要性がある ◼ 検証に対するアプローチ

     大きく分けてここでは2つ (二者択一ではなく、直行したアプローチとして) ハードウェアの検証方法: 検証ツールと形式検証 動的検証 / シミュレーション・ベース検証 形式検証 (フォーマル検証) オープンソースでどこまでできる?フォーマル検証チャレンジ 5
  4. ◼ 手法  検証対象に入力信号を与え、想定通りの出力が得られるかを 確認  実際の動作を模擬することで、設計の不具合を早期に発見 ◼ 必要な部品 

    対象ハードウェア(DUT: Device Under Test)  テストベンチ (TB)  入力シーケンス (検証ベクトル)  期待モデル (出力の正解データ) ◼ 課題と限界  全ケースを網羅するには膨大な時間と手間が必要  入力ベクトルの漏れ → テスト抜けの原因に  カバレッジ分析 でテスト範囲を定量的に把握する工夫が必要 ハードウェアの検証方法: 動的検証 / シミュレーション・ベース検証 TB DUT 入力ベクトル DUTに対して 検証ベクタを入力する 期待モデル 出力 = 図: テストベンチによる動作確認のイメージ オープンソースでどこまでできる?フォーマル検証チャレンジ 6
  5. ◼ 目的:すべての動作を理論的に保証する ◆ 動的検証では「試す」範囲が限られる ◼ 仕組み: 検証対象(DUT)が仕様(Specification/プロパティ)を 常に満たすかを数学的に証明する ◆ 論理的にすべてのパターンを確認する

    ◼ 利点  テストベクトル不要 — 抜け漏れなし  網羅的な検証が可能(隠れたバグを検出)  安全性・信頼性の高い設計を保証できる ◼ 欠点  モデルが大きすぎると「状態爆発問題」が発生。計算が収束せず、完了まで時間がかかることも ハードウェアの検証方法: 形式検証 / フォーマル検証 TB DUT Specification (Model) DUTと仕様を 数学的に比較 図: 形式検証のイメージ オープンソースでどこまでできる?フォーマル検証チャレンジ 7
  6. ◼ 状態爆発とは?  すべての状態を確認しようとすると組み合わせが膨大に  状態数が指数的に増え、検証が終わらないことも → 「状態爆発問題」 ◼ Unbounded

    Model Checking (UMC)  無界モデル検査:理想的な検証手法  状態空間すべてをカバーし、完全な状態一致を確認する  網羅的で理論的に正しいが、規模が大きい設計では現実的でない ◼ Bounded Model Checking (BMC)  有界モデル検査:現実的な検証手法  有限ステップ (kステップ)での状態一致を確認する  完全一致ではないが、高速かつ実用的にバグを見つけられる 形式検証の考え方: 完全性と実用性のバランス UMC: 全状態空間が 形式的に一致することを確認 BMC:kステップまでの状態の 一致を確認 オープンソースでどこまでできる?フォーマル検証チャレンジ 8
  7. ◼ EDAベンダによる商用形式検証ツール  JasperGold (Cadence) / VC Formal (Synopsys) /

    Questa Formal (Siemens) ◼ 商用形式検証ツールは強力だけれども  課題はコスト  高機能だがライセンスコストが高額: ◆ 一般的なRTLシミュレーションツールよりも高価とされる  高価・クローズド:研究・教育・個人開発では導入が難しい ◼ オープンソースの形式検証ツールも公開されている  使い方は?どれくらい使い物になる? ◼ オープンソースのハードウェア・形式検証ツール SymbiYosys  簡単な使い方や、SymbiYosysを使った応用事例を紹介 オープンソース・形式検証ツール オープンソースでどこまでできる?フォーマル検証チャレンジ 10
  8. SymbiYosys オープンソースの形式検証ツール: SymbiYosys (SBY) ◼ Yosys + SMTソルバを連携して、設計の正しさを数学的に検証する  Yosys:

    オープンソース論理合成ツール ◼ 検証フロー  Verilog設計(DUT)を読み込む  Yosysで内部モデルを生成  SMTソルバ(Z3 / Boolector)が性質を検証 Design Verilog-HDL Yosys SMT Solver (Z3, Boolector) デザイン 読み込み 形式 検証 内部モデル生成 オープンソースでどこまでできる?フォーマル検証チャレンジ 12
  9. SymbiYosysの使い方①:ラウンドロビン・アービタを検証 ◼ ラウンド・ロビン・アービタを検証  rr_arbiter.sv ◆ Nビットのラウンドロビンアービタ ◆ 入力: NビットRequest

    ◆ 出力: NビットGrant ◆ 内部状態: 最近受け付けたビット位置の情報 ◼ 必要な部品  デザインそのもの (rr_arbiter.sv)  SymbiYosysの設定ファイル ◆ rr_arbiter_bmc.sby (有界モデル検査用) ◆ rr_arbiter_umc.sby (無界モデル検査用) in0 in1 inN-1 0 2 in2 …… … 1 オープンソースでどこまでできる?フォーマル検証チャレンジ 13 ラウンドロビン・アービタ 各入力に順番に 優先度を付与 最後に付与されたビット位置を 記憶し、次回の優先度を決定
  10. SymbiYosysの使い方②:BMC/UMC設定 ◼ rr_arbiter_bmc.sby:有界モデル検査  検証ステップ数を制限して実行  主な設定 ◆ mode bmc:BMCモードを指定

    ◆ depth 40:40サイクルまで検証 ◆ engines:使用するソルバを指定  目的:短い遷移パスでの設計不具合を高速に検出 ◼ rr_arbiter_umc.sby: 無界モデル検査  ステップ数を制限せず、全状態空間を探索  主な設定 ◆ mode prove:UMCモードを指定  目的:すべての動作パスで仕様が成り立つことを 数学的に証明  注意:完了に時間がかかることがある . ├── Makefile ├── rr_arbiter.sv ├── tb_rr_arbiter.sv ├── rr_arbiter_bmc.sby └── rr_arbiter_umc.sby [options] mode bmc depth 40 [engines] # smtbmc yices smtbmc boolector # smtbmc bitwuzla # smtbmc z3 # smtbmc mathsat # smtbmc cvc4 # smtbmc cvc5 [script] read -sv -formal rr_arbiter2.sv prep -top rr_arbiter2 [files] rr_arbiter2.sv [options] mode prove [engines] # smtbmc yices smtbmc boolector # smtbmc bitwuzla # smtbmc z3 # smtbmc mathsat # smtbmc cvc4 # smtbmc cvc5 [script] read -sv -formal rr_arbiter2.sv prep -top rr_arbiter2 [files] rr_arbiter2.sv 無界モデル検査 オープンソースでどこまでできる?フォーマル検証チャレンジ 14
  11. ◼ アサーションとは  設計がこう動くべきと定義したルールを数理的に検証する仕組み  assume/assert/cover の3種類で構成 ◆ assume:環境条件(入力制約) ◆

    assert:設計の性質(チェック対象) ◆ cover:状態到達を確認(検証完了の目安) ◼ 実装方法  `ifdef FORMAL ブロック内に記述し、デザインに埋め込む ◆ SVAのような高度な記述はYosysが受け入れられない ⚫ Verilogの範囲内で記述  プロパティ例 1. Priority-bitは単調増加するはずだ 2. Grant信号はモデルと一致するはずだ SymbiYosysの使い方③: アサーションの実装 `ifdef FORMAL always @(posedge i_clk) begin if (f_past_valid && i_rst_n) begin // Monotonically non-increasing (111..1100..00) // No sequence of “01”s anywhere assert(((~r_pri_accepted_lo)&(r_pri_accepted_lo<<1))==0); assert(w_pri_accepted_lo_oh == r_sim_priority_oh); assert($onehot0(w_pri_accepted_lo_oh)); end end // チェック本体:解除後のみ always @(posedge i_clk) begin if (!$initstate && i_rst_n) begin if (|i_req) assert(w_sim_grant_oh == o_grant); else assert(o_grant == '0); end end オープンソースでどこまでできる?フォーマル検証チャレンジ 15
  12. 検証サンプル: Round-Robin Arbiter ◼ BMCモードで検証  入力ポート N=4  入力ポート

    N=32 ◼ プロパティ一致を確認  モデル通りの動作をすることを 証明できる ◼ 実行時間  N=4 10秒以内  N=32 10分以内  これくらいのデザインであれば なんとかなる! オープンソースでどこまでできる?フォーマル検証チャレンジ 16
  13. ◼ 入力のマスク論理を間違えた!  形式検証により即時検出された  反例の波形 (VCD) が生成された  波形ビューワにより反例のチェックが可能

    検証サンプル: Round-Robin Arbiter バグ検出例 反例の波形が 表示される オープンソースでどこまでできる?フォーマル検証チャレンジ 17
  14. ◼ 真面目に検証する前に「最低限これはあってるよね」を確認できる  ライセンスフリーなので、気軽に適用してみることも可能 ◼ より複雑なデザインとかでもその考え方を適用できる  浮動小数点演算器とか、ランダム検証を流す前の簡単なチェック ◼ 2種類の形式の活用法

     シミュレーションによるテスト → 形式検証適用 ◆ デザインの安全性をより強固なものに  形式検証適用 → シミュレーションによるランダムテスト ◆ ランダムテスト前に、形式により明確な問題を取り除く 真面目な検証パタンを作る前の「露払い」として活用できる シミュレーション 基本テスト 形式検証 完全性を担保 ランダムテスト 網羅検証 形式検証 基本的な 問題を除去 形式検証を使った2つのアプローチ オープンソースでどこまでできる?フォーマル検証チャレンジ 18 検証の流れ
  15. 本日のゴール ◼ 形式検証とは? ◼ SymbiYosysで簡単な検証を実践できるようになる  小規模なVerilogモジュール ◼ SymbiYosysの応用 

    RISC-Vコアのフォーマル検証事例 ◼ まとめ オープンソースでどこまでできる?フォーマル検証チャレンジ 19
  16. RISC-Vコアの形式検証ツール ◼ 目的: 形式検証エンジンを、CPUコアの検証に使用する ◼ RISC-V Formal https://github.com/YosysHQ/riscv-formal ◼ 命令の動作を形式検証

     CPUから専用の信号線を使って重要な信号を引き出す  形式検証用の命令実行モデルと接続する  SymbiYosysにより、互いの動作が一致することを形式検証する ◼ オープンソースCPUコアを使ったサンプルあり  VexRiscv / nerv / Picorv32 / serv  本発表ではVexRiscvをサンプルとして使用 オープンソースでどこまでできる?フォーマル検証チャレンジ 20
  17. rvfi_testbench rvfi_wrapper RISC-V Formalの仕組み ◼ CPUコア本体  CPUコア部  RVFI部

    ◼ RVFIラッパー部  CPUコア本体をインスタンス化する  バスインタフェース ◼ 検証部  標準チェック: 命令、PC、レジスタ、因果関係、ライブネス検証  メモリチェック: 命令メモリとデータメモリの整合性検証  カスタムチェック: 特定の制約やプロパティ検証 CPUコア RVFI Monitor instruction formal checker RVFI 命令の種類だけ置き換え オープンソースでどこまでできる?フォーマル検証チャレンジ 21
  18. ◼ RISC-Vコアと形式検証ツールを接続するためのインタフェース  要するに、CPUの内部から命令の主要な情報を抽出するための信号群  RISC-V Formalはこの信号を使って SymbiYosys にCPUコアの情報を接続する RVFIと命令の形式記述

    // ADDIの形式記述 // insn_addi.v // ADDI instruction wire [`RISCV_FORMAL_XLEN-1:0] result = ¥ rvfi_rs1_rdata + insn_imm; assign spec_valid = ¥ rvfi_valid && !insn_padding && ¥ insn_funct3 == 3'b 000 && insn_opcode == 7'b 0010011; assign spec_rs1_addr = insn_rs1; assign spec_rd_addr = insn_rd; assign spec_rd_wdata = spec_rd_addr ? result : 0; assign spec_pc_wdata = rvfi_pc_rdata + 4; RVFIを通じて rdata がこの値なら、 演算結果はこうなるはず、 というモデル オープンソースでどこまでできる?フォーマル検証チャレンジ 22 rvfi_wrapper CPUコア RVFI Monitor instruction formal checker RVFI
  19. VexRiscvで実際に動かしてみる $ export test=insn_addi_ch0 $ rm -rf checks/$test $ make

    -C checks -j$(nproc) $test $ python3 disasm.py $ checks/$test/engine_0/trace.vcd • ADDI命令単体の検証を実施 • 初期設定では有界モードでの検査を行う • 検証にかかる時間は約9分(目安) • ステップ数が1なので、おそらく問題なく 進行可能 オープンソースでどこまでできる?フォーマル検証チャレンジ 23
  20. ◼ VexRiscvに新規命令を追加して形式検証  CLZ命令(B拡張): Count Leading Zero命令 ◆ 上位から連続するゼロを数える命令 ◼

    やること  VexRiscvの改造  CLZ命令向けのコンフィグレーションの追加  検証用のモデルを追加 少しだけ応用実験: 新規命令の追加 Fetch Decode Execute Mem WB CLZ CLZの演算器を 追加 always @(rvfi_rs1_rdata) begin result = 0; found = 0; for (i=0; i<`RISCV_FORMAL_XLEN; i=i+1) begin if (rvfi_rs1_rdata[i] == 1'b1) result = 0; else result = result + 1; end end assign spec_valid = rvfi_valid && !insn_padding && insn_funct7 == 7'b 0110000 && insn_funct5 == 5'b 00000 && insn_funct3 == 3'b 001 && insn_opcode == 7'b 0010011; assign spec_rs1_addr = insn_rs1; assign spec_rd_addr = insn_rd; assign spec_rd_wdata = spec_rd_addr ? result : 0; assign spec_pc_wdata = rvfi_pc_rdata + 4; CLZ命令の形式記述 CountLeadingZero の記述 オープンソースでどこまでできる?フォーマル検証チャレンジ 24
  21. ◼ 一発目:Failを確認  失敗した場所: 書き込みデータ  assert(spec_rd_wdata == rd_wdata); ◼

    波形確認  そもそもデコーダが修正できていなかった  VexRiscvはSpinalHDLという言語で記述され Verilog-HDLを生成している  Verilog-HDL側の直すだけでは限界があった ◼ 修正後  PASSを確認! 検証結果 オープンソースでどこまでできる?フォーマル検証チャレンジ 25
  22. ◼ コア全体を読み込んで形式検証を適用するという特性上 大きなコアへの適用はかなり時間を要しそう ◼ 発表者の自作OoO CPUコアへの適用も検討したが いくつかの問題があり諦めた  完全なSystemVerilogへの適用が難しい (Yosys

    の文法能力に限界がある) ◆ YosysはVerilog-HDL + 一部SystemVerilogの基本機能のみ文法解釈可 ◆ ピュアなSystemVerilogへの適用はまだ難しい  適用しても、あまりにも複雑なデザインは検証爆発する可能性 RISC-V Formalの自作コアへの適用? オープンソースでどこまでできる?フォーマル検証チャレンジ 26
  23. ◼ 例: 32-bit x 32-bit の Booth 乗算器を検証しようとしたがタイムアウト  正攻法では

    (たぶん商用のツールでも) 検証しきれない  ステップバイ・ステップのアプローチをとってみた ◆ N-bit目までの演算結果は正しいものとする (assume) ◆ (N+1)-bit目の計算結果が正しいかを形式検証する  それでも検証しきれなかった ◆ 有効モデル検査、depth=1でも難しい ◼ みんなで試して、知見をネット上に蓄積していってほしい オープンソースの形式ツールは、まだ情報が少ない オープンソースでどこまでできる?フォーマル検証チャレンジ 27
  24. 本日のゴール ◼ 形式検証とは? ◼ SymbiYosysで簡単な検証を実践できるようになる  小規模なVerilogモジュール ◼ SymbiYosysの応用 

    RISC-Vコアのフォーマル検証事例 ◼ まとめ オープンソースでどこまでできる?フォーマル検証チャレンジ 28
  25. まとめ ◼ 今日覚えてほしいこと  「形式検証は完全一致しないと意味ないのでは?」それ以外の使い道もある  有界モデル検査を使った「最初の露払い」としても強力 ◼ オープンソースの形式検証ツールにより小規模 or

    中規模程度の デザインが形式検証できるレベルになっている  シンプルなモジュール  (シンプルな)RISC-V CPUコア オープンソースでどこまでできる?フォーマル検証チャレンジ 29