会社案内 (近況 2008/06)

先月   翌月

2008/06/30 PCIe IP コア開発 (川井)

コア開発最終段階のような雰囲気。性能評価したり、こまごまとしたバグを修 正したり、G5PIPE を x8 でも動作するように変更したり。

2008/06/22 PCIe IP コア開発 (川井)

FPGA の configuration ROM (EPCS64) をホストから PCIe 経由で書き換える 機構 (ASMI) を実装した。わりとすんなり動いた。従来から使っていた回路を 移植しただけなので動いて当然だが。

2008/06/21 PCIe IP コア開発 (川井)

x4 コアは model450 でも動いているようなので、禁断の x8 on Arria GX を 試してみた。

まずは x4 コアを 2 個入れて合成。ホストがこれを 2 個の x4 デバイスと認 識してくれるか? → 駄目だった。トレーニング時にホスト (つまり上流の Root Port) が適切な link number を各レーンに割り振ってくれればうまくゆ くはずなのだが。chipset 側にそういう機能が無ければこちらではどうしよう もない。

つぎは Mega Wizard で生成した x4 alt2gxb を 2 個束ねて x8 alt2gxb のふ りをして使ってみる。→ 駄目だった。合成時にエラーが出る。内蔵トランシー バは 4 個単位でグループ化されていて、グループごとに共通の PLL を使うモー ド (bonded mode) と、個別の PLL を使うモード(individual mode) がある。 で、bonded mode で使うときに、あるグループの PLL が作ったクロックを他 のグループで使うのは禁止されているらしい。

参考: StratixII GX の alt2gxb には x8 PIPE mode がある。この mode では トランシーバ 4ch から成る GXB block を 2 個つなげて、片方の block の central clock divider が両方の serial & parallel clk を drive する。 Arria GX にはこの mode が無いので、x4 PIPE を 2 個使うしかない。

じゃーもーいーけんね、individual mode でやるけんね、というわけで x1 alt2gxb を 8 個束ねてみた。Fitter で GXB のグループがどうのこうのと文 句を言われたので .qsf に以下の記述を加えた。ら、合成できた。

set_instance_assignment -name GXB_CLOCK_GROUP_DRIVER 1 -to tx_out[0]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to tx_out[0]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to rx_in[0]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to tx_out[1]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to rx_in[1]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to tx_out[2]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to rx_in[2]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to tx_out[3]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to rx_in[3]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to tx_out[4]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to rx_in[4]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to tx_out[5]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to rx_in[5]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to tx_out[6]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to rx_in[6]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to tx_out[7]
set_instance_assignment -name GXB_CLOCK_GROUP 1 -to rx_in[7]
動かしてみると、ホストからちゃんと x8 デバイスとして認識されている。 にわかには信じがたいが。

2008/06/20 PCIe IP コア開発 (川井)

コア開発にはこれまでずっと、Stratix II GX の載った PLDA の評価ボードを 使ってきた。x8 でだいたい動くようになったので、今日からは当社製ボード を使ってみる。まずは GRAPE-DR model450。このボードには Arria GX が 1 個載っている。Altera によると、Arria GX ではレーン幅 x4 までしか動作し ないことになっているが、なぜかこのボードの PCIe カードエッジには x8 ま で線をひいてある。この基板を設計した人物 (しゃちょーともいう) によると、 「x8 で動かない理由が特に無いのなら動くかも知れないから線はひいておい た」ということらしい。

Quartus II 上のタイミング解析ツールには従来の Timing Analyzer と、最近 できたTime Quest というものの 2 種類が用意されている。これまでずっと Timing Analyzer を使ってきたが、これは Arria GX の解析には使えないらし い。というわけで強制的に Time Quest に移行させられた。 というわけで機能はいろいろ強化されているが、使いかたが複雑化している。 というわけで critical path を知りたいだけのユーザにとってはいい迷惑だ。 というわけで TimeQuest の使いかたを学ぶのに 1 日かかった。 というわけでそんなことしてる場合じゃないのだが。というわけで。ヤレヤレ

2008/06/17 PCIe IP コア開発 (川井)

DMA write の終了判定に PIO read による polling を使うとホストがハング することが判明した。ここしばらくは main memory 上の値を監視する方法で DMA の終了を判定していたので気づかなかった。

Transaction 層から Data Link 層へ複数の TLP を渡す際には、2 つの TLP の間に 2clk 以上の idle cycle をはさむ必要があるが、そうしていないのが 原因だった。

なぜ 2clk 要るかというと、Data Link 層で TLP の先頭に 2byte の sequence number、末尾に 4byte の LCRC を付加し、Phy 層でさらに先頭と末 尾にそれぞれ 1byte の symbol を付加するから。これだと全部で 8byte 付加 されるだけだから idle cycle は 1clk で充分のはずだが、Phy 層の Framer が TLP の切れ目を idle cycle を使って検出しているので、もう 1clk の idle cycle が必要。TLP の先頭を示す信号を追加すれば、この 1clk は不要 のはず。

なお PIO read を使わなければハングしないのは、Transaction 層で生成する TLP のサイズがうまいこと (16N+4) byte になっており、Data Link 層で 6byte 追加しても TLP 間の idle cycle が減らないため。このへんひじょー にややこしい。

2008/06/16 PCIe IP コア開発 (川井)

CRC 計算回路の回路消費を 1/2 以下に減らした。これくらいの消費量 (コ ア全体の 30% くらい) なら、実用上なんとか許容範囲だろう。変更点は 2 点:

2008/06/13 PCIe IP コア開発 (川井)

性能測定をしていて分かったが、手元にある chipset の max payload size は、ほとんどが 128 byte (PCIe Base Spec. で認められている最低値) しか ない。NVIDIA nForce 780i の 3 つあるスロットのうち、真ん中だけは 256 byte だった(こいつの BIOS コンソールからは max payload を最大 4k byte に設定できるようになっているが、この設定は実際の通信には何も影響を与え ていないみたい)。Design Wave 2007 年 12 月号を読み返したり Intel の chipset のデータシートを調べたりしてみたが、256 byte 以上の max payload size をサポートする chipset は非常に限られているようだ。max payload 増やすの大変かなぁ? なんでこんなところをケチるかなぁ

ということが分かったので、実効性能を上げるには TLP 間の idle cycle を 極力減らすことが重要になった。

2008/06/10 仕事復帰 (川井)

2 週間ぶりに開発再開。休んで分かったが今までペース早すぎだった。今後何 年も働きつづけるにはもっと余裕をもって仕事をこなさなくてはならない。根 詰めすぎるタチなので気をつけよう。最低限、00:00 以降は仕事しないように しよう。

休暇に入る直前にやりかけていた TLP 解析回路の pipeline 化を完了した。 細かな間違いが 3 つもあった。休暇直前にあせってやっても無駄だった。


先月   翌月
近況トップ