2008.05.27

FPGAに夢を見るを読んで

FPGA に夢を見るを読みました。
素晴らしい。

無条件に応援するので、わからないところはどんどん聞いて欲しい。アンテナに入れたので、それっぽいタイトルならチェックします。

FPGAは超並列マシンそのもの。今からCコンパイラ作っても、はいはい車輪車輪だけど、FPGAなら未開拓の土地がいっぱいある。某(上野氏)もFPGAボードを手に入れたという極秘情報をつかんだ今、空前FPGAブームが来ていることは間違いないです。

今のFPGA業界は、ビルゲイツは要らないがMS-DOSを切実に求めている。内部がそれなりに公開されていて、統一的なバス規格だ。AMBAは確かに良いんだけど情報が少なすぎるし、仕事でAMBA使っている人はBlogにAMBAの記事を絶対に書けないという事情もある。簡単に使えるバスはいっぱいあるけど、これぞと言うのがないから、毎回バスのI/Fを決めてデバッグしてという作業が発生し、Webでフリーのデザインを見つけてもI/Fのドキュメント読むの面倒だから自分で作る、になってしまう。

@alohakun から応援もらいました。http://twitter.com/alohakun/statuses/820028691
ビルゲイツにはなれないけど、ビルゲイツになろうとしている人を応援することはできるよ。

僕は気軽に超並列マシンが構成できる今、FPGAで出来ることがどう広がるかに興味がある。今、ハッカーの人たちってのはPCに複数の言語処理系が入っていると思う。将来は、ハッカーと言えばPCに複数のFPGAが接続されていて、用途に応じて回路を組み替えるようなそんな世界を夢見ています。毎日のように「たとえばActelを避ける」って罵り合う世界って素敵だと思う。

みんなもFPGA始めればよいと思うよ。

| | Comments (2) | TrackBack (0)

2008.03.27

なつたんメモとAdvanced FPGA Design

Advanced FPGA Design: Architecture, Implementation, and Optimization読んで、思うところがあったので自分語りしてみる。

僕自身が今までの技術をだれかに受け継いでもらおうと思い、社内向け資料として、同じような文章をコツコツと書いていた事があった。これがまた、僕の文章力とコミュニケーション能力の問題で誰も読まない。おそろしいくらいに誰も読まない。強制的に月1くらいで勉強会でもすれば良かったんだが、いろいろあってうまくいかない。大学院などで教育をしっかり受けていれば違うのだろうが、どうやってもテクニカルドキュメントにはならず、このブログ程度のメモにしかならない。会社の業務として作った資料をネタにブログを書くわけにも行かず、「なつたんのFPGAメモ」はただHDDの肥やしとなっていた。

それがこの本のおかげで本当に救われた。僕がまとめていたことが、同じレベルで書いてある。僕のメモの方が実務がからんでいるのでいろいろと生々しいが、そこをのぞいてシンプルに書くとこの本と同じになる。実際、僕のメモの一番最初は「FPGAの速さとは」というタイトルで、この本のChap1から持ってきたデジタル回路の速度と高位合成とほぼ同じ内容が書いてある。そこから先は、ひたすら動作周波数を上げるには?という観点で書いてあるのが、一番最初に速いの定義と基本的な考え方を押さえないと話にならない。筆者とはFPGAを見ている視線が非常に近い。

この本のおかげで、大半のメモは不要になった。あとはこの本に載っていないことだけを残しておけばよい。次来た新人には、この本を教科書に勉強会をすれば良いだけ。基板、放熱、ドライブ能力、PLL、高速メモリI/FといったFPGAの外と密接に関わる部分だけ残しておけば十分だ。若い人に技術を残さないとと強く思っていた気持ちがずいぶん楽になり、一番大きな肩の荷が一つ下りた。夢としては、自分がこういう本(もしくはブログ)を書きたいという気持ちはあったんだけど、自分より圧倒的にわかりやすくまとまっているのを見ると、僕の役目はそこにないんだなとも思う。むしろ、長門ネタでもなんでもいいんで、FPGAに興味を持ってもらう人を一人でも増やす方が僕には向いている。それが僕がブログを書く理由、あなたがここを読む理由。

また明日から長門を胸に仕事も勉強もがんばろうと思う。

| | Comments (6) | TrackBack (1)

Advanced FPGA Design: Architecture, Implementation, and Optimization

Advanced FPGA Design: Architecture, Implementation, and Optimization読みました。

今世紀最高のFPGA本、翻訳が待たれる。とDan Kogai風に書いてみる。

Advancedの名前にふさわしく、FPGAの最適化について広く紹介している。
各項目の説明は少なめだが、ほぼ全領域をカバーしている。あと足りないのは個別のFPGA primitiveの使いこなしくらいだ。Xilinxメインではあるが、Alteraにもほぼそのまま応用できる。

概念だけではなくVerilogソースや図が入っていて、読んでいて飽きない。chap4, chap7, chap9, chap13, chap17は一章まるまる例題になっていて、前の章で説明したことが実際にどのように効いてくるかを説明している。例題も、暗号化、I2C/SPDIF、浮動小数点演算、Secure Hash Algorithm、RISCプロセッサとジャンルの違う物が選ばれていてうれしい。

一通り読んでみると、FPGAのエンジニアとして強いところ、弱いところがだいたい分かる。僕の場合は、強いところはパイプライン、論理合成、基板で、弱いところは算術演算、シミュレーション、フロアプラン。初心者を脱出したい人におすすめするが、ベテランエンジニアも一度自分の力を知る上で読んでみることを勧めておく。

いわいる高速道路的な本で、ベテランのエンジニアが試行錯誤したり、アプリケーションノートを読みまくったり、代理店となんどもやりとりして身につけたことを、綺麗に整理して書いてある。この本を読みながらFPGAに向かえば、僕が5年かかった道を半年~1年でいける。

初心者からベテランまで、全てのFPGAに関わる人にお勧めします。

| | Comments (0) | TrackBack (0)

FPGAにおける配置配線の話

Advanced FPGA Design: Architecture, Implementation, and Optimizationから。

Chapter16の Place and Route Optimizationがおもしろい。

FPGAの開発においてあまり配置と配線を意識したことは無かったのですが、この本にはこう書いてある。

For a design of any complexity, a good route can only be achieved with a good placement.

言われてみれば確かにそうで、まずは良い配置ありき、良い配置無しで良い配線はできない。

いくつか最適化の話もあり、QuartusIIで最適化によるレジスタの削除を抑止に書いたような話もいくつか出てきています。Xilinxの有料セミナー以外では、あまり聞けない話もあっておもしろい。

配置配線周りも、自分自身なかなか上手く使いこなせていないところがある。小さいデバイスだと配置の制約無くても何回も回せばそれなりに収束してくれるし、大きいデバイスはフロアプランナーで開こうとすると落ちる。大きいデバイスの場合は、フロアプランナー以外も不安定なので、余計な事をしないで素直に配置配線が終わるのを待っている方が良かったことの方が多い。これは、XもAも両方ね。

Xilinxのバッドノウハウの一つを紹介。
引き継いだ時にやばいプロジェクトというのは傾向があります。
・タイミング制約が正確ではない。そもそも制約がかかっていない
・タイミング制約がところどころ外してある
・それなのにタイミングエラーが大量に出ている
・FPGA Editorのlogがある
・Starting Placer Cost Tableが1じゃない。(parの-t optionで値が設定してある)

この場合、ちょっと回路を変えただけで動きが微妙に変わってしまうことが多い。
この本にも書いてありますが、こんな時はまず今の配置配線結果をそのままucfに落として、そこをスタート地点にする方法がある。回路を変更しても、最初の配置配線の結果を制約として与えることで、変更していないところへの影響を抑える。変更の結果ノード名が変わり配置配線時にエラーがでますが、それはしょうがないのでその行をコメントアウト。回路がFIXした時点で、コメントアウト部分を元に戻し、再度エラーの箇所をコメントアウトしていくとさらに良い。

Chap17には実際にFloorpalnを使ったチューニングが書いてあって、最適化したフィジカルシンセシス後の配置配線だけで10%も速度を上げている。RISCプロセッサが、Virtex2で122MHz→135MHzなのでかなりすごい。

| | Comments (0) | TrackBack (0)

2008.03.26

VerilogのCase文

Advanced FPGA Design: Architecture, Implementation, and Optimizationを読んでいたらおもしろい記述を見つけた。

module regwrite
  (
  output reg rout,
  input clk,
  input [3:0] in,
  input [3:0] ctrl
  );
  always @(posedge clk)
    case(1)
      ctrl[0]:rout <= in[0];
      ctrl[1]:rout <= in[1];
      ctrl[2]:rout <= in[2];
      ctrl[3]:rout <= in[3];
    endcase // case(1)
endmodule // regwrite

caseの中が定数で、ラベルに信号が入っている。こんな書き方できるのか。手持ちのVerilog本で調べてみたけど、こんな書き方しているのを見たことがない。この本は、こういうVerilogの文法を調べるために買ったんだけど、全然載っていない。分厚いという理由だけで選んだ自分を罵りつつも、本棚をあさる。

Verilog Golden Reference Guidesが、欲しい情報に一番近い。
それによるとcase文の文法はこう。

case (Expression0)
  Expression1, ... : Statement1
  Expression2, ... : Statement2
  ...
  [default [:] Statement]
endcase

Cのラベルの感覚でいたけど、実際はif文なのか。上の例で行くと、Expression0==Expression1が成り立つときにStatement1が実行される。Expression0==Expression1が成り立たないときは、Expression0Expression2との比較をする。なるほど。

つまり、上の例はこれと等価。

always @(posedge clk)
  if(1==ctrl[0])rout <= in[0];
  else if(1==ctrl[1])rout <= in[1];
  elee if(1==ctrl[2])rout <= in[2];
  else if(1==ctrl[3])rout <= in[3];

Quartus2では、case(1)の表記でもちゃんと合成できた。勉強になった。

| | Comments (8) | TrackBack (0)

2008.03.22

FPGAのリセット回路

Advanced FPGA Design: Architecture, Implementation, and Optimizationのリセットの章から。

同期リセットと、非同期リセットの違いについて。

非同期リセットにはメタステーブルの問題があり、同期リセットには複数クロックの時にリセット解除のタイミングがコントロールできないことと、パルスのリセットを見逃す可能性がある。

この本で紹介されているのは、リセットをかけるのは非同期で、解除するのは同期型のハイブリッド仕様。

Afd_reset_4

この構成にすると、パルスを逃すこともなく、リセットが入ると非同期ですべての回路にリセットが入り、解除はある程度シーケンスを組んで解除できる。ユーザー回路に入るリセット信号は、CLKで叩いているためメタステーブルの問題も無くなる。

これは知らなかった。今まで外部のリセット信号を、そのまま内部の非同期リセットに突っ込んでいたが、次からこの回路を使おう。

Advanced FPGA Design: Architecture, Implementation, and Optimization絶賛おすすめ中。

| | Comments (3) | TrackBack (0)

FPGAで作るMath Function

Advanced FPGA Design: Architecture, Implementation, and Optimizationに載っている方法。

整数以外の演算は仕事で使わないので縁がないが、次勉強するときのヒントにはなった。

割り算
(1)Multiply and Shift
2のべき乗で割れるように近似する。
7で割る場合、512/73=7.014を利用して73倍して512で割れば、近い値が得られる。512で割るところは9bitの右シフトなので簡単に計算できる。
乱暴な気がするが、割り算が定数の時有効。

(2)Iterative Division
筆算と同じで、何度も引く。
高速化したBoothのアルゴリズムが知りたい人はパタヘネ読もう。

(3)The Goldschmidt Method
少しずつ計算をしていって近いところを探しに行く。割り算を実行するのではなく、逆数を近似して乗算で近づけていく。順番に計算するのでパイプラインと相性が良い。浮動小数点向けの近似法。

近似のアルゴリズム
(4)TAYLOR AND MACLAURIN SERIES
級数展開して近似する。複雑な式を乗算器と加算器の組み合わせに落とすことができる。

(5)THE CORDIC ALGORITHM
Coordinate rotation digital computer の略。
有名な方法らしいが、一読では理解できなかった。後で勉強する。

この本の弱点は、参考文献が弱いこと。もう少し詳しく知りたくなったときに、章毎に参考文献が欲しい。

| | Comments (1) | TrackBack (0)

FPGAで非同期のクロックを扱う方法

Advanced FPGA Design: Architecture, Implementation, and Optimizationに載っている3つの方法を紹介します。

FPGAで非同期のCLKを扱うのは面倒なのですが、定番と呼ばれる方法があります。

(1)Phase Control
内部のDLL/PLLで必要なCLKを作ってしまう方法。例えば外部から25MHzの入力があり、内部で50MHzのCLKが必要な時を考える。このときは、25MHzからDLL/PLLを使用して50MHzを作ってしまえばよい。25MHz の信号は50MHzでたたき直して内部で使用すれば、setup/holdのバイオレーションはでなくなる。実質的に、非同期な2系統のCLKではなく、同期のとれた2系統のCLKになる。

本に書いてあるとおり、この方法が使える機会は限られていて実践的ではない。

(2)Double Flooping
synchoronization bits、dual rank flip-flop、dual rank synchronizersとも呼ぶ。クロックドメインの境界で、必ずFFで2回叩く方法。メタステートを避けて確実に0、1を伝送する。

本に書いていないけど、実際に使うときは、いわいる3線式ハンドシェークとの組み合わせが有効。パフォーマンスに影響しないレジスタの読み書き等は、このやり方がベスト。3線式ハンドシェークは、ちかくにいるおっさんベテランエンジニアに聞こう。


(3)FIFO structure
FPGAで非同期部分の転送をするには、FIFOを使うでファイナルアンサー。APEXの頃は怪しい動きをしたけど、今は全然大丈夫。

この6章は、Clockジェネレータとか、ゲーテッドクロックについて少々書いてある程度。良い本なので、おすすめ。

| | Comments (0) | TrackBack (0)

2008.03.18

FPGAの消費電力の最適化

Advanced FPGA Design: Architecture, Implementation, and Optimizationから

入力信号の立ち上がりを改善させることで、突入貫通電流を減らし消費電力が減ると書いてある。僕の経験からだと、入力よりも出力を何とかした方が、明らかに消費電力が下がる。XPowerでも同じ結果になるはず。

この章は若干内容が怪しい。筆者のやり方で消費電力が減るのなら、XPower等でどれくらい減るのか示すべきだ。

| | Comments (2) | TrackBack (0)

FPGAのエリアを最適化する

Advanced FPGA Design: Architecture, Implementation, and Optimizationから

リソースシェアリングの話
FPGAの使用率を下げるには、リソースシェアリングが基本。パイプラインをループに変換(rolling up)することで、エリアが小さくなる。

リセットの話
必要のないリセットは取ってしまうことで、エリアの最適化を図れる。タイミング調整のために、FFで叩くだけの回路はリセットを入れない事で最適化される。例えば100bitのシフターであれば、普通にリセット付きで回路を書くと、当然FFを100個使う。リセットを取り外すことで、FFの数を1/5以下に減らすことができる。

例えばこういう回路(100bitシフタ)があったとする。

module shift(input clk, input rst_x, input ind, output outd);
 reg [99:0] shifter;
 always @ (posedge clk or negedge rst_x)begin
  if(rst_x == 0)begin
   shifter <= 0;
  end else begin
   shifter <= {shifter[98:0], ind};
  end
 end
 assign outd = shifter[99];
endmodule

Cycloneをターゲットにして、Quartus2で合成した結果はこうなる。
Total logic elements 100 (register 100)
Total memory bits 0

計算通り、100個のレジスタが使われている。

これをリセット部分を抜いてみる。

always @ (posedge clk )begin
 shifter <= {shifter[98:0], ind};
end


合成した結果はこう。
Total logic elements 12 (register 7)
Total memory bits 98
レジスタの数が100個から7個に減っているのがわかる。Alteraの場合は、シフタの分メモリを使っているのに注意する。要するに内部メモリを使ってシフタを実現し、FFの数を減らしている。

シフタの最適化に関してはXilinx Deviceは優秀で、LUTをシフトレジスタとして使用することができる。Spartan3で試してみると
リセット有り:Number of occupied Slices 49
リセット無し:Number of occupied Slices 4
Spartan3は1SliceにFFが2つなので、リセット付きの回路はそのままFFを並べ、リセットを抜くと最適化されてSliceの数が減っているのがわかる。これだけみると、最適化の効果はたいしたことが無いと思われがちだが、メモリコントローラ等で、64bit、128bitのデータに対して行うと、FF100個単位で効いてくる。

ほかにもRTLでメモリを記述したときに、リセットを入れると全部FFで構成され、リセットを抜くことで内蔵メモリをうまく推論させたりしている。

おっさんの昔話的には、APEXでエリア優先にしたとき、使用率が下がったにもかかわらず動作速度がほとんど落ちないときがあった。回路規模が小さくなって、結果的に配線が短くなったから。今のデバイスは、配線の遅延よりもfanoutの影響の方が大きいのでこういう結果にはなりにくい。APEXだと、Ptermや内蔵メモリを駆使して回路を作ったので余計に配置に制約があったのかもしれない。

| | Comments (0) | TrackBack (0)

より以前の記事一覧

その他のカテゴリー

C++ | FPGA | FreeBSD | Lisp | Perl | pmeteo | Python | Systemc | Verilog | wifehack | お勉強 | プライベート | モバイル | 読書