レジスタの複製・削除

[] [] []


RTL記述に書いたFF(reg変数)は論理合成したネットリストでも保持されているが、ロジックが等価であれば複製・削除されることがある。これらを禁止するには次の合成制約をreg変数に指定す

制約

QuartusII

XST

Vivado

レジスタの複製禁止

syn_replicate=0

register_duplication="no"

dont_touch="true"

同期化FF

async_reg="true"

とするとdont_touchでかつ2FFが近くに配置される

冗長なレジスタの削除禁止

syn_preserve=1

equivalent_register_removal="no"

dont_touch="true"

出力不使用レジスタの削除禁止

syn_noprune=1

optimize_primitives="no"

dont_touch="true"

書き方の例。

(* register_duplication="no" *) reg a_cdc_reg; // XSTの場合

(* syn_replicate=0 *) reg a_cdc_reg;            // QuartusIIの場合

レジスタの複製が起きるのは

(1)ファンアウトが大きい信号に対してレジスタ(FF)を複製してツリーを作る場合

(2)IOセルのFFに割り当てるため内部のFFを複製する場合

で、このうち(1)の方は、ツールのファンアウトの上限設定がかなり大きいので、意図的にファンアウトの制約

(* max_fanout="50" *) reg a_reg;        // XST,Vivadoの場合

(* syn_maxfan=50 *) reg a_reg;          // QuartusIIの場合

を入れないかぎり起きないようだが、もし起きてもWarningでなく単なるInformation扱いなので見落としやすいので注意。

このようにレジスタ複製されると不都合なのは、非同期信号を受ける同期FFである

×複数のFFに異なる値がラッチされうるので不都合

2FFでラッチされた後にバッファリングされるのでOK

したがって、非同期入力の同期化FFには必ずレジスタ複製禁止の合成制約を入れておいた方がよい。

◇◇

論理合成だけでなく、配置配線ツールでもタイミング制約を満たすためにレジスタ複製する機能がある。これはRTL記述に合成制約を書いても効かないので、もしオプションを使う場合は複製されて不都合な箇所がないかチェックする必要がある。


[] [] []