☘️

SDCx: SDC(Synopsys Design Constraints)ツールキット

2023/12/18に公開

はじめに

SDC(Synopsys Design Constraints)とはFPGA/ASICの設計制約を記述するための言語です。名前のとおりEDAツールベンダであるSynopsys, Inc.の独自規格なのですが、事実上の業界標準として広く使われています。

設計制約(特にタイミング制約)は非常に重要で、間違った制約を用いてFPGA/ASICの設計を行うと(たとえRTL設計が完全に正しくても)、製造後に全く動作しないことが判明したりしてしまいます。

しかしSDCをサポートする環境は決して充実しているとは言えない状況です。一般に論理合成ツールやSTAツールがSDCを扱いますが、その扱いはあくまで「論理合成やSTAの準備段階としてSDCを読み込める」という程度のものであり、SDC自体のチェックや編集といった機能があるわけではありません。もちろんOSSのツールサポートはさらに貧弱な状況です。

というわけで「ないなら作ればいい」の精神でSDCを扱うためのツールを作ることにしました。

SDCの規格

SDCはSynopsysの独自規格なのですが、Synopsysは他社がSDCを扱うツールを作れるように規格と参照実装を公開しています。また参照実装は他社の商用製品に組み込んでもよいというライセンスになっています。
(Synopsysはこれをオープンソースと言っていますが、いわゆるOSI準拠のオープンソースライセンスではなく独自ライセンスと思われます)

Technology Access Program (TAP-in).

ダウンロードに際し個人情報の入力を求められますが、特に入力内容をチェックされる様子もなくダウンロードされます。

ちなみにこの手の規格にありがちなことですが、PDFのドキュメントに書かれた規格の内容と参照実装が矛盾していたり、どこにも書かれていない仕様があるなど、どうしても実際のSDCを見ながら調整していくしかない部分もあります。

SDCx

https://github.com/dalance/sdcx

SDCxはSDCを扱うためのRustライブラリとCLIツールです。ここではCLIツールの機能を紹介します。

sdcx check

sdcx checkコマンドは入力されたSDCの構文チェックを行います。
未定義コマンドや未定義引数の使用、指定されたSDCバージョンとの不整合を確認できます。

以下は未定義コマンド検出の例です。特にFPGA向けのSDCではFPGAベンダ固有のコマンドが含まれていることがよくあります。これらはsdcx checkでチェックすることができますが、sdcx check以外の操作を行う場合は特にエラーは出さずそのコマンドをそのまま維持します。

$ sdcx check cdctl.sdc
error[sdcx::errors::ValidateError]: Unknown command
   ┌─ testcase/cdctl.sdc:15:1
   │
15 │ derive_pll_clocks -create_base_clocks
   │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Found

sdcx fmt

sdcx fmtコマンドは入力されたSDCを整形して出力します。

$ cat sample.sdc
create_clock   -name    CLK    -period   10
$ sdcx fmt sample.sdc
create_clock -period 10 -name CLK

整形のルールは以下の通りです。

  • 同じ種類のコマンドはアルファベット順にソートされる
  • コマンド引数はあらかじめ決まった順に並ぶ
  • 不要な空白、\による行継続は削除される
  • ファイルヘッダ(ファイル先頭のコメント)以外のコメントは削除される

論理合成ツールによってはSDCを出力する度にコマンド順序がランダムに変わってしまうものがあり、gitなどの差分と非常に相性が悪いのですが、フォーマットすることによりその問題を解消することができます。

sdcx dump

sdcx fmtコマンドは入力されたSDCから情報を抽出して出力します。

$ sdcx dump --clock sample.sdc
Clock: name=CLK, period=10

現状は単純なテキストフォーマットですが、JSONで他ツールとの連携をやりやすくしたり、Graphvizのようなツールで階層関係を可視化するようなことができると面白いかもしれません。

今後の予定

SDCを編集するためのコマンドを追加する予定です。
クロック名のリネームや特定コマンドの抽出、階層変更などができるといいのではないかと考えています。
編集内容を与える方法について現在検討中です。

おわりに

作成中のSDCサポートツールについて紹介しました。機能追加のリクエストなどあればコメントでもGitHubのissueでも(必ずしも対応できるとは限りませんが)お気軽にどうぞ。

Discussion