Vivado の Design Checkpoint とは







# はじめに


この記事では Vivado の Design Checkpoint に関して、その特長と用途の説明をします。




# Design Checkpoint とは




Design Checkpoint とは簡単に言えば次のようなものです。



  * Vivado のプロジェクトを zip 形式でアーカイブしたファイル
  * 拡張子は .dcp



ただ、単純に zip 形式でアーカイブしただけではたいした意味は無いのですが、Vivado の Design Checkpoint には次のような特長があります。



  * Vivado から直接読める
  * Vivado から直接書ける
  * cell単位で別々に Design Checkpoint を読み書き出来る



これらの特長を利用して、Vivado のデザインフローの自動化、Incremental Compile、 Partial Reconfiguration などに Design Checkpoint は利用されています。特に Partial Reconfiguration に関しては別記事で詳しく紹介する予定です。


# Design Checkpoint によるデザインフローの自動化


Design Checkpoint は単一のファイルです。また、次のように入力の Design Checkpoint をなんらかの処理(implmentationなど)を行って別の名前の Design Checkpoint に書き込むことにより、次の図のようなデザインフローを作ることが出来ます。


![Fig.1 Design Checkpoint のデザインフロー](https://qiita-image-store.s3.amazonaws.com/0/24981/c79edeeb-d26e-7197-5adc-b242f7484b05.jpeg "Fig.1 Design Checkpoint のデザインフロー")


Fig.1 Design Checkpoint のデザインフロー

<br />



1. の open_checkpoint コマンドで Design Checkpoint を開きます。
2. でなんらかの処理を行います。
3. の write_checkpoint コマンドで Design Checkpoint に書き込みます。
4. の close_design コマンドで開いていた Design Checkpoint を閉じます。



このようにすることによって、 Design Checkpoint は状態が変わらない(immutableな) 単一のファイルにすることができます。これは make などのビルド自動化ツールと相性が良いです。


```Makefile:Makefile
all: output.dcp
output.dcp : input.dcp
	vivado -mode batch -source xxxx.tcl
```





# Design Checkpoint によるデザインのリンク



## デザイン例


Vivado では Design Checkpoint を cell 単位で読み書きすることが出来ます。ここでいう cell とは、Xilinxなどの EDA 業界の用語で、コンピュータープログラムでのインスタンスに相当します。

例として次のようなデザインがあるとします。


![Fig.2 Design Checkpointによるデザインのリンクの例](https://qiita-image-store.s3.amazonaws.com/0/24981/2ff83203-9784-06d0-8535-a360f757340e.jpeg "Fig.2 Design Checkpointによるデザインのリンクの例")

Fig.2 Design Checkpointによるデザインのリンクの例

<br />



この例で、デザインの名前は design_1とします。ここで U0、U1、U2 が cell です。U0 は MPU というモジュールをインスタンス化したもの、U1 は SUB をインスタンス化したものです。

このデザインで、 U1:SUB を除く他のモジュールはまとめて論理合成しておき、U1:SUB のみを別に論理合成するとします。


## トップレベルの論理合成結果を Design Checkpoint に保存


この場合、次の図のようにU1:SUB をブラックボックスとしておき、Vivado のプロジェクトを作って論理合成して top_synth.dcp という Design Checkpoint を作っておきます。


![Fig.3 トップレベルの論理合成結果をDesign Checkpointにしておく](https://qiita-image-store.s3.amazonaws.com/0/24981/08390377-83be-2045-35fd-6003e0e5575a.jpeg "Fig.3 トップレベルの論理合成結果をDesign Checkpointにしておく")

Fig.3 トップレベルの論理合成結果をDesign Checkpointにしておく

<br />




```Tcl:top_stynth.tcl
source create_project.tcl
synth_design
write_checkpoint -force top_synth.dcp.
close_design
```



## SUB の論理合成結果を Design Checkpoint に保存


一方、モジュール SUB は次のように別に論理合成してsub_synth.dcp という Design Checkpoint を作ります。ここで SUB は out_of_context というフラグをつけて論理合成します。


![Fig.4 SUBモジュールの論理合成結果をDesign Checkpointにしておく](https://qiita-image-store.s3.amazonaws.com/0/24981/2ab7a9be-5381-c6fb-5627-3cbb5f708f08.jpeg "Fig.4 SUBモジュールの論理合成結果をDesign Checkpointにしておく")

Fig.4 SUBモジュールの論理合成結果をDesign Checkpointにしておく

<br />




```Tcl:sub_stynth.tcl
source create_project.tcl
synth_design -top SUB -mode out_of_context
write_checkpoint -force sub_synth.dcp
close_design
```



## デザインをリンクして配置配線


最後にトップレベルの論理合成結果の Design Checkpoint と SUB の論理合成結果の Design Checkpoint をリンクします。

まずトップレベルの論理合成結果の Design Checkpoint(top_synth.dcp) をopen_checkpoint コマンドで開きます。次に SUB の論理合成結果の Design Checkpoint(sub_synth.dcp) を read_checkpoint で cell を指定して読み込みます。リンクした結果を Design Checkpoint(design_synth.dcp) に書き込みます。

最後に上で作成した Design Checkpoint(design_synth.dcp) を使って配置配線を行いDesign Checkpoint(design_impl.dcp) に保存します。


![Fig.5 トップレベルの論理合成結果と SUB の論理合成結果をリンク](https://qiita-image-store.s3.amazonaws.com/0/24981/3ae257b2-e27f-67c2-075e-c2cbf29e3c51.jpeg "Fig.5 トップレベルの論理合成結果と SUB の論理合成結果をリンク")

Fig.5 トップレベルの論理合成結果と SUB の論理合成結果をリンク

<br />


```Tcl:link.tcl
open_checkpoint top_synth.dcp
read_checkpoint -cell U1 sub_synth.dcp
write_checkpoint design_synth.dcp
close_design
```



```Tcl:implementation.tcl
open_checkpoint design_synth.dcp
opt_design
place_design
route_design
write_checkpoint design_impl.dcp
close_design
```



## リンクの用途


前節で説明したように、 Design Checkpoint は Vivado によって cell 単位でリンクすることが出来ます。この特長により、Vivado では、Incremental Compile や Parital Reconfiguration のデザインフローで Design Checkpoint が使われています。


# 参考


*  [「VivadoをGUIを使わずに実行するためのTclスクリプト達」 @Qiita](http://qiita.com/ikwzm/items/a0120079d2f7f86a5904)
* [「Vivado でプロジェクトを作る Tcl スクリプト」 @Qiita](http://qiita.com/ikwzm/items/666dcf3b90c36d16a0ed)
* [「Vivado Design Suite User Guide Synthesis UG901」 @Xilinx](https://www.xilinx.com/support/documentation/sw_manuals/xilinx2017_2/ug901-vivado-synthesis.pdf)