只有在 Aurora 8B10B 内核以 4 字节接口宽度以及面向 Artix-7 GTP 的 Simplex RX 数据流模式配置时,才会出现该问题。
连接至 RX_STARTUP_FSM 的 RXOUTCLK 的输入由 user_clk 源出,user_clk 为 MMCM 输出(输入为 txoutclk)。
MMCM 的重置是从 RX_STARTUP_FSM 驱动的,并且 是根据同步到 RXOUTCLK 的 RXPMARESETDONE 信号来驱动的。负边沿检测现已完成。
此问题在 VIVADO 2015.2 工具版发布的 Aurora 8B10B v11.0 Rev1 核中得以修正。
修正之前核版本(v11.0 或更早)出现的问题,请更新以下文件。
===========================================================================
Verilog:
===========================================================================
<component_name>_wrapper.v:
声明以下线路
wire gt0_txpmaresetdone_o;
wire gt_txpmaresetdone_i;
wire gt_txoutclk_out;
1. 如下所示,按 TXOUTCLK1_OUT 信号实例化 BUFH。
更新:
BUFH rxout0_buf
(.O (gt_txoutclk_out),
.I (TXOUTCLK1_OUT));
2. 将步骤 1 中实例化的 BUFH 的输出连接至 RX_STARTUP_FSM 实例化的 RXOUTCLK 输入。
从
.RXOUTCLK (RXUSRCLK2_IN),
到
.RXOUTCLK (gt_txoutclk_out),
.gt0_txpmaresetdone_out (gt0_txpmaresetdone_o),
.gt0_txpmaresetdone_out (gt0_txpmaresetdone_o),
.gt1_txpmaresetdone_out (gt1_txpmaresetdone_o),
4. 将 gt_txpmaresetdone_i 连接至 RX_STARTUP_FSM 实例化的 RXPMARESETDONE 输入。
assign gt_txpmaresetdone_i = gt0_txpmaresetdone_o;
以上代码段适用于单通道使用案例。
对于多通道情况而言,需要将每个通道的 txpmaresetdone 端口连接累加到一起 并分配给 gt_txpmaresetdone_i。
例如,在双通道情况下代码段如下:
assign gt_txpmaresetdone_i = gt0_txpmaresetdone_o && gt1_txpmaresetdone_o ;
从:
RXPMARESETDONE (tied_to_vcc_i),
到:
RXPMARESETDONE (gt_txpmaresetdone_i),
<component_name>_multi_gt.v:
1. 声明 gt0_txpmaresetdone_out 信号的新输出端口:
output gt0_txpmaresetdone_out,
2. 对于 <component_name>_gt 模块实例化而言,需要一个新端口连接:
.txpmaresetdone_out (gt0_txpmaresetdone_out),
以上代码段适用于单通道使用案例。
对于多通道情况而言,需要根据通道数量增加端口连接。
例如,在双通道情况下代码段如下。
From <component_name>_gt_inst:
.txpmaresetdone_out (gt0_txpmaresetdone_out),
From <component_name>_gt_inst_lane1:
.txpmaresetdone_out (gt1_txpmaresetdone_out),
output txpmaresetdone_out,
.TXPMARESETDONE (),
.TXPMARESETDONE (txpmaresetdone_out),
<component_name>_rx_startup_fsm.v:
该模块需要进行以下代码编辑。
1. 更新 rxpmaresetdone_i 相关电路。
更新第 269 行的下列赋值:
从:
rxpmaresetdone_i <= `DLY pmaresetdone_fallingedge_detect_s & rxpmaresetdone_rx_s;
To:
rxpmaresetdone_i <= `DLY rxpmaresetdone_rx_s;
2. 更新 data_valid_sync 相关电路。
移除 <component_name>_cdc_sync 同步器并将 DATA_VALID 信号分配给第 591 行中的 data_valid_sync。
从:
aurora_8b10b_0_cdc_sync
#(
.c_cdc_type (1 ),
.c_flop_input (0 ),
.c_reset_state (0 ),
.c_single_bit (1 ),
.c_vector_width (2 ),
.c_mtbf_stages (3 )
)sync_data_valid_cdc_sync
(
.prmry_aclk (RXUSERCLK ),
.prmry_rst_n (1'b1 ),
.prmry_in (DATA_VALID ),
.prmry_vect_in (2'd0 ),
.scndry_aclk (STABLE_CLOCK ),
.scndry_rst_n (1'b1 ),
.prmry_ack ( ),
.scndry_out (data_valid_sync ),
.scndry_vect_out ( )
);
To:
assign data_valid_sync = DATA_VALID;
===========================================================================
VHDL:
===========================================================================
GT0_TXPMARESETDONE_OUT : out std_logic;
GT0_TXOUTCLK_OUT => TXOUTCLK1_OUT
GT0_TXOUTCLK_OUT => TXOUTCLK_OUT,
gt0_txpmaresetdone_out => gt0_txpmaresetdone_o,
以上代码段适用于单通道使用案例。
对于多通道情况而言,需要根据通道数量增加端口连接。
例如,在双通道情况下代码段如下。
gt0_txpmaresetdone_out => gt0_txpmaresetdone_o,
gt1_txpmaresetdone_out => gt1_txpmaresetdone_o,
TXOUTCLK1_OUT <= TXOUTCLK_OUT;
gt_txpmaresetdone_i <= gt0_txpmaresetdone_o;
gt_txpmaresetdone_i <= gt0_txpmaresetdone_o AND gt1_txpmaresetdone_o;
rxout0_buf : BUFH
port map
(O => gt_txoutclk_out,
I => TXOUTCLK_OUT);
RXOUTCLK => RXUSRCLK2_IN,
RXOUTCLK => gt_txoutclk_out
RXPMARESETDONE => tied_to_vcc_i,
RXPMARESETDONE => gt_txpmaresetdone_i
GT0_TXPMARESETDONE_OUT : out std_logic;
2. 更新组件实例化。
Add aTXPMARESETDONE_OUT port to <component_name>_gt.
TXPMARESETDONE_OUT : out std_logic;
TXPMARESETDONE_OUT => GT0_TXPMARESETDONE_OUT,
以上代码段适用于单通道使用案例。
对于多通道情况而言,需要根据通道数量增加端口连接。
例如,在双通道情况下代码段如下。
TXPMARESETDONE_OUT => GT0_TXPMARESETDONE_OUT,
TXPMARESETDONE_OUT => GT1_TXPMARESETDONE_OUT,
TXPMARESETDONE_OUT : out std_logic;
signal txpmaresetdone_t : std_logic;
TXPMARESETDONE => open,
TXPMARESETDONE => txpmaresetdone_t,
TXPMARESETDONE_OUT <= txpmaresetdone_t;
rxpmaresetdone_i <= pmaresetdone_fallingedge_detect_s and rxpmaresetdone_rx_s;
rxpmaresetdone_i <= rxpmaresetdone_rx_s;
sync_data_valid_cdc_sync : aurora_8b10b_1_cdc_sync
generic map
(
c_cdc_type => 1 ,
c_flop_input => 0 ,
c_reset_state => 0 ,
c_single_bit => 1 ,
c_vector_width => 2 ,
c_mtbf_stages => 3
)
port map
(
prmry_aclk => RXUSERCLK ,
prmry_resetn => '1' ,
prmry_in => DATA_VALID ,
prmry_vect_in => "00" ,
scndry_aclk => STABLE_CLOCK ,
scndry_resetn => '1' ,
prmry_ack => open ,
scndry_out => data_valid_sync ,
scndry_vect_out => open
);
data_valid_sync <= DATA_VALID;
===========================================================================
更新至 <component_name>_clocks.xdc
作以下变更:
从
set_false_path -through [get_pins -hier *cdc_to*]
到
set_false_path -to [get_pins -hier *cdc_to*]
修订历史:
08/03/2015——初始版本
Answer Number | 问答标题 | 问题版本 | 已解决问题的版本 |
---|---|---|---|
51553 | Design Advisory Master Answer Record for LogiCORE IP Aurora 8B10B and Aurora 64B66B | N/A | N/A |
AR# 64793 | |
---|---|
日期 | 08/17/2015 |
状态 | Active |
Type | 设计咨询 |
器件 | |
Tools | |
IP |