« February 2008 | Main | April 2008 »

2008.03.31

言語占い

プログラミングGauche」を読んで、再びSchemeの魅力に取り憑かれる。PythonもC++も勉強したいし、勉強したいことが多すぎて困る。

SystemCやるならC++だし、変態を自重するならPythonだし、メタプロするならSchemeが良いよね。でも、メタプロなら、C++のテンプレートも最高だよね。って、あれだ。一緒に遊園地行くならゆうゆだけど、奥さんにするならまみまみだよね、くらいのノリなんだと思う。もちろん、僕は両方ゆうゆですが。分からない人は、冒険に行くならビアンカだけど、結婚するならフローラだよね、でもよい。僕は両方フローラですが。

いい加減男らしくばしっと決めたいので、言語占いで決める事にした。

言語占いってのは、雑誌で良くある奴ね。

問1:最先端の技術を使いたい。YES→問2へ NO→じゃあ、COBOLで
問2:英語は苦手 YES→変数をローマ字で書いてもOKなCOBOLをおすすめ NO→問3へ
問3:Webアプリを作りたい YES→そんなナンパな気持ちは捨てて、COBOLを勉強しろ。NO→圧倒的な実績のあるCOBOLをおすすめ

こんな感じで、YES、NOを答えていくだけですぐに、あなたにおすすめの言語を選んでくれる。こりゃ楽だ。
雑誌の弱点として、いまいち僕を対象にしていないというか、不特定多数を対象にしすぎている。なければ作ってしまえば良くて、自分で占いを作る事にした。前からSICPのAMBが仕事で使えないかな~と思っていたので、題材にしてみる。やる夫は五階に住んでいません、ってやつね。

問1:AMBをPythonで書いてみる。納得いく物ができたか?
   YES→問2へ
   NO→言語レベルで継続をサポートしているGaucheおすすめ。

問2:AMBをC++で書いて見る。納得いく物ができたか?
   YES→C++おすすめ
   NO→君にはC++は10年早い。Pythonがおすすめ。

ちょっと占ってみよう。

# 一応書いておくけど、ネタだからね><

| | Comments (0) | 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.24

今日の日記

始発から二本目の電車に乗って、7時半に華麗に出社!
NDSを持ってトイレに行く。まだお腹の調子が良くない。セシル、ヤンレベルアップ
ブラインドを上げたり、空気の入れ換えをして素敵な月曜日の始まり。
会社のメンバーのために、気を利かしてコーヒーのお湯などを沸かしてあげようとする

セキュリティーのキーを部屋の中に忘れて閉め出される!7時45分
携帯もPDAもNDSも本も持っていない!

しょうがないので8時から開いてる本屋へ行く。
ロベール先生のC++本、Joelの本、ゲーム開発者のためのAI入門を買う。一万円札がたったの5分で3冊の本に変わる。
約一時間近く、ロックのかかった扉の前でJoelの本を読む。素晴らしい。
9時15分に同僚登場、ようやく中に入れる。

今日は9時半からの打ち合わせがあって助かった。普段なら10時まで部屋に入れないところだった。

今週も素敵な一週間になりますように。

| | Comments (3) | 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.20

今日の日記

先週社員旅行にいってから、鼻が詰まって、耳もつまっているような感じ。
今日ついにおなかが痛くなってきた。泣ける。
お昼に食べた豚肉のお弁当がまずかった気がする。

・コンピュータ科学者がめったに語らないこと
 社員旅行で旅館に着いた後は、非コミュっぷりを十二分に発揮し、ずっと
読んでました。乱数と無限について、ちょっと考えるような所があったけど、
全体としてはよくわからんなぁと言うところ。全体的に同じような感じなので、
まずは立ち読みして中身を確認することをおすすめします。

・C言語 デバッグ完全解説
ときどきの雑記帖 i戦士篇で紹介されていたので、早速購入。

ここ数日は電車の中でがぶり読み。すごく良い本。
strchrの使い方とか、知らないことがいっぱい書いてあった。
今まで「エキスパートCプログラミング」とか「Cプログラミング専門課程」を読まない
といけなかったことが、一冊にまとまっていて勉強になった。デバッグに対する姿勢は
Cプログラマで無くても十分に役に立つ。値段もそんなに高くないので、C言語の文法の
次の本となると、この一冊を薦めます。

著者である、坂井弘晃さんが理科大の先輩!と思ったら、同い年で何故かへこんだ。
米山君と同期ですね。とどうでも良いことを書いてみる。

・DS版 FF4 クリアーしました。
 レベルが80を超えていたので、それほど苦労することなくラスボスを倒しました。
 こうして世界は救われました。

・腹痛
いてててて。いてーよー。いてーよー。

| | Comments (2) | 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)

2008.03.17

FPGAの動作周波数を上げる5つの方法

Advanced FPGA Design: Architecture, Implementation, and Optimizationに載っている5つの方法を紹介します。
→以下が私のコメントです。

1.レジスタの層を増やす
A * X + B * X1 + C * X2のような演算を1CLKで実行している所があればレジスタを入れて演算を区切る。A * X、B * X1、C * X の乗算を1CLKで行い、次のCLKで3つの加算を行うようにすれば、動作周波数が上がる。
→とりあえずFFを追加して4.レジスタバランスに任せるという手もある。

2.並列に演算できる部分を切り出す
たとえば、8bitの乗算を上位下位それぞれ4bitにわけ、1CLK目で上位、下位、および組み合わせでそれぞれ乗算する。次のCLKで、それぞれをBitシフトして足せば動作周波数があがる。
→単純な乗算であれば、MegaWizard等のGUIツールで設定すればレイテンシーにあわせて動作周波数を上げてくれる。ただし、周波数が上がる理由は押さえておくべき。

3.ロジックを平坦にする
if(ctrl[0])rout[0] <= in;
else if(ctrl[1])rout[1] <= in;
else if(ctrl[2])rout[2] <= in;
else if(ctrl[3])rout[3] <= in;

というようなロジックに対し、ctrl[3:0]が2bit立つことが絶対にないのなら、elseは不要。

if(ctrl[0])rout[0] <= in;
if(ctrl[1])rout[1] <= in;

と最適化でき、動作周波数を上げられる。
→今のツールがやってくれない最適化なので、自分でやらないといけない。回路図入力の世代は余裕でできるので、一度教わると良い。

4.レジスタバランスの機能を使う
論理が変わらない範囲で、レジスタの前後にロジックを振り分けて動作周波数を上げることができる。論理合成ツールの最適化オプションで設定できる。
→マッピング後にノードが見つからないとか、信号を引き出した時点で最適化を妨げるので、何をしているかの理解は必須。

5.パスの再配置
if文の優先順位を入れ替えることで、動作周波数を上げることができる。

if(cond1) Out <= A;
else if(Cond2 && (C < 8)) Out <= B;
eles Out <= C;

このようなif文に対して、cond1と、Cond2 && (C < 8)を入れ替えることで動作周波数が上がることがある。
→ 動作速度ぎりぎりの回路を作る時には必須の知識。3.ロジックを平坦にする と同じく、○○と△△が同時に真になることはない等論理合成ツールが知り得ない情報を使用する必要がある。デコード条件を減らすために、ステートマシーンを手で書いたワンホットにすると効果大。タイミングレポートを見ながら、レジスタに入る入力数を数えていると、自然にできるようになる。当然ながら保守性は落ちるので、ソースにコメント入れるなり、何かしらのアサーションを入れておきましょう。

ここに書かれていない簡単な手動最適化だと、カウンターを一つ前の値と比較するってのがある。ダウンカウンターがあるとして、if(count==0)のような比較を行うと、カウンターのビット数がそのまま入力ロジックになってしまう。そこで次が0なら1になるレジスタnext_count_equal_zero <= (count == 1) ? 1 : 0;を作る。そうするとif(count==0)がif(next_count_equal_zero)の1bitの比較になるので、入力信号がずいぶんと減る。高速のメモリコントローラでバースト長を数える時などに使う。これは、ある条件下(バースト転送中等)ではcountの値が1の次は必ず0になるという、合成ツールが知りえない情報を使用して最適化をしている。

ほかにもちょこちょこあるけど、今日はここまで。FPGAに限っていえば周波数をあげるというのはFFへの入力を減らすとほぼ等価なので、回路図入力で設計経験があるベテランエンジニアに聞くといろんなことを知っている。

この本はここまでたった16ページ。全てVerilogソースと、合成後の回路図付き。すばらしい。

| | Comments (0) | TrackBack (0)

2008.03.13

長門とBrainFuck

どうも世界的に長門+BrainFuckの時代が来ていたようです。

プログラミング言語「長門有希」を発見しました。すばらしい。

| | Comments (0) | TrackBack (0)

デジタル回路の速度と高位合成

Advanced FPGA Design: Architecture, Implementation, and Optimizationの一番最初のトピックからすごい。高位合成にもからむ話。

Seedというのは、Throughput、Latency、Timingの3つの要因がある。
Throughput:単位クロックあたりにどれだけのデータが処理できるか
Latency:入力を入れてから結果が出るまでのクロック数
Timing:最大周波数
これに使用リソース(クロック、乗算器、メモリなど)が絡んでくる。

最初の例は、入力の3乗を求める回路。Cで書くとこんな感じ。

XPower = 1;
for(i=0;i<3;i++){
  XPoewr = X * XPower;
}

これをハードに落とすときに、何を重視するかで少なくとも3つの実装があって、それぞれを比べています。
面白そうなので僕もやってみました。そのままだとあんまりなので、16bitのデータの4乗で比較してみます。

回路1:リソース優先


module pow4
  (output reg [15:0] XPower,
   output finished,
   input [15:0] X,
   input clk, start);
  reg [15:0] ncount;
  assign     finished = (ncount == 0);
  always @ (posedge clk)
    if(start)begin
      XPower <= X;
      ncount <= 3;
    end else if(!finished) begin
      ncount <= ncount - 1;
      XPower <= XPower * X;
    end
endmodule

普通にループで回すとこうなります。回路としては遅が、使用リソースが少なく、ncountをロード可能にすることで、4乗以外にも対応できるのが特徴。乗算器の数は少なくなるが、ハンドシェイクやカウンターなどの制御回路が若干増える。

配置配線後のこの回路の性能はこうなります。
Throughput 16/4 = 4bit/CLK
Latency 4clk
Timing 169MHz
9bit multiplier 2

回路2:スループット優先(パイプライン)

module pow4
  ( output reg [15:0] XPower,
    input clk,
    input [15:0] X
    );
  reg [15:0]       XPower1, XPower2, XPower3;
  reg [15:0]       X1, X2, X3;
  always @ (posedge clk) begin
    //pipeline stage1
    X1 <= X;
    XPower1 <= X;
    //pipeline stage2
    X2 <= X1;
    XPower2 <= XPower1 * X1;
    //pipeline stage3
    X3 <= X2;
    XPower3 <= XPower2 * X2;
    //pipeline stage4
    XPower <=XPower3 * X3;
  end
endmodule

普通のパイプライン。レインテンシーとリソースを犠牲にしてスループットを高めたバージョン。これが綺麗に決まるとき、ハードウェア化の意義が出てきます。

Throughput 16bit/CLK
Latency 4clk
Timing 167.39MHz
9bit multiplier 6

回路3:レイテンシー優先


module pow4
  (output reg [15:0] XPower,
   input [15:0] X,
   input clk
   );
  reg [15:0] X1;  
  always @ (posedge clk) begin
    X1 <= X;
    XPower <= X1 * X1 * X1 * X1;
  end
endmodule

X1レジスタは不要なのですが、入れないと速度が測定できなかったので入ってます。1CLKで全演算をしてしまいます。CLK周波数を上げられないので、あまりこういう回路は好きじゃないのですが、通信物のパリティの計算など、どうしても1CLKで計算をし続けないといけないときはこのような回路になります。最近のFPGAは驚くほど早いので、この掛け算でも余裕で50MHz Overで動きます。

Throughput 16bit/CLK
Latency 1clk
Timing 72MHz
9bit multiplier 6

回路の比較

この3つを比較するとこうなります。


回路1 回路2 回路3
Throughput(bit/CLK) 4 16 16
Latency(CLK) 4 4 1
最大周波数(MHz) 169 167 72
9bit乗算器 2 6 6

速度や使用リソースは、Quartus2 Web edition7.2 ターゲットFPGAはEP2C20F484C7で配置配線まで行って求めています。PoorなFPGAの方が差が出やすいのですが、Cycloneは乗算器を持っていないので、Cyclone2で計算しました。

表を見てもらえればわかりますが、こっちを立てるとあっちが立たずになります。AFDには載っていないですが、4乗の場合は2×2というバリエーションもあります。最初の1CLKで2乗を計算し、次のCLKでそれぞれをかけると4乗になります。スループットが16bit/CLK、Latencyが2、乗算器は6個、動作周波数が72MHz~167MHzの間の回路になります。Latencyと動作周波数において、回路2と回路3の中間になります。

高位合成ツールの演算部分というのは、基本的にこれを半自動でやっています。CLKは100MHzで決まりとか、ここで使える乗算器は4つまでと言ったユーザーからの制約を元に、ループの処理を展開したり、一部ループにしたりしています。もちろんこんな単純ではなく、プロセッサのデータパスの設計のように、演算の依存関係を抜き出した上で、レジスタとループとALUをどうするのかを考えてくれます。

この手の話は、Verilogをやっていれば常識の範囲だと思うのですが、なかなか読みやすい形で情報がそろっていません。本屋に売っているVerilogの本には全く載っていないか、載っていても中盤以降であることが多いのです。
AFDは最初のトピックがこれなのがすごい。伊達にAdvancedを名乗っていない。お勧め。

| | Comments (2) | TrackBack (0)

2008.03.12

ANSI C style module declarations

Verilog2001の勉強を始めました。

まずはANSI Cスタイルのモジュール宣言。こんな風にモジュールの宣言ができる。

module pow4(
    output reg [15:0] XPower,
    output finished,
    input [15:0] X,
    input clk, start);

明示的にwire宣言を入れても良い。
Quartus2(7.1)は普通に論理合成可能。ISEは試していないけど、需要あるかな。

昔はこういうの欲しかったのに、今となるとかなりキモイのは何でだろう・・・。年を取るというのは恐ろしい。

教科書は、タイトルがそのままのVerilog 2001を使っています。薄くて便利。

| | Comments (3) | TrackBack (0)

今日の日記

・また東大か!
CPU実験発表終了を見て、相変わらず東大は凄いなと思う。東大生全般に言えることなんだけど、理系なのに日本語がしっかり書けていて、言いたいことが伝わっているのが凄い。

・補足された!
はじめてのにきで僕も補足された!ヤター!
って、なんかちがう。

・Brainfuckマシーン
作ってみるといろいろ気が付く。
プロセッサ起動時にメモリが0クリアーされていないと駄目。CPUのリセット時にメモリのクリアーも要求されるのはきつい
+/- 命令は、普通のアセンブラにすると、mov、inc、movの3命令。
プログラムの終了命令がない。最後の命令まで行くと、そのままROMを読み続けアドレスのオーバーフローで先頭にもどってしまう。でもメモリが0クリアーされていないので暴走する。最後は[]で無限ループに入るのが、行儀の良い組み込み向けBrainfuckプログラム
Wikipediaの移植性の所が充実しすぎで、どう実装するのか悩んだ。
順番にしかアクセス出来ないから、先読みと組み合わせるとキャッシュのヒット率はかなり高くできるはず。
[]の実装は、プログラムカウンターを順にインクリメント/デクリメントするより、飛び先を保存した方が性能がでる。
ハード側に仕組みを持たないとブートローダーが作れない。

これくらいのネタがあれば、Brainfuck勉強会やブレサミ(Brainfuck Developper's Summit)に参加資格があるとおもう。やるときは誰か誘ってください。

・「あなた方がこの春最もやってはいけない事は,Ruby,Python,schemeなどの最先端の言語に触れる事である.」
うちにくれば、メインのVerilog以外は何の言語使っても良い。ベンチャーの数少ないメリットだな。ただShiroさんの言うとおり、普通の仕事を普通以上にこなすのは必須条件。

・2008年 あけましておめでとうございます
2007年12月9x日 ぎりぎり年内に無事納○完了。2007年12月が100日近くあって助かりました。
2008年は3月から始まるらしいのですが、今年もよろしくお願いいたします。
今年の目標は「何かイベントに参加してリアルで誰かに会う」にしようと思います。

| | Comments (0) | TrackBack (0)

2008.03.11

BrainFuckマシーンリリース なう!

FPGA上で動くBrainfuckマシーンが完成しました。

Nios Development Board, Cyclone EditionでBrainfuckが動く!

(1)特徴
・最大100MHzの高速動作(Altera社、Cyclone使用時)
・シリアルポートを標準入出力として使用可能
・移植性を考慮したデザイン。ROM、RAMのサイズ、容量が可変。UNICODEにも対応。
・335LEの超小型CPU(シリアルポートを含む)
・未定義命令を検出したとき自動的にHALTモードに遷移
・Brainfuckソースコードから、Altera MIFファイルへの変換ツール付属
・全Verilogソースコード、Veritakでのテストベンチ付属
・長門モード搭載

(2)アーキテクチャ

・命令用、データ用のメモリが分離されたハーバードアーキテクチャ
・スーパースカラ機構と組み合わされた投機的インクリメント/デクリメント
 +/- 命令時、あらかじめ両方の計算を先に済ませておき高速化を実現しています。

(3)長門モード
入力ピンNAGATO_MODE を1にすることで、Brainfuckは長門モードとして動作します。
・起動時に長門プロンプト「YUKI.N>」を表示
・プログラム中に改行コード(0x0a)を出力すると、改行後再び長門プロンプトを表示
 長門モードにおける出力は、全てハードウェアで行うため、長門プログラミングをするときにROM容量が節約できます。
・長門プロンプト専用FIFOを搭載
 送信FIFOが長門プロンプトに最適化されているため、理論値の最大速度で「YUKI.N>」を表示します。長門プロンプトを1nsでも早く表示させたい人に最適な構造になっています。

(4)動作例
Hello Worldの出力。
http://www.kmonos.net/alang/etc/brainfuck.php のソースを使用いたしました。)

長門モードでのHello Worldの出力(右はイメージ画像)


(5)ロードマップ
2008年
 Stratix3、Virtex5サポート、動作速度200MHzへ
 64bit拡張
 Brainfuck コンパイラサポート (サードパーティより提供)
2009年 Mona OSのサポート
 マルチプロセッササポート
 にょろーん☆ちゅるやさんモードサポート

ダウンロードはここ

| | Comments (2) | TrackBack (0)

2008.03.10

Advanced FPGA Design 始めました

Advanced FPGA Design: Architecture, Implementation, and Optimization

mini py演習が一区切りついたので読み出しました。これは当たりっぽい。一番最初のトピックが、速度についての3つの基本的な考えた方の説明があって電車の中でうんうんと頷く。基本となるのはこの3つ。

・スループット
・レイテンシー
・タイミング(最大周波数)

いわいるC言語のループ構造を回路に落としたときの違いについて、RTLと図入り
で説明。他のHDLの教科書でも説明してある概念なのですが、一番最初にここか
らはいるのは素晴らしい。伊達にAdvancedを名乗っていない。

Verilogソースが、alwaiys @* とか使っていておっさんVerilogじゃないのも嬉しい。
本当は、こういう内容でブログを書きたかったんですよ。

| | Comments (0) | TrackBack (0)

2008.03.07

パーサの本

構文解析の話をしようを読んで気になったこと。

LLとかLRのパーサを勉強するのに良い本は何があるのでしょう。(特にLR)
手持ちの本をいろいろと調査してみました。

Compilers: Principles, Techniques, and Tools
ドラゴンブック!バイブルの名にふさわしく、LL、LRから一通り載っている。一冊選ぶならこれかも。

Higher-Order Perl
これはLLのみ。Perlのコードが付いていて、解説もある。デバッグ出力等にも言及されていて実践的。僕はmini py 演習をこれで解いていました。

コンパイラ構成法
LLのみ。Cのソースがある。

A Retargetable C Compiler: Design and Implementation
Cのパーサを作っている。LLのみ。パラパラ見ていると、結構分かりやすい気がする。

持っていないけど気になるのがこの一冊。
Compiler Implementation In C
タイガーブック!
日記を書く[・ _ゝ・]はやみずさんで紹介されていた。目次を見るとLRっぽい?

LRパーサを、ある程度手取足取り教えてくれるなら、ドラゴンブックか、タイガーブックになるのかな。竜虎の闘いとか言っていたらtwitterでこんなつぶやきが
http://twitter.com/mayuki/statuses/765874244

他にも良い本があれば知りたい。

| | Comments (6) | TrackBack (0)

(長門の)UARTを作ろう! その2

前回の(長門の)UARTを作ろう!は、どこが長門なのか分からないというdisられっぷりと、RS-232Cのプロトコルをすっかり間違えていたという、踏んだり蹴ったりな状況でした。uartの頭にnが付いたら長門だろJK。

とりあえず、送信に関してはバグは直しました。あとは、誰がみても「はいはい、長門、長門」と言えるように長門成分を追加しました。

Nios Development Board, Cyclone Edition に突っ込んで、パソコンとシリアルケーブルをつなぐと、こんな画面が!

リセットを押すと、どんどん長門プロンプトがでてきます。ヤター!

はいはい、長門、長門

ファイルはここ。uartの送信側のバグは修正済み。

ソースの見所は、nbfk_core.v の90行目以降
 
YN_Y_STATE:begin
 sio_nagato_data_r <= 8'h59; //'Y'
 sio_nagato_wr_r <= 1;
 nagato_state <= YN_U_STATE;
end
YN_U_STATE:begin
 sio_nagato_data_r <= 8'h55; //'U'
 nagato_state <= YN_K_STATE;
end
YN_K_STATE:begin
 sio_nagato_data_r <= 8'h4B; //'K'
 nagato_state <= YN_I_STATE;
end

長門プロンプトを出力するために、ROMの読み出しなど安易な事を行わず、一文字ずつ丁寧にステートを遷移させているところに長門への愛情を感じて欲しい。

| | Comments (0) | TrackBack (0)

卒業式のノリで納品

司会「これより、平成○○年度、△△プロジェクトの納品式を行います。全員起立、礼、着席」
司会「式歌斉唱」

全員「♪どなどなどーなどーな」

司会「代理店祝辞」
代理店「○○システムの皆様、ならびに、××エンジニアリングの皆様、まずは納品おめでとうございます。本プロジェクトでは、超並列ミドルウェア□□□を採用いただきありがとうございました。そもそも○○システム様と、弊社とのおつきあいは20年前から始まりました。(・・・・・代理店の宣伝がむっちゃ長い・・・・・)」

司会「開発者から贈る歌」
開発者「♪バグなんて無いさ、バグなんて嘘さ、寝ぼけた人が見間違えたのさ!だけどちょっと、だけどちょっと、僕だって怖いさ!(元気よく)」

司会「開発者から贈る言葉」
開発者「楽しかった休日出勤」全員「休日出勤!
開発者「忘れられないバグ」全員「バグ!
開発者「様々な経験を糧に、今日僕たちは納品します」全員「納品します!

パチパチパチパチ

司会「検収書授与。株式会社○○ △△本部長様より 検収書の授与を行います。全員起立」

司会「社歌斉唱」


むう、社歌だけは、どう書いてもしゃれにならない。
知っている会社の歌しかでてこない。orz

| | Comments (0) | TrackBack (0)

おっさんVerilog

なんとなく、個人でFPGAやっている人のVerilogに共通点があるのでまとめてみた。
見よう見まねでHDLを始め、お客の希望によってAltera or Xilinx、Verilog or VHDLをいったり来たりしている人。30代~50代くらいまでを想定している。「Verilog2001なにそれ、おいしいの?」な人達。ジョークなので、マジレス不要、追加のネタ歓迎。

・ポート/変数名が全部大文字:VHDLから入った人は多い。RESET_XとかCLOCKとか。
・出力信号はいったんwireで受けて、portにassignする。:こうしておくとVHDLとの往復が楽
・ステートを自力で割り当て:ワンホットかグレイカウンターが多い。昔の合成ツールは酷かったから。
・でかいalways文に全部の論理を詰め込む、もしくは各レジスタにalways文がある。:前者はCQのサンプル回路がこんなのが多かったから、後者は回路図をそのままHDLに落とすとそうなる。
・always文で組み合わせ回路を書かない:昔の合成ツールは(ry
・負論理へのこだわり:ioのイネーブルは負論理にするとちょっと早いとか。妙なこだわりがある。
・リセット回路のこだわり:リセットとプリセットを使い分けたり、意図的にリセットを入れない回路を書く。FPGAのリソースが少なく、合成ツールがpoorだったころのノウハウ
・reg [7:0] mem [7:0]; と書かず、reg [7:0] mem_a, mem_b, mem_c, ・・・と書く:VHDLとの往復が楽。合成後にノードを追いやすい
・ノーコメント/ノーバージョン管理:動いて納品するまでが保守

Xilinxを使ってきた人に多い傾向
・defparamのようにRTL上に制約を書くのを避け全てucfに書く。もしくは、defparamを使いつつもucfで制約をかける:ISEのバグに悩まされたから。
・制約が入っているかをFPGAエディタで確認する:上に同じ
・IBUFGを手で入れる:昔は必要だった。

Alteraを使ってきた人に多い傾向
・IO専用FFを使わない:そもそも無かった。タイミング制約をしっかり書いて対応する人が多い。この信号は入力専用ピンに入れてくれ、とピン割り当てに注文が多い。
・ロウとかコラムとか気にする:ピンの位置で回路のパフォーマンスが大幅に違った頃の名残。縦に入れて横に出せ!

ちなみに僕は半分近く当てはまるのでおっさんVerilog使い。

| | Comments (5) | TrackBack (0)

2008.03.05

CとC++の本

Cプログラムの中身がわかる本
表紙は可愛い犬ですが、中身は狼なので注意が必要。GNU Development Toolsか、プログラミングの力を生み出す本―インテルCPUのGNUユーザへが内容的に近い。gccを使って、簡単なCソースがどのようなアセンブラになり、x86アーキテクチャの上で動作するかを丁寧に書いてあります。

if文や、関数呼び出し等、C言語の制御構造が一通り説明されているのは素晴らしい。合わせて、gdb等のツールの使い方も説明されている。じっくりと読んで、自分でコード書いてみて結果を確認すれば、この辺りの話くらいは普通について行けるようになります。まさにこれからバイナリアンを目指す人の為の本。この本をとっかかりに、GNU Development Toolsを読むのが良いと思いますが、それほど内容はかぶっていないので、両方読もう。GNU Development Toolsに比べると説明があっさりしている。

最後のスレッドの所は中途半端かな。スレッドが何を共有して、何を個別に持っているのか、デバッガがどういう動きでブレークしているのか、等の説明が無いと、内容が伝わらない気がします。

バカ売れする本でも無いので、Cの本コレクターは忘れずに買うこと。

C++言語のカラクリ 誕生の秘密と舞台裏
実際のC++コンパイラの歴史を追いながら、C++の舞台裏を教えてくれる本。D&Eと合わせて読むと解りやすい。
歴史的にこういう経緯があったという本であって、今のC++コンパイラがこういう動きをしているという本ではないのに注意。後半のしゃべりは要らなかった。
最低でも後半のしゃべりは立ち読みして雰囲気を把握した上で、あくまで読み物として買うのをお勧めします。

文法やライブラリの解説以外の本が、国内外で出版され続けるのもC/C++が持っている強み。

| | Comments (0) | TrackBack (0)

2008.03.04

Veritakが凄いことに!

FPGAの部屋から。

Verilog HDLシミュレータVeritakがNotepad++に対応 したので、早速試してみたがこれは素晴らしい。
会社だけでなく、家の環境も更新しよう。

mixiに入った方がよいのか悩んできた。

もう一つDoxygenの話。Verilog対応が可能か、ソースをダウンロードして見てみたけど、今の実力では全然無理。Doxygenに対応するよりは、Verilog-Perlからそれっぽいhtmlを出せるようにする方が早いと思う。頑張ってみようかな。

| | Comments (0) | TrackBack (0)

The Practice of Programming

The Practice of Programming読みました。

カーニハン先生のありがたいお言葉がぎっしり詰まっている本。若干C言語に特化している所はあるが、そこを差し引いても読む価値がある。内容はコーディングスタイルから始まって、アルゴリズムとデータ構造、ライブラリの作り方、デバッグ、テスト、チューニング、移植性、俺様言語と多岐にわたる。一つ一つの解説は少ないが、章末にはボリュームたっぷりの参考文献が載っているので問題ない。

なにげにパーサや仮想マシンを作っているから侮れない。C言語がある程度分かっていないとコードが難しい。ポストインクリメントを当たり前のように活用しているコードは、今となってはトリッキーな部類に入ると思う。(って書いたら怒られるかな)

最後の仮想マシンの所では、

int addop(Tree *t)
{
  return eval(t->left) + eval(t->right);
}

int eval(Tree *t)
{
  return (*optab[t->op])(t);
}

とか、素敵すぎる。


良質な訳の技術書?で、きむら(K)さんがこの本を薦めていましたが、最後まで読んだ今なら、僕もこの本をお薦めします。

十分持ち運べる重さ、内容も面白い、飽きない、英語はしっかりしている、それでいてプログラミングにおける様々な工程での英語が出てきます。

洋書に挑戦するなら、The Practice of Programming お勧め。

| | Comments (0) | TrackBack (0)

2008.03.03

今日の日記

ときどきの雑記帖 i戦士篇から

例によって全部はしっかり追えないので、自分に関係のありそうな所だけ。

■ アセンブリ言語は時代遅れなのだろうか? (Is Assembly Language Obsolete?)
・room-full
> その開発者が思い描く恐ろしく複雑(horribly-complex)で room-full なロジックを
> 想像することがあなたにはできますか?

ここだけ意味が分からなくて、最初から読んでみました。room-full は「馬鹿でかい」とか
「無駄に大きい」とかそんなニュアンスだと思います。

「これが書式付の出力をする命令を実装した回路」が、回路を構成するトランジスタの個数が
非常に多くなって、それに比例してシリコンの専有面積をとってしまうからです。
「これが書式付の出力をする(マシン語の)命令」が、1命令でやってしまうのは
ナンセンスで、ちょっと小馬鹿にした雰囲気もあります。


・洋書売り場
大学生向けの教科書とか掘り出し物があるのですが、京都の丸善も洋書を止めてしまったので
なかなか実物を見る機会が減ってしまいました。残念です。
僕は書店で見つけた本は、できるだけその書店で買うようにしています。

| | Comments (2) | TrackBack (0)

(長門の)UARTを作ろう!

仕事とは関係無しに簡単なUARTが欲しくなった。
いろいろとさがしてみたが、ドキュメント読むより作った方が早そうなので一から作ることにした。ただ作るのもあれなので、一個だけ特徴を持たせてみました。
名前は例によって、(長門の)UART、略してnuart。opencoresのmini UARTがライバル。

ISEで合成した比較

    nuart mini UART
FFの数  78  74
Slice数  78  88
GCLK数  1   2
I/F   FIFO  Wishbone bus

見ての通り、ロジックの数はほぼ同じ。ただし、CLKラインが1本しか使わない。最近の回路はDDR周りだけで2つも3つもクロックラインを使うので、UARTごときでクロックラインを使いたくないという(主に僕の)要望に応えました。

システムクロックを分周して動かすのですが、x16のクロックを使う代わりに、x16のクロックに合わせて動作するように回路を組んでいます。ですので、クロックラインはシステム系(FIFOのI/F)の1系統しか使いません。

トップ回路はnuart.v、I/Fはこんな感じです。

①受信時波形


②送信時波形


要するに、受信したら受信データと共にrx_fifo_wr_oが1CLK HになってFIFOに書き込む。tx_fifo_empty_iがLの時(FIFOにデータがあるとき)は、FIFOからデータを読み出し送信します。一応、16倍クロックで受信時の補正をしていますが、上手く動いているかどうかは不明。

Nios Development Board, Cyclone Edition で折り返しが動いたので公開します。

ファイルはここ。回路のパラメータは、50MHzを入れたときに9600bpsで動作するようにしてます。

テストベンチも入っているので、altera_mf.vを追加すれば、そのままVeritakでシミュレーションできます。

| | Comments (1) | TrackBack (0)

2008.03.01

The Practice of Programming と Unicode

Chapter8 Portabiltyまで読んだ。残りは9章とエピローグのみ。twitterでいろいろとあろはさんとやりとりをして、面白かったので残しておく。


natsutan:(北大生っぽく) Plan9 は内部 Unicode なのか。

natsutan:カーニハン先生の The Practice of Programming には、ちょこちょこと Plan9 が出てくると思ったら、著者の一人 Rob Pike が Plan9 の人だった。カーニハン先生 100 %の本だと思っていた。ごめんなさい。

alohakun:@natsutan むしろ Plan9 の研究で utf-8 が開発されたそうですよ

alohakun:@natsutan ベル研の UNIX を開発した博士たちは,既に 80 年代ぐらいから UNIX 自体には興味を無くしていて,みんな Plan9 に移っているはずです.rob pike は Plan9 の設計/実装リーダーですね

natsutan:本の中で、「僕たちは Sam ってエディタを作ったんだけど・・・」って出てきて、話題を振るためのなんちゃってエディタかと思ったら、 Plan9 のエディタだったの驚いた。

alohakun @natsutan rob と ken の utf 8 の論文はタイトルが面白いです 「Hello World or Καλημ?ρα κ?σμε or こんにちは 世界」 http://cm.bell-labs.com/sys/doc/utf.html

natsutan:@alohakun その論文もこの本に紹介されてましたよ。あと、 "The inferono Operating System" ってやつ読めって。この本は意外に勉強になる。

alohakun:プログラミング言語 C のローマ字で書かれた序文など,「カーニハン博士とリッチー博士が日本語に興味をお持ちになられたそうです」という感じがしてうれしほほえましい感じがしますね.両博士は wchar_t の策定などにも尽力されたそうです ...

natsutan:@alohakun へぇー。それも全然知りませんでした。雑記帖のきむら (K) さんを召還したいな。本の中に "Don't assume English." という一節があって、外人でこれを言えるのは貴重だなと思っていたところ


K&Rの2人とwcharに関係があったなんて。

| | Comments (0) | TrackBack (0)

はてなの京都移転に思うこと

いろんな意見がでているのでいまさらですが、思ったことを。

タイミングとかいろんな物がかみ合ったらひげぽんさんに簡単に会えたのになぁというのが最初の感想。昨年11月くらいまでは今出川で働いていたので、はてなの烏丸御池とは一駅。この距離ならメール一本で、「今駅前のマックいるから、ちょっと来いよ!」と呼ばれたら飛んで行けたのにな。京都のアバンティでばったり会ったりできたかもしれない。いろんな意味で残念。

先に京都を抜け出した人間としては、時間の流れがゆっくりすぎて、京都は開発には向いていないと思う。同じような気持ちが、はてなより先に京都に来た俺の京都雑感に上手くまとまっているので、リンクしておきます。

上手くやれば、naoyaさんとかお会いできるのかな。ベンチャーの先輩として聞きたいことがいっぱいいっぱいある。

経営判断うんぬんについては、自分の所で必死だから何とも言えない。

♪ファイト!戦う君の歌を~戦わない奴らが笑うだろ

| | Comments (0) | TrackBack (0)

« February 2008 | Main | April 2008 »