Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

シンセサイザ

veryl synth はプロジェクトに対して簡易的な論理合成を行い、概算の面積・タイミング・電力を報告します。これは設計検討中に素早くフィードバックを得るためのツールであり、本格的な合成フローの代替を意図したものではありません。設計は選択したライブラリ内の代表的なセル群へマッピングされますが、配置配線・負荷容量・駆動能力・Vth の選択は考慮されません。

$ veryl synth

トップモジュールは以下の優先順位で選択されます。

  1. 指定されている場合、CLI の --top <name>
  2. 設定されている場合、Veryl.tomlsynth.top
  3. プロジェクト内で最初に見つかったユーザーモジュール

セルライブラリ、クロック周波数、トグル率といった設定項目については [synth] を参照してください。

出力

デフォルトでは、veryl synth は1行のサマリと、面積/タイミング/電力の詳細ブロックを出力します。

synth: TopModule — 123 gates, 17 FFs
library: sky130_fd_sc_hd ...

summary:
  area:        1234.56 um²  (comb 1000.00, seq 134.56, mem 100.00)
  timing:        2.345 ns      8 levels  in_dat → out_dat
  power:        0.1234 mW   (leak 0.0123 mW, dyn 0.1111 mW)
                            @ f_clk = 100 MHz, activity = 0.10

area:
  ...
timing:
  ...
power:
  ...

RAM 推論

大きな配列は、depth × width 個のフリップフロップとアドレスデコード/マルチプレクサツリーではなく、SRAM マクロにマッピングされます。ビット配列マクロははるかに高密度かつ高速なため、直接モデル化することで、キャッシュやレジスタファイルといったメモリ主体の設計でも面積・タイミング・電力の見積もりが現実的に保たれます。

配列は、以下のすべてを満たす場合に RAM ブロックとして推論されます。

  • ストアドビットが ram_min_bits(デフォルト 1024)ビット以上で、depth が 2 以上である
  • リセットなしで、全ワードの動的アドレス書き込み(mem[addr] = data)により書き込まれ、書き込み箇所が最大 ram_max_write_ports(デフォルト 8)個である
  • 全ワードの動的アドレス(mem[addr])で読み出され、読み出しアドレスが最大 ram_max_read_ports(デフォルト 16)個である

if_reset の下で書き込まれる配列はフリップフロップのまま残ります。実際の SRAM にはリセットがないため、SRAM にしたい配列は RTL 上でリセットなしで書きます。部分書き込みやサブワード書き込みの場合も、配列はフリップフロップのまま残ります。

推論に失敗したものの ram_max_ff_bits(デフォルト 65536 ストアドビット)を超える大きさの動的インデックス配列は、メモリを使い果たさずにフリップフロップへ展開することができないため、代わりに合成がエラーを報告します。そのような配列を RAM として推論させるにはリセットなしで記述するか、ram_max_ff_bits を引き上げてください。

これらの閾値は Veryl.toml[synth] セクションで設定できます。

推論されたメモリの面積は面積サマリの mem 項目として報告され、--dump-area は各ブロックを形状(depth × width)とポート数でグループ化して一覧表示します。

ram: 2 blocks
    1024×32   1R1W  ×1       32768 bits       189.40 um²
     512×64   2R1W  ×1       32768 bits       189.40 um²

オプション

オプション説明
--top <name>トップモジュール名。Veryl.tomlsynth.top を上書きします。
--timing-paths <n>タイミングダンプで報告する最悪遅延エンドポイントの数。synth.timing_paths を上書きします。
--dump-irゲートレベル IR(ゲートとフリップフロップのネットリスト)をダンプします。
--dump-area推論された RAM ブロックを含む、セル種別ごとの面積内訳をダンプします。
--dump-timingクリティカルパスのトレースをダンプします。
--dump-power電力見積もり(漏れ電力+動的電力の内訳)をダンプします。
--format <format>出力形式。pretty(デフォルト、人間向け)または json
--format-version <n>JSON レポートのスキーマバージョン。--format json と併用する場合のみ有効。現在は 1 のみ。

--dump-* フラグが何も指定されない場合、面積/タイミング/電力の3つすべてがダンプされます。

JSON レポート

--format json は、人間向けのサマリの代わりに、機械可読なレポートを標準出力に書き出します。

$ veryl synth --format json
{
  "format_version": 1,
  "top": "Counter",
  "library": "sky130",
  "status": "ok",
  "cells": 19,
  "ffs": 8,
  "area": { "total": 302.5, "combinational": 122.5, "sequential": 180.0, "memory": 0.0 },
  "timing": { "delay_ns": 0.38, "depth": 4, "from": "cnt[3]", "to": "cnt[6]" },
  "power": { "total_mw": 0.0239, "leakage_mw": 0.0000271, "dynamic_mw": 0.0239, "clock_freq_mhz": 100.0, "activity": 0.1 }
}

合成に成功した場合、status フィールドは ok になります。そうでない場合は、シンセサイザが扱えない構文なら unsupported、トップモジュールが見つからないなら no_top、その他の失敗なら error になります。これらの場合は message フィールドが失敗の内容を示し、areatimingpowernull になります。