xapp1052给的IP核接口,From pg054:
1.tx是针对用户逻辑说的,实际对应IP个接收。
2.rx采用雷同于tx接口,只说几个关键的信号。
3.物理层接口为用户监控链接状态时使用,简单介绍一下,具体查阅pg054。
4.用户通过配置接口能监控终端模式下PCI Express的配置空间。用户给出10-bit的配置地址,选择1024个DWORD配置寄存器中的一个,终端通过32-bit的数据输出端口返回选择的寄存器的状态。
//----------- Begin Cut here for INSTANTIATION Template ---// INST_TAG
pcie_7x_0 your_instance_name (
//pcie的接口信号
.pci_exp_txp(pci_exp_txp), // output wire [0 : 0] pci_exp_txp
.pci_exp_txn(pci_exp_txn), // output wire [0 : 0] pci_exp_txn
.pci_exp_rxp(pci_exp_rxp), // input wire [0 : 0] pci_exp_rxp
.pci_exp_rxn(pci_exp_rxn), // input wire [0 : 0] pci_exp_rxn
//通用事务接口信号
.user_clk_out(user_clk_out), // output wire user_clk_out。事务、配置、物理层控制和状态接口的操作都参照该时钟,并与上升沿同步
.user_reset_out(user_reset_out), // output wire user_reset_out。事务层重置信号,用户逻辑必须使用该信号重置用户逻辑程序
.user_lnk_up(user_lnk_up), // output wire user_lnk_up。当IP核与与之相连的上游的端口进入ready状态,并可相互发送数据包时,该信号变为有效位
.user_app_rdy(user_app_rdy), // output wire user_app_rdy
//传输接收信号
.tx_buf_av(tx_buf_av), // output wire [5 : 0] tx_buf_av。表示IP核中的传输Buffer资源可用
.tx_cfg_req(tx_cfg_req), // output wire tx_cfg_req。传输配置请求,表示IP核准备好传输一个完整的配置包或者其它的内部产生的TLP(事务层的包)
.tx_err_drop(tx_err_drop), // output wire tx_err_drop。表示IP核抛弃了包数据
.s_axis_tx_tready(s_axis_tx_tready), // output wire s_axis_tx_tready。表示IP核准备好接收传输数据
.s_axis_tx_tdata(s_axis_tx_tdata), // input wire [63 : 0] s_axis_tx_tdata。被传递的包数据
.s_axis_tx_tkeep(s_axis_tx_tkeep), // input wire [7 : 0] s_axis_tx_tkeep。传输数据选通
.s_axis_tx_tlast(s_axis_tx_tlast), // input wire s_axis_tx_tlast。表示传输的最后一帧(End-Of-Frame,EOF)
.s_axis_tx_tvalid(s_axis_tx_tvalid), // input wire s_axis_tx_tvalid。表示用户程序已经在s_axis_tx_tdata上准备好了有效的传输数据
.s_axis_tx_tuser(s_axis_tx_tuser), // input wire [3 : 0] s_axis_tx_tuser。
//s_axis_tx_tuser[3],Input,传输资源中止,可以在SOF(start-of-frame)后的任何时间声明有效位,与s_axis_tx_tlast同时声明有效位
//s_asix_tx_tuser[2],tx_str,Input,表示数据包存在于连续的时钟周期。通常用于直通式的传输模式。
//s_axis_tx_tuser[1],tx_err_fwd,Input,表示正在发送的数据包出现错误
//启用端对端的循环冗余校验(ECRC),通常在TLP包的开始位置声明有效位。
.tx_cfg_gnt(tx_cfg_gnt), // input wire tx_cfg_gnt。由用户响应tx_cfg_req信号,表示授权允许IP核传输一个内部产生的TLP包
.m_axis_rx_tdata(m_axis_rx_tdata), // output wire [63 : 0] m_axis_rx_tdata
.m_axis_rx_tkeep(m_axis_rx_tkeep), // output wire [7 : 0] m_axis_rx_tkeep
.m_axis_rx_tlast(m_axis_rx_tlast), // output wire m_axis_rx_tlast
.m_axis_rx_tvalid(m_axis_rx_tvalid), // output wire m_axis_rx_tvalid
//m_axis_rx_tvalid,Output,表示IP核已经将有效数据传输过来,并希望用户接收。
.m_axis_rx_tready(m_axis_rx_tready), // input wire m_axis_rx_tready
//m_axis_rx_tready,Input,表示接收端准备就绪,由用户进行设置,当用户程序希望接收数据时,置有效位
.m_axis_rx_tuser(m_axis_rx_tuser), // output wire [21 : 0] m_axis_rx_tuser
//m_axis_rx_tuser[14:10],rx_is_sof[4:0],Output,表示包头的开始帧。当有一个新包存在时,bit4声明有效。bit0-3,表示新包的起始位置。
//如:5’b10000 = SOF在AXI的byte0,即m_axis_rx_tdata[7:0]。5’b11000=SOF在AXI的byte8,即m_axis_rx_tdata[71:64]。5’b00000 = SOF不存在。
//m_axis_rx_tuser[21:17],rx_is_eof[4:0],Output,表示包的最后一帧。当包要结束时,bit4声明有效。bit0-3,表示包的结束位置。
//m_axis_rx_tuser[1],rx_err_fwd,Output,表示正在处理的包有错误。
//m_axis_rx_tuser[9:2],rx_bar_hit[7:0],Output,用来表示当前接收到事务的BAR。
//在包的起始位置到m_axis_rx_tlast置有效位时,该信号有效。rx_bar_hit[0]:BAR0;rx_bar_hit[1]:BAR1;
//rx_bar_hit[2]:BAR2;rx_bar_hit[3]:BAR3;rx_bar_hit[4]:BAR0;rx_bar_hit[5]:BAR5;rx_bar_hit[6]:
//Expansion ROM地址。m_axis_rx_tuser[9]为预留位。
//m_axis_rx_tuser[16:15],为预留信号。
.rx_np_ok(rx_np_ok), // input wire rx_np_ok。用户准备好接收Non_Posted请求的TLPs包的时候,置有效位
.rx_np_req(rx_np_req), // input wire rx_np_req。请求IP核发送Non-Posted TLPs包。
//通用事务接口信号
.fc_cpld(fc_cpld), // output wire [11 : 0] fc_cpld
.fc_cplh(fc_cplh), // output wire [7 : 0] fc_cplh
.fc_npd(fc_npd), // output wire [11 : 0] fc_npd
.fc_nph(fc_nph), // output wire [7 : 0] fc_nph。非Posted头包流控制认证,定义了该非Posted头包流控制的类型
.fc_pd(fc_pd), // output wire [11 : 0] fc_pd。Posted数据流控制认证,定义了该Posted数据流控制的类型
.fc_ph(fc_ph), // output wire [7 : 0] fc_ph。Posted头包流控制认证,定义了该Posted头包流控制的类型
.fc_sel(fc_sel), // input wire [2 : 0] fc_sel。流控制信息类型选择
//配置接口
.cfg_mgmt_do(cfg_mgmt_do), // output wire [31 : 0] cfg_mgmt_do。32-bit的配置寄存器的状态输出数据。
.cfg_mgmt_rd_wr_done(cfg_mgmt_rd_wr_done), // output wire cfg_mgmt_rd_wr_done。表示配置读写完成的信号。该信号为有效位时cfg_mgmt_do[31:0]信号有效。
.cfg_status(cfg_status), // output wire [15 : 0] cfg_status。配置空间的头寄存器中的状态寄存器的数据,表示配置的状态
.cfg_command(cfg_command), // output wire [15 : 0] cfg_command。配置命令
.cfg_dstatus(cfg_dstatus), // output wire [15 : 0] cfg_dstatus
.cfg_dcommand(cfg_dcommand), // output wire [15 : 0] cfg_dcommand
.cfg_lstatus(cfg_lstatus), // output wire [15 : 0] cfg_lstatus
.cfg_lcommand(cfg_lcommand), // output wire [15 : 0] cfg_lcommand
.cfg_dcommand2(cfg_dcommand2), // output wire [15 : 0] cfg_dcommand2
.cfg_pcie_link_state(cfg_pcie_link_state), // output wire [2 : 0] cfg_pcie_link_state
.cfg_pmcsr_pme_en(cfg_pmcsr_pme_en), // output wire cfg_pmcsr_pme_en
.cfg_pmcsr_powerstate(cfg_pmcsr_powerstate), // output wire [1 : 0] cfg_pmcsr_powerstate
.cfg_pmcsr_pme_status(cfg_pmcsr_pme_status), // output wire cfg_pmcsr_pme_status
.cfg_received_func_lvl_rst(cfg_received_func_lvl_rst), // output wire cfg_received_func_lvl_rst
.cfg_mgmt_di(cfg_mgmt_di), // input wire [31 : 0] cfg_mgmt_di。配置数据输入
.cfg_mgmt_byte_en(cfg_mgmt_byte_en), // input wire [3 : 0] cfg_mgmt_byte_en。配置数据的Byte使能
.cfg_mgmt_dwaddr(cfg_mgmt_dwaddr), // input wire [9 : 0] cfg_mgmt_dwaddr。配置寄存器的地址
.cfg_mgmt_wr_en(cfg_mgmt_wr_en), // input wire cfg_mgmt_wr_en。配置数据的写使能
.cfg_mgmt_rd_en(cfg_mgmt_rd_en), // input wire cfg_mgmt_rd_en。配置数据的读使能
.cfg_mgmt_wr_readonly(cfg_mgmt_wr_readonly), // input wire cfg_mgmt_wr_readonly
.cfg_err_ecrc(cfg_err_ecrc), // input wire cfg_err_ecrc
.cfg_err_ur(cfg_err_ur), // input wire cfg_err_ur
.cfg_err_cpl_timeout(cfg_err_cpl_timeout), // input wire cfg_err_cpl_timeout
.cfg_err_cpl_unexpect(cfg_err_cpl_unexpect), // input wire cfg_err_cpl_unexpect
.cfg_err_cpl_abort(cfg_err_cpl_abort), // input wire cfg_err_cpl_abort
.cfg_err_posted(cfg_err_posted), // input wire cfg_err_posted
.cfg_err_cor(cfg_err_cor), // input wire cfg_err_cor
.cfg_err_atomic_egress_blocked(cfg_err_atomic_egress_blocked), // input wire cfg_err_atomic_egress_blocked
.cfg_err_internal_cor(cfg_err_internal_cor), // input wire cfg_err_internal_cor
.cfg_err_malformed(cfg_err_malformed), // input wire cfg_err_malformed
.cfg_err_mc_blocked(cfg_err_mc_blocked), // input wire cfg_err_mc_blocked
.cfg_err_poisoned(cfg_err_poisoned), // input wire cfg_err_poisoned
.cfg_err_norecovery(cfg_err_norecovery), // input wire cfg_err_norecovery
.cfg_err_tlp_cpl_header(cfg_err_tlp_cpl_header), // input wire [47 : 0] cfg_err_tlp_cpl_header
.cfg_err_cpl_rdy(cfg_err_cpl_rdy), // output wire cfg_err_cpl_rdy
.cfg_err_locked(cfg_err_locked), // input wire cfg_err_locked
.cfg_err_acs(cfg_err_acs), // input wire cfg_err_acs
.cfg_err_internal_uncor(cfg_err_internal_uncor), // input wire cfg_err_internal_uncor
.cfg_trn_pending(cfg_trn_pending), // input wire cfg_trn_pending
.cfg_pm_halt_aspm_l0s(cfg_pm_halt_aspm_l0s), // input wire cfg_pm_halt_aspm_l0s
.cfg_pm_halt_aspm_l1(cfg_pm_halt_aspm_l1), // input wire cfg_pm_halt_aspm_l1
.cfg_pm_force_state_en(cfg_pm_force_state_en), // input wire cfg_pm_force_state_en
.cfg_pm_force_state(cfg_pm_force_state), // input wire [1 : 0] cfg_pm_force_state
.cfg_dsn(cfg_dsn), // input wire [63 : 0] cfg_dsn
//中断接口信号
.cfg_interrupt(cfg_interrupt), // input wire cfg_interrupt。中断请求信号,用户程序声明该信号来产生一个中断消息。该信号需要一直保持高有效,直到cfg_interrupt_rdy信号被置有效位。
.cfg_interrupt_rdy(cfg_interrupt_rdy), // output wire cfg_interrupt_rdy。中断授权(Grant)信号,该信号和之前的cfg_interrupt信号同时为有效位时,表示IP核成功发送一个中断消息
.cfg_interrupt_assert(cfg_interrupt_assert), // input wire cfg_interrupt_assert。是否配置老版本的中断机制
.cfg_interrupt_di(cfg_interrupt_di), // input wire [7 : 0] cfg_interrupt_di。
//配置中断的输入矢量的数量,对于MSI类型的中断,消息数据部分的数据,终端必须给出MSI的中断矢量号。
//如果存在多个终端矢量,由cfg_interrupt_mmenable[2:0]信号决定中断消息数据的下级bits。
//cfg_interrupt_di[7:0]的上级bits将不被使用。对于单个中断矢量,cfg_interrupt_di[7:0]不被使用。
//对于老的中断消息(声明INTx)时,只支持INTA中断。.
.cfg_interrupt_do(cfg_interrupt_do), // output wire [7 : 0] cfg_interrupt_do。MSI capability structure 的Message Data属性最低8bits的值
.cfg_interrupt_mmenable(cfg_interrupt_mmenable), // output wire [2 : 0] cfg_interrupt_mmenable
//配置MSI可以接受的中断矢量数。该数值的范围为:000b-101b,其中000b表示单个MSI中断矢量。其值可被cfg_interrupt_di[7:0]所覆盖
.cfg_interrupt_msienable(cfg_interrupt_msienable), // output wire cfg_interrupt_msienable。配置是否启用MSI中断
.cfg_interrupt_msixenable(cfg_interrupt_msixenable), // output wire cfg_interrupt_msixenable。配置启用MSI-X中断
.cfg_interrupt_msixfm(cfg_interrupt_msixfm), // output wire cfg_interrupt_msixfm。配置PCI Express Capabilities 中的中断消息数量属性。该信号只有当MSI中断启用时需要
.cfg_interrupt_stat(cfg_interrupt_stat), // input wire cfg_interrupt_stat。配置中断的状态
.cfg_pciecap_interrupt_msgnum(cfg_pciecap_interrupt_msgnum), // input wire [4 : 0] cfg_pciecap_interrupt_msgnum
.cfg_to_turnoff(cfg_to_turnoff), // output wire cfg_to_turnoff
.cfg_turnoff_ok(cfg_turnoff_ok), // input wire cfg_turnoff_ok
.cfg_bus_number(cfg_bus_number), // output wire [7 : 0] cfg_bus_number
.cfg_device_number(cfg_device_number), // output wire [4 : 0] cfg_device_number
.cfg_function_number(cfg_function_number), // output wire [2 : 0] cfg_function_number
.cfg_pm_wake(cfg_pm_wake), // input wire cfg_pm_wake
.cfg_pm_send_pme_to(cfg_pm_send_pme_to), // input wire cfg_pm_send_pme_to
.cfg_ds_bus_number(cfg_ds_bus_number), // input wire [7 : 0] cfg_ds_bus_number
.cfg_ds_device_number(cfg_ds_device_number), // input wire [4 : 0] cfg_ds_device_number
.cfg_ds_function_number(cfg_ds_function_number), // input wire [2 : 0] cfg_ds_function_number
.cfg_mgmt_wr_rw1c_as_rw(cfg_mgmt_wr_rw1c_as_rw), // input wire cfg_mgmt_wr_rw1c_as_rw
.cfg_msg_received(cfg_msg_received), // output wire cfg_msg_received
.cfg_msg_data(cfg_msg_data), // output wire [15 : 0] cfg_msg_data
.cfg_bridge_serr_en(cfg_bridge_serr_en), // output wire cfg_bridge_serr_en
.cfg_slot_control_electromech_il_ctl_pulse(cfg_slot_control_electromech_il_ctl_pulse), // output wire cfg_slot_control_electromech_il_ctl_pulse
.cfg_root_control_syserr_corr_err_en(cfg_root_control_syserr_corr_err_en), // output wire cfg_root_control_syserr_corr_err_en
.cfg_root_control_syserr_non_fatal_err_en(cfg_root_control_syserr_non_fatal_err_en), // output wire cfg_root_control_syserr_non_fatal_err_en
.cfg_root_control_syserr_fatal_err_en(cfg_root_control_syserr_fatal_err_en), // output wire cfg_root_control_syserr_fatal_err_en
.cfg_root_control_pme_int_en(cfg_root_control_pme_int_en), // output wire cfg_root_control_pme_int_en
.cfg_aer_rooterr_corr_err_reporting_en(cfg_aer_rooterr_corr_err_reporting_en), // output wire cfg_aer_rooterr_corr_err_reporting_en
.cfg_aer_rooterr_non_fatal_err_reporting_en(cfg_aer_rooterr_non_fatal_err_reporting_en), // output wire cfg_aer_rooterr_non_fatal_err_reporting_en
.cfg_aer_rooterr_fatal_err_reporting_en(cfg_aer_rooterr_fatal_err_reporting_en), // output wire cfg_aer_rooterr_fatal_err_reporting_en
.cfg_aer_rooterr_corr_err_received(cfg_aer_rooterr_corr_err_received), // output wire cfg_aer_rooterr_corr_err_received
.cfg_aer_rooterr_non_fatal_err_received(cfg_aer_rooterr_non_fatal_err_received), // output wire cfg_aer_rooterr_non_fatal_err_received
.cfg_aer_rooterr_fatal_err_received(cfg_aer_rooterr_fatal_err_received), // output wire cfg_aer_rooterr_fatal_err_received
.cfg_msg_received_err_cor(cfg_msg_received_err_cor), // output wire cfg_msg_received_err_cor
.cfg_msg_received_err_non_fatal(cfg_msg_received_err_non_fatal), // output wire cfg_msg_received_err_non_fatal
.cfg_msg_received_err_fatal(cfg_msg_received_err_fatal), // output wire cfg_msg_received_err_fatal
.cfg_msg_received_pm_as_nak(cfg_msg_received_pm_as_nak), // output wire cfg_msg_received_pm_as_nak
.cfg_msg_received_pm_pme(cfg_msg_received_pm_pme), // output wire cfg_msg_received_pm_pme
.cfg_msg_received_pme_to_ack(cfg_msg_received_pme_to_ack), // output wire cfg_msg_received_pme_to_ack
.cfg_msg_received_assert_int_a(cfg_msg_received_assert_int_a), // output wire cfg_msg_received_assert_int_a
.cfg_msg_received_assert_int_b(cfg_msg_received_assert_int_b), // output wire cfg_msg_received_assert_int_b
.cfg_msg_received_assert_int_c(cfg_msg_received_assert_int_c), // output wire cfg_msg_received_assert_int_c
.cfg_msg_received_assert_int_d(cfg_msg_received_assert_int_d), // output wire cfg_msg_received_assert_int_d
.cfg_msg_received_deassert_int_a(cfg_msg_received_deassert_int_a), // output wire cfg_msg_received_deassert_int_a
.cfg_msg_received_deassert_int_b(cfg_msg_received_deassert_int_b), // output wire cfg_msg_received_deassert_int_b
.cfg_msg_received_deassert_int_c(cfg_msg_received_deassert_int_c), // output wire cfg_msg_received_deassert_int_c
.cfg_msg_received_deassert_int_d(cfg_msg_received_deassert_int_d), // output wire cfg_msg_received_deassert_int_d
.cfg_msg_received_setslotpowerlimit(cfg_msg_received_setslotpowerlimit), // output wire cfg_msg_received_setslotpowerlimit
//物理层接口
.pl_directed_link_change(pl_directed_link_change), // input wire [1 : 0] pl_directed_link_change
.pl_directed_link_width(pl_directed_link_width), // input wire [1 : 0] pl_directed_link_width
.pl_directed_link_speed(pl_directed_link_speed), // input wire pl_directed_link_speed
.pl_directed_link_auton(pl_directed_link_auton), // input wire pl_directed_link_auton
.pl_upstream_prefer_deemph(pl_upstream_prefer_deemph), // input wire pl_upstream_prefer_deemph
.pl_sel_lnk_rate(pl_sel_lnk_rate), // output wire pl_sel_lnk_rate
.pl_sel_lnk_width(pl_sel_lnk_width), // output wire [1 : 0] pl_sel_lnk_width
.pl_ltssm_state(pl_ltssm_state), // output wire [5 : 0] pl_ltssm_state。表示当前的LTSSM(Link Training Status State Machine)的状态
.pl_lane_reversal_mode(pl_lane_reversal_mode), // output wire [1 : 0] pl_lane_reversal_mode。表示预留的通道
.pl_phy_lnk_up(pl_phy_lnk_up), // output wire pl_phy_lnk_up。表示物理层的连接状态
.pl_tx_pm_state(pl_tx_pm_state), // output wire [2 : 0] pl_tx_pm_state
.pl_rx_pm_state(pl_rx_pm_state), // output wire [1 : 0] pl_rx_pm_state
.pl_link_upcfg_cap(pl_link_upcfg_cap), // output wire pl_link_upcfg_cap。表示链路可以在上游配置的能力
.pl_link_gen2_cap(pl_link_gen2_cap), // output wire pl_link_gen2_cap。表示链路是否具有二代(Gen2 5.0Gb/s)的能力
.pl_link_partner_gen2_supported(pl_link_partner_gen2_supported), // output wire pl_link_partner_gen2_supported。表示链路另一端是否有Gen2的能力
.pl_initial_link_width(pl_initial_link_width), // output wire [2 : 0] pl_initial_link_width。表示PCI Express端口已经成功连接的通道数。
.pl_directed_change_done(pl_directed_change_done), // output wire pl_directed_change_done。表示连接模式变更完成
.pl_received_hot_rst(pl_received_hot_rst), // output wire pl_received_hot_rst
.pl_transmit_hot_rst(pl_transmit_hot_rst), // input wire pl_transmit_hot_rst
.pl_downstream_deemph_source(pl_downstream_deemph_source), // input wire pl_downstream_deemph_source
.cfg_err_aer_headerlog(cfg_err_aer_headerlog), // input wire [127 : 0] cfg_err_aer_headerlog
.cfg_aer_interrupt_msgnum(cfg_aer_interrupt_msgnum), // input wire [4 : 0] cfg_aer_interrupt_msgnum
.cfg_err_aer_headerlog_set(cfg_err_aer_headerlog_set), // output wire cfg_err_aer_headerlog_set
.cfg_aer_ecrc_check_en(cfg_aer_ecrc_check_en), // output wire cfg_aer_ecrc_check_en
.cfg_aer_ecrc_gen_en(cfg_aer_ecrc_gen_en), // output wire cfg_aer_ecrc_gen_en
.cfg_vc_tcvc_map(cfg_vc_tcvc_map), // output wire [6 : 0] cfg_vc_tcvc_map
//系统的时钟,复位
.sys_clk(sys_clk), // input wire sys_clk
.sys_rst_n(sys_rst_n) // input wire sys_rst_n
);
// INST_TAG_END ------ End INSTANTIATION Template ---------
// You must compile the wrapper file pcie_7x_0.v when simulating
// the core, pcie_7x_0. When compiling the wrapper file, be sure to
// reference the Verilog simulation library.