レジスタの複製・削除
RTL記述に書いたFF(reg変数)は論理合成時にロジックを等価に保ちつつ複製・削除されることがある。これらを禁止するには次の合成制約をreg変数に指定する。
制約 |
Quartus |
Vivado |
レジスタ の複製禁止 |
syn_replicate=0 |
dont_touch="true" 同期化FFは async_reg="true" とするとdont_touchで かつ2FFが近くに配置される |
冗長なレジスタ の削除禁止 |
syn_preserve=1 |
dont_touch="true" |
出力不使用レジスタ の削除禁止 |
syn_noprune=1 |
dont_touch="true" |
書き方の例。
(* dont_touch="true" *) reg a_cdc_r; // Vivadoの場合 (* syn_replicate=0 *) reg a_cdc_r; // Quartusの場合 |
◇
レジスタの複製が起きるのは
(1)ファンアウトが大きい信号に対してレジスタ(FF)を複製してツリーを作る場合
(2)IOセルのFFに割り当てるため内部のFFを複製する場合
で、このうち(1)の方は、ツールのファンアウトの上限設定がかなり大きいので、意図的にファンアウトの制約
(* max_fanout="50" *) reg a_r; // Vivadoの場合 (* syn_maxfan=50 *) reg a_r; // Quartusの場合 |
を入れないかぎり起きないようだが、もし起きてもWarningでなく単なるInformation扱いなので見落とさないように注意。
万一、レジスタ複製されると不都合なのは、非同期信号を受ける同期化FFなので、ここにはレジスタ複製禁止の合成制約を入れておいた方が安全かもしれない。
× 各2FFに異なる値がラッチされうるので不都合
○ 2FFでラッチされた後にバッファリングされるのでOK