UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

AR# 19727

LogiCORE PCI-X - 分割完了コマンドを発行する場合に M_DATA_IN および M_CBEA_IN をコンプリータとして駆動する方法

説明

キーワード : M_ATTR_VLD, M_ADDL_VLD, attribute phase, address phase, requestor, completer, 属性位相, アドレス位相, コンプリータ, リクエスタ

重要度 : 標準

概要 :
分割完了 (Split Completion) コマンドを発行する場合、ユーザー アプリケーションから正しい属性およびアドレス情報がどのように渡されますか。

ソリューション

ユーザー アプリケーションでは、『PCI-X Design Guide』の第 7 章に記載されている基本的な手法が使用されます。 PCI-X 仕様によると、分割完了コマンドを発行する場合、M_CBEA_IN と M_DATA_IN に渡されるデータは、メモリ書き込みなど標準のイニシエータ トランザクションとは若干異なります。

PCI-X v2.0 仕様のセクション 2.10.3 では、分割完了コマンドのアドレスは次のフォーマットであることが定義されています。

Figure 1 - Split Completion Address Format
Figure 1 - Split Completion Address Format


属性位相 (セクション 2.10.4) は次のようなフォーマットです。

Figure 2 - Split Completion Attribute Format
Figure 2 - Split Completion Attribute Format


ユーザーは、情報をコアに送る必要があります。 これにより、コアは、バス上にアドレスおよび属性の正しいフォーマットを示します ユーザー アプリケーションは、M_DATA_IN[31:0] および M_CBEA_IN[3:0] バスを使用して分割完了情報をコアに渡します。 フィールドは、次のように『PCI-X Design Guide』の第 7 章で定義されています。

Figure 3 - Attribute and Command Format
Figure 3 - Attribute and Command Format


ユーザーが M_REQ をアサートして分割完了トランザクションを開始した後、コアは M_ATTR_VLD をアサートし、正しい属性をコアに渡すかどうかをユーザーに尋ねます。 分割完了コマンドと標準メモリ コマンドとの主な違いは、分割完了コマンドの場合はタグ値が属性位相ではなく、アドレス位相にあることです。 ユーザー アプリケーションでは、情報をコアに渡す場合、このことを考慮に入れる必要があります。

M_ATTR_VLD がアサートされると、ユーザーは次の情報を渡す必要があります。

Figure 4 - Attribute field descriptions
Figure 4 - Attribute field descriptions


PCI 仕様によると、属性が渡された後、コアは M_ADDL_VLD をアサートし、ユーザーは M_DATA_IN[31:0] にデータを送る必要があります (上図を参照)。 この時点で、タグ値が渡されることに注意してください。

M_ADDL_VLD がアサートされると、ユーザーは M_CBEA_IN[3:0] に情報を送る必要はありません。 これは、M_ATTR_VLD がアサートされたときに、コマンドが送られたためです。 これらのビットは Low で駆動する必要があります。

アドレスおよびリクエスタの数など残りの情報は、ターゲットの分割で元のトランザクションが発生するときに、ユーザー アプリケーションによって取り込まれます。

次に、分割完了の処理に必要なコードの例を示します。 これは完全なデザインではありませんが、基本概念を示す一部のコード例です。 コード例は Verilog ですが、VHDL にも簡単に適用できます。


//First, capture the following information on the target transaction being split:

reg [3:0] scmd;
reg [35:0] sattr;
reg [31:0] saddr;

always @(posedge CLK or posedge RST)
begin
if(RST)
begin
scmd <= 4'b0000;
sattr <= 36'h000000000;
saddr <= 32'h00000000;
end
else
begin

//Grab address and command
if(S_ADDL_VLD)
begin
saddr <= S_DATA_OUT;
scmd <= S_CBEA_OUT ;
end

//Grab attribute
if(S_ATTR_VLD)
begin
sattr <= {S_CBEA_OUT, S_DATA_OUT};
end
end
end


//For splits completions, you must break this above info down for later use.
//Please note that if you do it this way, you can only service one split completion
//at a time (i.e., you can only split one transaction at a time.)
//If you want to service more, you must create some type of queue to store all of this information.

wire [6:0] low_addr;
wire [2:0] requester_function_num;
wire [4:0] requestor_device_num;
wire [6:0] requestor_bus_num;
wire [4:0] tag;
wire [11:0] byte_count;

assign #DLY low_addr = saddr[6:0];
assign #DLY requester_function_num = sattr[10:8];
assign #DLY requestor_device_num = sattr[15:11];
assign #DLY requestor_bus_num = sattr[23:16];
assign #DLY tag = sattr[28:24];
assign #DLY byte_count = {sattr[35:32],sattr[7:0]};



//Now at some time later you will become the initiator and complete the transaction
//using the above information.


wire [31:0] xfer_addr;
wire [31:0] mdi_temp0;

//Tell the core you want to start a transaction as a Master
assign #DLY M_REQ = some_state_machine_output;

//Create the split completion address value. This is what will appear on
//the bus during the address phase. See the PCI-X spec for more information
//on this format.

assign #DLY xfer_addr = {3'b000,tag,requestor_bus_num,requestor_device_num,
requester_function_num,1'b0,low_addr};


//Send in the attributes for the core. See page 7-3 of the PCI-X core Design Guide

wire attribute_tag;

//Tag value sent in attribute field must be set to zero for split completions.
//is_split would most likely be a state machine output indicating the user app is issuing
//a split completion.

assign #DLY attribute_tag = is_split ? 5'b00000 : normal_tag;

assign #DLY mdi_temp0 = M_ATTR_VLD ? {4'b0000, attribute_tag, 11'b00000000000, byte_count} :
xfer_addr;

assign #DLY M_DATA_IN = (!M_ATTR_VLD & !M_ADDL_VLD) ? data_to_transfer : mdi_temp0;

//Feed in the split completion command.

assign #DLY M_CBEA_IN = M_ATTR_VLD ? 4'b1100 : 4'b0000;

//Keep in mind the above block of code will become much more complex when you add
//the logic to do other normal master transactions. This will require muxing
//the different types of address fields and attributes. You will probably also
//need to create address counters for your data. But hopefully this will get you
//pointed in the right direction.

AR# 19727
日付 12/15/2012
ステータス アクティブ
種類 一般
このページをブックマークに追加