
こんにちは。
マクニカでインテル® FPGA 製品の技術サポートをしている インテル・F・ハナコ です。
論理回路においてレジスタを作成しても、Quartus® Prime でコンパイルすると最適化によりマージされ削除されてしまうことがあります。
これは Quartus Prime のコンパイラが積極的にリソースの最小化をしながら 無駄なリソースを削減した結果なので、基本的には良いことです♪
★ コンパイラの最適化により、削除やマージされたレジスタ情報の確認方法は
こちらのページ の "削除やマージされたレジスタ情報の確認方法" を参照してください。
でもユーザーさんによっては、”最適化で削除されたレジスタをあえて残したい“ 状況や理由があったりします。
例えば…、(こちらをご覧ください。)
以前ご紹介した方法は、Quartus Prime のロジック・オプションを活用する方法 を紹介しました。
今回は、これらのオプションを HDL コードに直接アトリビュートとして埋め込む方法を紹介したいと思います。
適用するオプションは?
ここで使用するロジック・オプションは以下です。
Disable Register Merging オプション / Preserve Registers オプション / Preserve Fan-out Free Register Node オプション
そして、これらの使い分けポイントは、レジスタの信号が最終的にデバイスの出力ピンに影響(出力)しているかどうか です。
レジスタの信号がデバイスの出力ピンに対して… |
レジスタを保持するために使用するオプション名 (Assignment Name) |
影響している (出力されている) |
Disable Register Merging または Preserve Registers |
影響していない (出力されていない) |
Preserve Fan-out Free Register Node |
アトリビュートの記述方法
例として、保持する対象のレジスタ名を my_reg とします。
Disable Register Merging オプション
VHDL
signal my_reg : std_logic;
attribute dont_merge : boolean;
attribute dont_merge of my_reg : signal is true;
Verilog HDL
reg my_reg /* synthesis dont_merge */;
Verilog-2001 / SystemVerilog
(* dont_merge *) reg my_reg;
Preserve Registers オプション
VHDL
signal my_reg : std_logic;
attribute preserve : boolean;
attribute preserve of my_reg : signal is true;
Verilog HDL※1
reg my_reg /* synthesis preserve = 1 */;
Verilog-2001※1
(* preserve = 1 *) reg my_reg;
Notes (1)
・ preserve の後の “= 1” は省略することも可能です。
・ preserve は、他メーカーの合成ツールが適用する syn_preserve に換えても対応可能です。(互換あり)
Preserve Fan-out Free Register Node オプション
VHDL
signal my_reg: std_logic;
attribute noprune: boolean;
attribute noprune of my_reg: signal is true;
Verilog HDL※2
reg my_reg /* synthesis noprune = 1 */;
Verilog-2001 / SystemVerilog※2
(* noprune *) reg my_reg;
Notes (2)
・ syn_noprune の後の “= 1” は省略することも可能です。
・ syn_noprune は、他メーカーの合成ツールが適用する syn_noprune に換えても対応可能です。(互換あり)
以上、コンパイルで削除されたレジスタを保持する方法でした。
必要に応じてご利用ください。
なお HDL コードに直接オプションを埋め込む方法ではなく、Quartus Prime の Assignment Editor によりロジック・オプションで設定する方法は、こちらのページをご覧ください。