AR# 64793

|

Aurora 8B10B v11.0 およびそれ以前のバージョンのデザイン アドバイザリ - Artix-7 GTP をターゲットにしている Simplex RX コアで MMCM のリセットがディアサートされず、RXRESETDONE が HIGH にならない

説明

この問題は、Aurora 8B10B コアで Artix-7 GTP をターゲットしているときに 4 バイト インターフェイス幅および Simplex RX データ フロー モードがコンフィギュレーションされているときのみに発生します。 

RX_STARTUP_FSM に接続されている RXOUTCLK 入力のクロックが user_clk で供給されています。 この user_clk は MMCM から出力されます (入力は txoutclk)。

MMCM のリセットは、RX_STARTUP_FSM で駆動され、これが RXOUTCLK に同期している RXPMARESETDONE 信号に基づいて駆動されています。この信号が High にならず、立ち下がりエッジが検出されています。

ソリューション

この問題は、Vivado 2015.2 でリリースされた Aurora 8B10B v11.0 Rev1 コアで修正されています。

v11.0 より前のバージョンでこの問題を修正する場合は、次のファイルをアップデートしてください。

  • <component_name>_wrapper.v[hd]
  • <component_name>_multi_gt.v[hd]
  • <component_name>_gt.v[hd]
  • <component_name>_rx_startup_fsm.v[hd]
  • <component_name>_clocks.xdc

===========================================================================

Verilog :

===========================================================================

<component_name>_wrapper.v:

次のワイヤを宣言します。

 wire              gt0_txpmaresetdone_o;
 wire              gt_txpmaresetdone_i;
 wire              gt_txoutclk_out;

1. 次に示すように BUFH を TXOUTCLK1_OUT 信号にインスタンシエートします。

次のように変更します。

       BUFH rxout0_buf
           (.O   (gt_txoutclk_out),
            .I   (TXOUTCLK1_OUT));

2. 手順 1 でインスタンシエートした BUFH の出力を RX_STARTUP_FSM インスタンシエーションの RXOUTCLK 入力に接続します。

変更前

.RXOUTCLK                       (RXUSRCLK2_IN),

次のように変更します。

.RXOUTCLK                       (gt_txoutclk_out),

3. <component_name>_multi_gt モジュールのインスタンシエーションで新しいポート接続を追加します。

.gt0_txpmaresetdone_out             (gt0_txpmaresetdone_o),

 

上記のコード例は、シングル レーンの使用例です。

複数レーンを使用する場合は、レーン数に基づいてポート接続を追加する必要があります。

次に、2 レーンを使用した場合のコード例を示します。

.gt0_txpmaresetdone_out             (gt0_txpmaresetdone_o),
.gt1_txpmaresetdone_out             (gt1_txpmaresetdone_o),

 

4. gt_txpmaresetdone_i を RX_STARTUP_FSM インスタンシエーションの TXPMARESETDONE 入力に接続します。

assign gt_txpmaresetdone_i  = gt0_txpmaresetdone_o;

上記のコード例は、シングル レーンの使用例です。 

複数レーンを使用する場合は、レーンから txpmaresetdone ポートへの接続をすべて AND 接続し、gt_txpmaresetdone_i に割り当てる必要があります。

次に、2 レーンを使用した場合のコード例を示します。

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),

上記のコード例は、シングル レーンの使用例です。 

複数レーンを使用する場合は、レーン数に基づいてポート接続を追加する必要があります。 

次に、2 レーンを使用した場合のコード例を示します。

<component_name>_gt_inst のコード例 :

.txpmaresetdone_out             (gt0_txpmaresetdone_out),

<component_name>_gt_inst_lane1 のコード例 :

.txpmaresetdone_out             (gt1_txpmaresetdone_out),

<component_name>_gt.v:

1. txpmaresetdone_out 信号に新しい出力ポートを宣言します。


output          txpmaresetdone_out,

 

2. GTPE2_CHANNEL コンポーネントのインスタンシエーションで TXPMARESETDONE 出力ポートへのポート接続を変更します。

変更前

.TXPMARESETDONE               (),

次のように変更します。

.TXPMARESETDONE               (txpmaresetdone_out),

 

<component_name>_rx_startup_fsm.v:

このモジュールでは、コードを次のように変更する必要があります。

1. rxpmaresetdone_i 関連回路を変更します。

269 行目にある次の割り当てを変更します。

変更前

rxpmaresetdone_i <= `DLY pmaresetdone_fallingedge_detect_s & rxpmaresetdone_rx_s;

次のように変更します。

rxpmaresetdone_i <= `DLY rxpmaresetdone_rx_s;

2. data_valid_sync 関連回路を変更します。

<component_name>_cdc_sync シンクロナイザーを削除して、591 行目で DATA_VALID 信号を 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 (                           )
    );

次のように変更します。

assign data_valid_sync = DATA_VALID;

===========================================================================

VHDL :

===========================================================================

<component_name>_wrapper.vhd:
 
1. コンポーネント インスタンシエーションを変更します。

GT0_TXPMARESETDONE_OUT ポートを <component_name>_multi_gt コンポーネントに追加します。

 

GT0_TXPMARESETDONE_OUT                  : out  std_logic;

 

2. BUFH コンポーネントをインスタンシエートします。

 component BUFH
        port (
                O : out std_ulogic;
                I : in  std_ulogic
             );
    end component;
3. 次の信号を宣言します。

 signal gt0_txpmaresetdone_o : std_logic;
 signal TXOUTCLK_OUT : std_logic;
 signal gt_txpmaresetdone_i : std_logic;
 signal gt_txoutclk_out     : std_logic;

 

4. <component_name>_multi_gt インスタンシエーションの GT0_TXOUTCLK_OUT ポートの接続を変更します。

変更前

 GT0_TXOUTCLK_OUT          =>  TXOUTCLK1_OUT

次のように変更します。

 GT0_TXOUTCLK_OUT          =>  TXOUTCLK_OUT,

 

5. <component_name>_multi_gt モジュールのインスタンシエーションで新しいポート接続を追加します。

gt0_txpmaresetdone_out             => gt0_txpmaresetdone_o,

 

上記のコード例は、シングル レーンの使用例です。 

複数レーンを使用する場合は、レーン数に基づいてポート接続を追加する必要があります。 

次に、2 レーンを使用した場合のコード例を示します。

 gt0_txpmaresetdone_out             => gt0_txpmaresetdone_o,
 gt1_txpmaresetdone_out             => gt1_txpmaresetdone_o,

 

6. 次の信号を割り当てます。

 TXOUTCLK1_OUT       <= TXOUTCLK_OUT;
 gt_txpmaresetdone_i  <= gt0_txpmaresetdone_o; 

 

上記の gt_txpmaresetdone_i のコード例は、シングル レーンの使用例です。

複数レーンを使用する場合は、レーンから txpmaresetdone ポートへの接続をすべて AND 接続し、gt_txpmaresetdone_i に割り当てる必要があります。

次に、2 レーンを使用した場合のコード例を示します。

gt_txpmaresetdone_i  <= gt0_txpmaresetdone_o AND gt1_txpmaresetdone_o; 

 

 

7. 次に示すように BUFH を TXOUTCLK_OUT 信号にインスタンシエートします。
 

 rxout0_buf : BUFH
  port map
   (O =>  gt_txoutclk_out,
    I =>  TXOUTCLK_OUT); 

 

8. 手順 5 でインスタンシエートした BUFH を RX_STARTUP_FSM インスタンシエーションの RXOUTCLK 入力ポートに接続します。

変更前

 RXOUTCLK                       => RXUSRCLK2_IN,

次のように変更します。

 RXOUTCLK                       => gt_txoutclk_out

 

9. gt_txpmaresetdone_i を RX_STARTUP_FSM インスタンシエーションの RXPMARESETDONE 入力に接続します。

変更前
 

RXPMARESETDONE                 => tied_to_vcc_i, 

次のように変更します。

RXPMARESETDONE                 => gt_txpmaresetdone_i

 

<component_name>_multi_gt.v:

1. TXPMARESETDONE_OUT 信号に新しい出力ポートを宣言します。

GT0_TXPMARESETDONE_OUT                  : out  std_logic;

 

2. コンポーネント インスタンシエーションを変更します。

TXPMARESETDONE_OUT ポートを <component_name>_gt コンポーネントに追加します。

TXPMARESETDONE_OUT                  : out  std_logic;

 

3. <component_name>_gt モジュールのインスタンシエーションで新しいポート接続を追加します。

TXPMARESETDONE_OUT              =>      GT0_TXPMARESETDONE_OUT,

 

上記のコード例は、シングル レーンの使用例です。 

複数レーンを使用する場合は、レーン数に基づいてポート接続を追加する必要があります。 

次に、2 レーンを使用した場合のコード例を示します。

<component_name>_gt_inst を次のように接続します。

TXPMARESETDONE_OUT              =>      GT0_TXPMARESETDONE_OUT,

 

<component_name>_gt_inst_lane1 を次のように接続します。

TXPMARESETDONE_OUT              =>      GT1_TXPMARESETDONE_OUT,

 

<component_name>_gt.vhd:

1. TXPMARESETDONE_OUT 信号に新しい出力ポートを宣言します。

TXPMARESETDONE_OUT                      : out  std_logic;

 

2. 次の信号を宣言します。

signal    txpmaresetdone_t                : std_logic;

 

3. GTPE2_CHANNEL コンポーネントのインスタンシエーションで TXPMARESETDONE 出力ポートへのポート接続を変更します。

変更前

TXPMARESETDONE                  =>      open,

次のように変更します。

TXPMARESETDONE                  =>      txpmaresetdone_t,

 

4. 次の信号を割り当てます。

TXPMARESETDONE_OUT    <=   txpmaresetdone_t;

 

<component_name>_rx_startup_fsm.vhd:

このモジュールでは、コードを次のように変更する必要があります。

1. rxpmaresetdone_i 関連回路を変更します。

263 行目にある次の割り当てを変更します。

変更前
 

rxpmaresetdone_i <= pmaresetdone_fallingedge_detect_s and rxpmaresetdone_rx_s;

次のように変更します。
 

rxpmaresetdone_i <= rxpmaresetdone_rx_s;

 

2. data_valid_sync 関連回路を変更します。

<component_name>_cdc_sync シンクロナイザーを削除して、610 行目で DATA_VALID 信号を data_valid_sync に割り当てます。

変更前
 

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*]

 

改訂履歴

2015/08/03 - 初版

アンサー レコード リファレンス

マスター アンサー レコード

Answer Number アンサータイトル 問題の発生したバージョン 修正バージョン
51553 LogiCORE IP Aurora 8B10B および Aurora 64B66B のデザイン アドバイザリ マスター アンサー レコード N/A N/A
AR# 64793
日付 08/17/2015
ステータス アクティブ
種類 デザイン アドバイザリ
デバイス
ツール
IP
People Also Viewed