FC2カウンター FPGAの部屋 2005年10月14日
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Re: FPGAでディレイ >>>保証なし

間違って、タイミング制約が厳しくPlace & Routeが配線できないで、仮に配線したものでタイミングを見ていました。修正します。
------------------

mfreemanさんのページで今話題のFPGA内遅延素子の話題を載せていた。それによるとスパルタン3-400-5で4段のBUFプリミティブのディレイを入れると遅延は1.5ns程度だそうだ。タイミングアナライザで公式ディレイを確かめてみた。
ソースはmfreemanさんのソースを丸ごとそのまま、遅らす信号を入力ポートにして、遅れた信号を出力ポートとした。(3段ディレイ入り)入力ポートと出力ポートは、チップ上で隣のパッドとした。(FT256パッケージでC9とD9)
まずは何もタイミング制約を加えずにコンパイル。タイミングアナライザで見てみると、
Maximum delay is 7.982ns.
--------------------------------------------------------------------------------
Delay: 7.982ns (data path)
Source: in_port (PAD)
Destination: out_port (PAD)
Data Path Delay: 7.982ns (Levels of Logic = 5)
Constraint Improvement Wizard
Data Path: in_port to out_port
Delay type Delay(ns) Logical Resource(s)
---------------------------- -------------------
Tiopi 1.686 in_port
in_port_IBUF
net (fanout=1) 0.428 DIN_1
Tilo 0.529 u1
net (fanout=1) 0.211 DOUT_1
Tilo 0.529 u2
net (fanout=1) 0.060 DOUT_2
Tilo 0.479 u3
net (fanout=1) 0.266 DOUT_3
Tioop 3.794 out_port_OBUF
out_port
---------------------------- ---------------------------
Total 7.982ns (7.017ns logic, 0.965ns route)
(87.9% logic, 12.1% route)

次にディレイを抜いて、IN-OUT直結にする

Maximum delay is 5.766ns.
--------------------------------------------------------------------------------
Delay: 5.766ns (data path)
Source: in_port (PAD)
Destination: out_port (PAD)
Data Path Delay: 5.766ns (Levels of Logic = 2)
Constraint Improvement Wizard
Data Path: in_port to out_port
Delay type Delay(ns) Logical Resource(s)
---------------------------- -------------------
Tiopi 1.686 in_port
in_port_IBUF
net (fanout=1) 0.286 out_port_OBUF
Tioop 3.794 out_port_OBUF
out_port
---------------------------- ---------------------------
Total 5.766ns (5.480ns logic, 0.286ns route)
(95.0% logic, 5.0% route)

3段ディレイ回路のタイミングアナライザにより遅延の保証値は2.216ns。これをmfreemanさんの実測地1.5nsと比べてみると147%になる。これを見ると保証値は実測値の1.5倍になっているので、周期で2/3倍になるということ。つまり15nsが10nsになるので、66MHzのつもりが100MHzで動いちゃったということになら良いよね~!!
でも、結構差がある。
次に、タイミング制約をかけてみる。入力ポートから出力ポートまで7.4ns。
タイミング制約は、
INST "in_port" TNM = "in_port";
INST "out_port" TNM = "out_port";
TIMESPEC "TS_inout" = FROM "in_port" TO "out_port" 7.4 ns;


3段ディレイ入りは、

Maximum delay is 7.837ns.
--------------------------------------------------------------------------------
Delay: 7.837ns (data path)
Source: in_port (PAD)
Destination: out_port (PAD)
Data Path Delay: 7.837ns (Levels of Logic = 5)
Constraint Improvement Wizard
Data Path: in_port to out_port
Delay type Delay(ns) Logical Resource(s)
---------------------------- -------------------
Tiopi 1.686 in_port
in_port_IBUF
net (fanout=1) 0.294 DIN_1
Tilo 0.529 u1
net (fanout=1) 0.014 DOUT_1
Tilo 0.479 u2
net (fanout=1) 0.296 DOUT_2
Tilo 0.479 u3
net (fanout=1) 0.266 DOUT_3
Tioop 3.794 out_port_OBUF
out_port
---------------------------- ---------------------------
Total 7.837ns (6.967ns logic, 0.870ns route)
(88.9% logic, 11.1% route)

と少しばかり速くなっている。しかし、DOUT_1が0.014nsなのに、DOUT_2が0.296nsもかかっているのはなぜ?同じようなルートなのに。。。FPGA Editorで見たインスタンスの配置はこれ。
spartan3_buf3_ins.jpg


IN-OUT直結は、
Maximum delay is 5.766ns.
--------------------------------------------------------------------------------
Delay: 5.766ns (data path)
Source: in_port (PAD)
Destination: out_port (PAD)
Data Path Delay: 5.766ns (Levels of Logic = 2)
Constraint Improvement Wizard
Data Path: in_port to out_port
Delay type Delay(ns) Logical Resource(s)
---------------------------- -------------------
Tiopi 1.686 in_port
in_port_IBUF
net (fanout=1) 0.286 out_port_OBUF
Tioop 3.794 out_port_OBUF
out_port
---------------------------- ---------------------------
Total 5.766ns (5.480ns logic, 0.286ns route)
(95.0% logic, 5.0% route)

こっちは同じ。FPGA Editorで見たインスタンスの配置はこれ。
spartan3_inout.jpg


さて、差は7.837-5.766=2.071ns。実測値1.5nsの138%。タイミングアナライザで保証された最大遅延が15nsならば11nsで動くという分けだ。66MHzが92MHzくらい。少し短縮したが、まだまだ離れている感じ。
最後におまけ。今までは、OUTポートのスルーレートはSLOWだったがFASTにしてやってみた。タイミング制約はあり。
3段ディレイ入り

Maximum delay is 5.314ns.
--------------------------------------------------------------------------------
Delay: 5.314ns (data path)
Source: in_port (PAD)
Destination: out_port (PAD)
Data Path Delay: 5.314ns (Levels of Logic = 5)
Constraint Improvement Wizard
Data Path: in_port to out_port
Delay type Delay(ns) Logical Resource(s)
---------------------------- -------------------
Tiopi 1.686 in_port
in_port_IBUF
net (fanout=1) 0.294 DIN_1
Tilo 0.529 u1
net (fanout=1) 0.014 DOUT_1
Tilo 0.479 u2
net (fanout=1) 0.296 DOUT_2
Tilo 0.479 u3
net (fanout=1) 0.266 DOUT_3
Tioop 1.271 out_port_OBUF
out_port
---------------------------- ---------------------------
Total 5.314ns (4.444ns logic, 0.870ns route)
(83.6% logic, 16.4% route)

やはり格段に速くなった。出力バッファの遅延時間は3.794-1.271=2.523nsも違う。
東エレのDDR SDRAM2セミナでも、LUTを遅延素子としてデータを遅延するやり方が紹介されていたし、やはりこういうやり方もありなんだと思った。でも、確実に遅延を調整するにはやはりFloorplannerで位置固定が望ましいのであろう。。。

後で自分でも遅延を測定して、タイミングアナライザの値と比べてみたい。
  1. 2005年10月14日 21:28 |
  2. FPGAチップ内の配線方法
  3. | トラックバック:0
  4. | コメント:6

HDL言語について

ハードウェア記述言語(HDL)初心者にコーチしていると、いろいろ凄い記述に出会う。
ソフトウェアは学んでいても、ハードウェアは余りやってこなかった人々なので、VHDLを書いても自由に書いてしまうのだ。
私は、回路図からHDLに移行したので、実際の回路のイメージをHDLで表すように書いてきたが、やはり思考過程が全然違うようだ。
ちゃんとFFと推定されるように、セレクタとして働くように記述を直してやるが、そういうことをしていると、いまさらながら、HDLの記述のほんの一部だけしか使っていないんだな、と感じる。当たり前のように、論理合成ツールに回路を推定させるような記述をしてきたが、それに縛られているんだなということが感じられてとても新鮮だった。
そして問題は、そういう記述をしてもシミュレーターが一見正しいようなタイミングチャートを返してしまうことがあることだ。そのような記述をしても、論理合成ツールが頑張って、クロックで同期しないいろんなラッチをLUTで生成して、でっち上げてしまうこともある。その場合、水晶発信器の周波数が50MHzなので、20nsで動作するところ、150nsなどとタイミングレーポートされる時もある。
型にはめるのが安全だが、惜しいような気もする。時々、”そうか、こういうふうに書いても大丈夫なのか”と思う時もあるし。
自分でもテストベンチを書いているときは、動作周波数も考えなくて良いし、とてものびのび書いている気がする。
  1. 2005年10月14日 06:03 |
  2. その他のFPGAの話題
  3. | トラックバック:0
  4. | コメント:2