Diary/2014-1-1
謹賀新年
あけましておめでとうございます.
皆様,今年もよろしくお願いいたします.
PCIeのサンプル
7シリーズPCIe Gen3 Integrated Block用のPIOなサンプルコードを読む.
これまでのコアと違って,AXI4-Streamが4本あるのが特徴
PG023のp.14によると,
- Completer reQuest (CQ) Interface
- Completer Completion (CC) Interface
- Requester reQuest (RQ) Interface
- Requester Completion (RC) Interface
とのこと.
パラメタで構成がいろいろ変わるので,
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
ペイロードが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なので,実はここには遷移しない.