FPGA のタイミング制約はなぜ必要か

こんにちは!
記念すべき FPGA 初回投稿です。

さいきん、知人から FPGA 設計の相談を受けることがあります。
そんななか、タイミング制約を無視して設計しているケースが多かったので、今回の記事を書いてみました。

FPGA の論理設計の要素

まず、FPGA の論理設計の要素を挙げてみます。大きく 3 つ (最低限) あります。

FPGA の論理設計をするときに、Intel Quartus Prime や Xilinx Vivado などのコンパイラ (Fitter) に与えなければ行けないファイルや設定です。

  • ソースコード (VHDL / VerilogHDL)
  • デバイス定義 / IO設定
  • タイミング制約

上の 2 つはイメージしやすいのですが、特に初心者の方は「タイミング制約」を無視して設計しがちです。

FPGA の仕組みから考えるタイミング制約の必要性

FPGA の正式名称「Field Programmable Gate Array」が示すように、FPGA チップ内にはゲート素子が無数並べられていて、それらの間はインタコネクトと呼ばれる配線で結ばれています。

概念図はこんな感じです。
FPGA の IO ポートや、各種ゲート素子 / フリップフロップ / LUT との間には縦横無尽に配線があります。


例えば、下記のような VHDL コードを書いてコンパイルすると、コンパイラは FPGA 内の「どこの素子」と「どの配線」を使うか決定します。

(port / signal 宣言を省略)

process(CLK)
begin
  if (rising_edge(CLK)) then
     C <= A;
     D <= C;
  end if;
end process;

B <= D;

「どこの素子を使うか」は Mapping (マッピング) と呼ばれ、「どの配線を使うか」は Routing (ルーティング) と呼ばれます。これらを総称して Fitting (フィッティング) と呼ばれることが多いです。

上記のようにシンプルなコードだけであれば、タイミング制約を書かなかったとしても大きな問題は起きづらいです。
しかし、徐々にコード量(論理量) が増えてくると、タイミング制約を書いていないツケが回ってきます。
それは、下図のように FPGA 内が混み合ってきて素子と配線の奪い合いが起き、ゲート素子が遠い場所に配置されて期待するスピードが出なくなることです。

1 つ前の図と比べてもらえれば分かると思いますが、A - C - D - B それぞれの配線長が長くなっています。
配線長が長くなると、電気信号の伝達に多くの時間がかかるようになります。
その結果、ソースコード通りに論理が動作しなくなります。

このようなことを引き起こさないために「タイミング制約」が必要になってきます。

タイミング制約で、信号・クロックが、どのくらいのスピードで動作するのかを定義します。
コンパイラ (Fitter) は、このタイミング制約をもとに、適切な配置配線を導き出します。

次回はタイミング制約としてどのようなことを記述するのか、タイミング制約が無いときどのような問題を引き起こすのかを考えていきたいと思います。

どうもありがとうございました。

スポンサーリンク
FPGAの関連記事

Twitterでフォローしよう