!謹賀新年 あけましておめでとうございます. 皆様,今年もよろしくお願いいたします. !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なので,実はここには遷移しない.