トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

Diary/2014-1-1

謹賀新年

あけましておめでとうございます.
皆様,今年もよろしくお願いいたします.

PCIeのサンプル

7シリーズPCIe Gen3 Integrated Block用のPIOなサンプルコードを読む.
これまでのコアと違って,AXI4-Streamが4本あるのが特徴
PG023のp.14によると,

Completer reQuest (CQ) Interface
The interface through which all received requests from the link are delivered to the user application.
Completer Completion (CC) Interface
The interface through which completions generated by the user application responses to the completer requests are transmitted. You can process all Non-Posted transactions as split transactions. That is, it can continue to accept new requests on the Requester Completion interface while sending a completion for a request.
Requester reQuest (RQ) Interface
The interface through which the user application generates requests to remote PCIe devices.
Requester Completion (RC) Interface
The interface through which the completions received from the link in response to your requests are presented to the user application.
とのこと.

パラメタで構成がいろいろ変わるので,

C_DATA_WIDTH = 256
AXISTEN_IF_RQ_ALIGNMENT_MODE == "FALSE"
AXISTEN_IF_CC_ALIGNMENT_MODE == "FALSE"
AXISTEN_IF_CQ_ALIGNMENT_MODE == "FALSE"
AXISTEN_IF_RC_ALIGNMENT_MODE == "FALSE"

に限ってみてみる.
256bit幅なので,4DWORD,3DWORDヘッダの別がなくて,実は状態遷移すっきり...か?

PCIeのサンプル・受信側

実装コードはPIO_RX_ENGINE.v.

PIO_RX_RST_STATE
待機ステート.

m_axis_cq_tready <= #TCQ 1'b1;
m_axis_rc_tready <= #TCQ 1'b1;

sopがアサートされた(新しいパケットが到着した)ら,到着パケットのフォーマット(m_axis_cq_tdata[78:75])に応じて次の状態に遷移.
ただし,256bit幅AXI4-Streamなので,これが最後のパケットの場合には遷移しないことも.
遷移先は↓な感じ.

PIO_RX_MEM_RD_FMT_TYPE → PIO_RX_WAIT_STATEへ
PIO_RX_MEM_WR_FMT_TYPE → (m_axis_cq_tdata[74:64] == 11'h001) || (m_axis_cq_tdata[74:64] == 11'h002)の場合(=ペイロードが2以下の場合)にPIO_RX_WAIT_STATEへ.でなければ,PIO_RX_RST_STATEへ(強制的に後続のパケットを読み捨てる,と思われる).
PIO_RX_IO_RD_FMT_TYPE → PIO_RX_WAIT_STATE
PIO_RX_IO_WR_FMT_TYPE → (m_axis_cq_tdata[74:64] == 11'h001) || (m_axis_cq_tdata[74:64] == 11'h002)の場合(=ペイロードが2以下の場合)に,PIO_RX_WAIT_STATEへ.でなければ,PIO_RX_RST_STATEへ.
PIO_RX_ATOP_FAA_FMT_TYPE, PIO_RX_ATOP_UCS_FMT_TYPE, PIO_RX_ATOP_CAS_FMT_TYPE → PIO_RX_WAIT_STATE
PIO_RX_MEM_LK_RD_FMT_TYPE → PIO_RX_WAIT_STATE
PIO_RX_MSG_FMT_TYPE → PIO_RX_RST_STATE
PIO_RX_MSG_VD_FMT_TYPE → PIO_RX_RST_STATE
PIO_RX_MSG_ATS_FMT_TYPE → PIO_RX_RST_STATE

PIO_RX_WAIT_STATE

PIO_RX_RSTから遷移するステート.
フォーマットに応じて"wr_busyでない"かcompl_doneならPIO_RX_RST_STATEに.
PIOなサンプルだから,1発受け取ったらおしまいってことでいいのかな.

PIO_RX_DATA

ALIGNMENT_MODEがFALSEなので,実はここには遷移しない.
ALIGNMENT_MODEがTRUEのときに,(RST_STATEで書けないので)データを内部に書き出す.

PCIeのサンプル・送信側

実装コードはPIO_TX_ENGINE.v.
FPGA側からPCにアクセスすることはなくPCからのリクエストに応じてデータを送信する.
もし,FPGAから主体的にデータをリクエストを出すのなら,こちらのRST_STATEを参考にしつつ仕掛けをすればよい,と思われる.
送信処理は,AXI4-Streamでデータを適切にセット,s_axis_cc_treadyのアサートで終了,というのが大筋.
こちらもペイロード長の最大が

PIO_TX_RST_STATE
待機状態.↓な感じで次に遷移.

if(req_compl) begin
   state <= #TCQ PIO_TX_COMPL_C1;
else if (req_compl_wd) begin
   state <= #TCQ PIO_TX_COMPL_WD_C1;
end else if (req_compl_ur) begin
   state <= #TCQ PIO_TX_CPL_UR_C1;
end else if (gen_transaction) begin
   state <= #TCQ PIO_TX_MRD_C1;
end

req_compl,req_compl_wd,req_compl_urはPIO_RX_ENGINEでセットされる.
受信パケットが

PIO_RX_MEM_RD_FMT_TYPE
 req_compl_wdあるいはreq_compl_urがセットされる
PIO_RX_IO_RD_FMT_TYPE
 req_compl_wdあるいはreq_compl_urがセットされる
PIO_RX_IO_WR_FMT_TYPE
 req_complがセットされる
PIO_RX_ATOP_FAA_FMT_TYPE, PIO_RX_ATOP_UCS_FMT_TYPE, PIO_RX_ATOP_CAS_FMT_TYPE
 req_complあるいはreq_compl_urがセットされる
PIO_RX_MEM_LK_RD_FMT_TYPE
 req_complと,req_compl_wdあるいはreq_compl_urがセットされる

gen_transactionは,EP_MEM::PIO_EP_MEM_ACCESS(ソースはPIO_EP_MEM_ACCESS.v)でセットされる.

if(wr_data[31:0] == 32'hAAAA_BBBB && !trn_sent)
   gen_transaction <= #TCQ 1'b1;
else
   gen_transaction <= #TCQ 1'b0;

PIO_TX_COMPL_C1

コメントは,"Completion Without Payload - Alignment doesnt matter Sent in a Single Beat When Interface Width is 256 bit."
s_axis_cc_treadyがアサートされたら,PIO_TX_RST_STATEに遷移.

PIO_TX_COMPL_WD_C1
コメントは,"Completion With Payload. Possible Scenario's Payload can be 1 DW or 2 DW. Alignment can be either of Dword aligned or address aligned."
ペイロードが1のときは,s_axis_cc_treadyがアサートされたら,PIO_TX_RST_STATEに遷移.でなければ,PIO_TX_COMPL_WD_2DWへ.

PIO_TX_COMPL_PYLD

コメントは,"Completion with 1DW Payload in Address Aligned mode"
s_axis_cc_treadyがアサートされたら,PIO_TX_RST_STATEに遷移.

PIO_TX_CPL_UR_C1

コメントは,"Completions with UR - Alignement mode matters here"
s_axis_cc_treadyがアサートされたら,PIO_TX_RST_STATEに遷移.

PIO_TX_MRD_C1

コメントは,"Memory Read Transaction - Alignment Doesnt Matter"
s_axis_cc_treadyがアサートされたら,PIO_TX_RST_STATEに遷移.

PIO_TX_COMPL_WD_2DW

コメントは,"Completion with 2DW Payload in DWord Aligned mode. Requires 2 states to get the 2DW Payload."


PIO_TX_COMPL_WD_2DW_ADDR_ALGN_C1

ALIGNMENT_MODEがFALSEなので,実はここには遷移しない.