ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

加算器を作ろう マルチサイクルによる加算

CLKの周波数を維持したままタイミング制約を満たさない加算を実行するには、マルチサイクル制約を使うという手法があります。要するに加算自体を数クロックかけて行うので、タイミング制約は緩くしてねという事です。クロックによる同期設計を半ば放棄しているのでデメリットは沢山あるのですが、余計なFPGAリソースを使わないという素晴らしいメリットがあります。

マルチサイクルの指定は、入力が確定してから結果がでるのが数クロック後でかまわないといった状況で使われます。具体的には、バースト転送時の境界判定で使われる if(start_address + burst_lengh >= end_address) のような計算です。パラーメータはバースト開始時に与えられ、計算はバースト終了直前に求まっていればよいので、このような手法が使えます。flex10kといった古いFPGAでは見たことがありますが、最近ではまず使われません。

マルチサイクル制約の設定

加算器の入力の入力a,bから加算器の出力までを2CLK使う場合、sdcファイルにこのように追加します。

set_multicycle_path -setup -end -from [get_registers {a[0] a[1] ・・a[127] b[0] ・・・b[127]}] -to [get_registers {simple_adder:u0|c[0] ・・・ simple_adder:u0|c[128]}] 2

合成結果はFmax=348.68 MHzと約倍になっています。