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