HOME > 技術 > IEEE1394 とは > IEEE1394プロトコル

CQ出版社インターフェース誌に書いた特集からの抜粋です.

IEEE1394プロトコル

IEEE1394バスは,半2重のデータ転送サービスを提供します.同一バスに接続された二つ以上のノードが同時にデータを転送することはできません.しかし,チップの説明や,将来説明で触れますが,IEEE1394.bや,それ以前のLINKチップでも全2重を提供しているものがあります.しかし,基本的には,データはパケットに分割され,半二重通信形式で転送されます.

パケットを転送するプロセスを,サブアクション(subaction)と呼びます.サブアクションには,次に示す2種類のサブアクションが存在します.

アイソクロナスサブアクション(Isochronous Subaction)

パケットを規則的な間隔で転送します.IEEE1394の特徴的な機能です.特定のノードに転送するのではなく,チャンネルアドレスを使用して,バス全体に送信します.アドレスは単純化されています.データを受信したノードはアクノリッジを返しません.TCP/IPにたとえると,UDPのような感じです.

アシンクロナスサブアクション(Asynchronous Subaction)

文字通り,非同期な通信です.アイソクロナスサブアクションと異なり,データを定期的に転送することはありません.数バイトのヘッダ情報と,実データを指定されたノードに転送します.データを受信したノードは,必ずアクノリッジを返します.ただし,アシンクロナスパケットが,ブロードキャストデータ(ノード番号のビットが全部立っている場合)の場合,アクノリッジは返しません.ブロードキャストアドレスについては,アドレッシング説明を参照してください.

さらにサブアクションは次に示す三つの部分に分けられます.

アービトレーションシーケンス(Arbitration Sequence)

パケットを送信したいノードは,物理レイヤにバスの制御権を得るように要求します.もし,既にバスの制御権を持っている場合,物理レイヤは即座に応答します.

アービトレーションは,最終的に一つのノードに,制御権を与えます.制御権を得たノードは,データパケット送信することができます.ただし,ノードが既にバスを制御している場合,アービトレーションシーケンスは実行されず,すぐに送信が実行されます.

データパケット転送(Data Packet Transmission)

実際の転送が行われます.スピードコードを含むデータプリフィックス,送受信サイドのアドレス,トランザクションコード,トランザクションラベル,リトライコード(これらをまとめてヘッダという),そして,データ本体が送信されます.1つか,2つのCRCも付加されます.パケット負荷がある場合,CRCは2つになります.

アイソクロナスサブアクションでは,アシンクロナスサブアクションよりデータプリフィックスが簡略化されています.アドレスのかわりに,チャネルを使います.トランザクションラベルや,リトライコードはありません.

アクノリッジメント(acknowledgment)

受信側は,操作が行われたことを,送信側に応答します.アシンクロナスパケットの場合,受信ノードはパケットの受信に状況(成功,失敗等)を示すコードを発信ノードに返します.アクノリッジメントで転送されるデータも一種のデータパケットです.アクノリッジコード前後にはデータプリフィックス,およびデータエンドが付けられます.アイソクロナスパケットと,アシンクロナスのブロードキャストパケットに対して,アクノリッジメントは返しません.

アシンクロナスサブアクションは,サブアクションギャップで分けられます.ギャップとはパケットを区切るアイドルバス状態の期間です.IEEE1394では,IEEE1394発展の中に,800M以上の規格も企画されて,既に検討や試作が行われていますが,IEEE1394のプロトコルがギャップに頼っているため,バス速度に,転送速度が比例しないという問題がクローズアップされています.

IEEE 1394バスでは,一定時間以上のアイドルが確認された場合,データ転送を希望するノードがアービトレーションを開始します.ギャップの指定は,PHYレジスタで行うことができます.詳しくはプログラムを参照してください.アクノリッジギャップは,発信ノードが送信したデータパケットとそのパケットに対する応答パケット(アクノリッジ)の間のギャップを指します.アクノリッジギャップの長さはバスの状況により変化します.アクノリッジギャップは,サブアクションギャップの長さよりも十分短くなるように規定されています.これは接続された他のノードがアクノリッジを受信する前にアービトレーションを始めないことを確実にするためです.このように,IEEE1394はギャップで管理されていますが,それ故,速度が速くなるにつれて,ギャップの影響が大きくなります.1394.a,1394.bでは,ギャップや,アービトレーションが改善される予定です.

アイソクロナスサブアクションは,アイソクロナスギャップで分けられます.このアイソクロナスギャップは,サブアクションギャップより,かなり短くなっています.

サービスの構成

IEEE 1394での通信サービスはリンクレイヤで規定されています.リンクサービスは次に示す4種類のサービス単位に分けられます.

要求(request) 要求側が使用するサービスで,トランザクションを開始する.
表示(indication) 応答側に要求が到着したことを知らせるサービス.
応答(response) 応答側が使用するサービスで,応答側の状態と能力を要求側に返す.
確認(confirmation) 要求側に,応答側からの応答が到着したことを知らせるサービス.

リンクレイヤ,およびトランザクションレイヤの動作

トランザクションレイヤ,およびリンクレイヤはバスの利用効率を最適化します.次のような動作を行います.

ユニファイドトランザクション

送信側が,サービスを要求してから,確認を受け取るまでを,一つのトランザクションにまとめることができます.しかし,これを実現するには,応答側が十分に高速でなければなりません.リンクレイヤが十分に高速なら,物理レイヤに,バスをホールドさせます.

応答側のトランザクションレイヤ,およびリンクレイヤが十分に高速なら,全てのライトトランザクションは単一のアシンクロナスサブアクションで実行されます.データパケットの送信の直後に,アクノリッジメントを送信します.このようなトランザクションを,ユニファイドトランザクションと言います.

今回試作した,ハードウェア,ソフトウェアでは,ユニファイドトランザクションは行っておりません.ユニファイドトランザクションを行うには,十分な,高速性が必要とされます.

スプリットトランザクション

応答側のトランザクションレイヤ,およびリンクレイヤが低速の場合,要求と応答を別々のサブアクションへ分割します.これを,スプリットトランザクションと表現します.スプリットトランザクションは,要求と応答のそれぞれに対し,独立したアシンクロナスサブアクションが実行されます(図参照).これらの,サブアクションは連続していなくても構いません.途中に,他のサブアクションがバスを使用することもあります.トランザクションの対応は,トランザクションラベルで行います.

サブアクションの連結

先に示したように,スプリットトランザクションでは,必ず,二つのサブアクションを必要とします.もし,リード,およびロックの応答が十分に高速な場合,図に示すように,スプリットトランザクションに対してデータエンド,サブアクションギャップ,およびアービトレーションを省略して,二つのサブアクションを直結することができます.

また,同じノードから転送される,アイソクロノスサブアクションも連結することができます.

リトライ(ビジー状態の制限フロー制御)

すべての通信に言えることですが,送信データを受信側がいつでも受け取れるとは限りません.受信側が,必ず送信データを受け取ってくれれば楽ですが,なかなかそうもいきません.バスの使用頻度が上がってくると,受信ノードは応答サブアクションを返し切れなくなり,ビジーになってしまいます.通信を確実に行うには,受信側で正常に処理できない場合,送信側に結果を知らせる必要があります.送信側は,受信が正常に行われなかった場合,再び送信するか,送信をしばらくあきらめなければなりません.いずれにしても,再送信が必要です.

しかし,単純に再送信したのでは,いつまで経っても,データが届かない場合があります.最初の送信と,再送信の間に,何らかの違いをもうけ,再送信の優先度を上げるようにしなければなりません.IEEE 1394バスでは,このビジー状態を発信ノードに知らせ,パケットの再送を行わせるために二つのリトライ(再送)方法が定義されており,「シングルフェースリトライ」と「デュアルフェーズリトライ」と言います.受信ノードは,シングルフェースリトライのみ,あるいは,シングルフェースリトライとデュアルフェーズリトライの両方をサポートします.

リトライの制御にはアクノリッジコード,およびリトライコードと呼ぶコードが使われます.アクノリッジコードは,受信ノードがアクノリッジメント内に記述する値です.受信ノードが,ビジー状態であり,しばらくしてから再送信すべきであることを,送信ノードに知らせます.

アクノリッジコードは,リトライフェーズを示しています.送信ノードが,データパケットのヘッダ内に記述する値です.受信ノードに,現在のパケットのリトライフェーズを知らせます.

シングルフェーズリトライ

名前が示す通り,リトライは一つの方法しかありません.受信ノードがビジーの場合,受信した任意のパケットに対してack_busy_Xアクノリッジコードで応答します.この応答を受けた送信ノードは,retry_Xリトライコードを使って,サブアクションが成功するか,リトライ回数を超えるまで,リトライサブアクションを行います.

デュアルフェーズリトライ

受信ノードが処理要求を処理しきれない場合,ack_busy_A,またはack_busy_Bアクノリッジコードを,送信ノードへ返します.送信ノードは,サブアクションを再送信するときに,アクノリッジコードがack_busy_Aで戻ってきた場合はリトライコードとしてretry_A を,ack_busy_Bで戻ってきた場合はretry_Bを使います.受信ノードは,retry_A,あるいはretry_Bのどちらか一方を優先的に処理します.優先した,処理がすべて終わると,残りのリトライコードを持った要求を優先します.

たとえば,受信ノードがretry_Aリトライを受け付けている時に,retry_1あるいは,retry_Bのパケットを受け取った場合,ack_busy_Bを返します.一旦,全てのretry_Aリトライの受付けを終えると,受信ノードはretry_Bリトライを優先処理します.この期間に届いた,retry_1あるいは,retry_Aのパケットには,ack_busy_Aを返します.もし,送信側がシングルフェーズリトライのみを実装している場合,受信側が返すリトライコードに関係なく,retry_Xリトライコードを使用します.デュアルフェーズをサポートしている,受信ノードはシングルフェーズのretry_Xも処理できなくてはなりません.

アービトレーション

アービトレーションとは,各ノードがシリアルバスを,使用する権利を得るためのシーケンスです.アービトレーションには,大きく分けて,アシンクロナスアービトレーションとアイソクロナスアービトレーションがあります.そして,アシンクロナスアービトレーションには,公正アービトレーション (Fair Arbitration)と緊急アービトレーション(Urgent Arbitration)の2つの方法を利用できます.

アイソクロナスアービトレーション
アシンクロナスアービトレーション 公正(fair)アービトレーション
緊急(Urgent)アービトレーション

アイソクロナスアービトレーション

バスに共通なクロック源を管理する,サイクルマスタノードに最優先のアクセス権を与え,基本的なアービトレーションプロトコルを乱さずに,アイソクロナスサービスを付加できます.サイクルマスタノードは特殊なタイミング要求を送信します.これはサイクルスタートと呼ばれ,通常,8 kHz ± 100 ppm,125 ms ± 12.5 nsに設定されます.サイクルスタート送信時に,データ転送が行われている場合,サイクルスタートは延期されます.このように,サイクルスタートが遅延した場合,アイソクロナスデータ転送に,ジッタ(揺らぎ)を発生させます.このジッタが,受容範囲を超えるときは,サイクルスタートの延期時間が,トランザクションレイヤのクワッドレット要求パケットとして,全ノードのサイクルタイマレジスタ(cycle timer register)にブロードキャストされます.

アイソクロナスサービスを使用する各々のノードは,32-bitのサイクルタイマレジスタを持っています.このレジスタの低位の12 bitは3,072のモジュロとなっており,24.576 MHzのクロックでカウントされます.中位の13 bitは8 kHz周期のカウントに使われ,高位の7 bitは秒単位のカウントに使われます.サイクルマスタは,全てのノードをある誤差内に同期させます.

アシンクロナスアービトレーション

アシンクロナスアービトレーションは,リンクレイヤがデータを発信しようとしたときに必ず行われます.アービトレーションでは,できる限り速く,バスの制御権を決定します.アシンクロナスアービトレーションは,以下の二つのタイプが存在します.

公正(fair)アービトレーション 全ての発信要求ノードに対して,バスを平等にアクセスすることを保証するアービトレーションです.このアービトレーションは,ノードがバス上で優先度を持ってしまうことを防ぐようになっています.
緊急(Urgent)アービトレーション より少ないレイテンシを使って頻繁にバスを使用する必要のあるノードをサポートするタイプのアービトレーションです.緊急アービトレーションを使用する,複数のノードがお互いに干渉する可能性があるため,このアービトレーションを使用する場合には注意が必要です.なお,このアービトレーションは,通常の環境では使われません.

アービトレーションとサイクルの構造

アイソクロナスアービトレーションを開始するために必要なギャップ(アイソクロナスギャップ)は,アシンクロナスアービトレーションのギャップ(サブアクションギャップ)より短く設定されます.通常,使用されている全てのギャップの中で最小の幅に設定します.アイソクロナスデータを送信するノードは,アシンクロナスより早く,サイクルスタートに対応できます.アービトレーションが成功すると,即座にアイソクロナスパケットを送信します.

アイソクロナスデータを,送信したい,全ノードがデータの送信を終了すると,バスはサブアクションギャップとして認識される十分な期間のアイドル状態となります.そして,アシンクロナスアービトレーションが開始されます.図に基本的なサイクルのパターンを示します.

アイソクロナスパケットでは,ノード番号の代わりに,6-bitからなるチャネル(channel)番号をラベルとして使用します.このチャネル番号はノードの優先順位にも,パケットの送信順序にも関係しません.