UPGRADE YOUR BROWSER

We have detected your current browser version is not the latest one. Xilinx.com uses the latest web technologies to bring you the best online experience possible. Please upgrade to a Xilinx.com supported browser:Chrome, Firefox, Internet Explorer 11, Safari. Thank you!

AR# 55884

MIG 7 Series QDRII+ - キャリブレーション中に pi_edge_adv が滞り、データ エラーが発生することがある

説明

問題の発生したバージョン : v1.9
修正バージョン : (ザイリンクス アンサー 45195) および (ザイリンクス アンサー 54025) を参照

キャリブレーションの EDGE_ADV ステージ中に、pi_edge_adv 信号が滞り、標準操作中にデータ エラーが発生する可能性があります。

ソリューション

キャリブレーションの EDGE_ADV ステージ中に、バイト グループから取り込まれたデータが負のエッジに揃えられると、ICLKDIV 出力を 1 高速クロック サイクル分シフトさせる PHASER_IN への EDGE_ADV 入力が正のエッジにデータを調整するために使用されます。調整が必要なときは、*_read_stage2_cal.v の pi_edge_adv 信号が 1 クロック サイクル間アサートされます。場合によっては、*_read_stage2_cal.v の pi_edge_adv 信号が滞り、データ バイト エラーが発生することがあります。

この問題を回避するには、mig_7series_v1_9_rld_phy_read_stage2_cal.v で RTL を次のように変更します。

次のコードを検索します。

reg  [2:0]                           pi_edge_adv_wait_cnt;
  always @ (posedge clk) begin
         if (rst_clk) begin
             pi_edge_adv  <= #TCQ 0;
bitslip      <= #TCQ 0;
             phase_error  <= #TCQ 0;
             pi_edge_adv_wait_cnt <= #TCQ 0;
             inc_byte_cnt <= #TCQ 0;
         end else begin
    if (nCK_PER_CLK == 2) begin
               if ((clkdiv_phase_cal_done_5r) && (!edge_adv_cal_done)) begin
                 if (phase_bslip_vld_chk[byte_cnt] == 1'b1 &&
        pi_edge_adv_wait_cnt == 3'b000) begin
                    pi_edge_adv  <= #TCQ 1;
                    phase_error  <= #TCQ 0;
                    pi_edge_adv_wait_cnt <= #TCQ 111;
                    inc_byte_cnt <= #TCQ 0;
                 end else if (phase_bslip_vld_chk[byte_cnt] == 1'b0 &&
                 pi_edge_adv_wait_cnt == 3'b000) begin
                    pi_edge_adv  <= #TCQ 0;
                    phase_error  <= #TCQ 0;
                    pi_edge_adv_wait_cnt <= #TCQ 111;
                    inc_byte_cnt <= #TCQ 0;
                 end else if (pi_edge_adv_wait_cnt == 3'b010) begin
                    pi_edge_adv  <= #TCQ 0;
                    phase_error  <= #TCQ 0;
                    pi_edge_adv_wait_cnt <= #TCQ pi_edge_adv_wait_cnt -1 ;
                    inc_byte_cnt <= #TCQ 1;
                 end else begin
                    pi_edge_adv  <= #TCQ 0;
                    phase_error  <= #TCQ 0;
                    pi_edge_adv_wait_cnt <= #TCQ pi_edge_adv_wait_cnt -1 ;
                    inc_byte_cnt <= #TCQ 0;
                 end
  end //end of (clkdiv_phase_cal_done_5r) && (!edge_adv_cal_done)
end else begin //nCK_PER_CLK == 4
  //Even though we don't use the edge_adv signal we use the same
  //counter
  if (edge_adv_cal_start_r2 && (!edge_adv_cal_done)) begin
    if (phase_vld_check[byte_cnt] == 1'b1 &&
        pi_edge_adv_wait_cnt == 3'b000) begin
                   bitslip      <= #TCQ 0;
                   phase_error  <= #TCQ 0;
                   pi_edge_adv_wait_cnt <= #TCQ 111;
                   inc_byte_cnt <= #TCQ 1;
    end else if (phase_vld_check[byte_cnt] == 1'b0 &&
                 pi_edge_adv_wait_cnt == 3'b000) begin
                   bitslip      <= #TCQ 1;
                   phase_error  <= #TCQ 0;
                   pi_edge_adv_wait_cnt <= #TCQ 111;
                   inc_byte_cnt <= #TCQ 0;
    end else if (pi_edge_adv_wait_cnt == 3'b010) begin
                   bitslip      <= #TCQ 0;
                   phase_error  <= #TCQ 0;
                   pi_edge_adv_wait_cnt <= #TCQ pi_edge_adv_wait_cnt -1 ;
                   inc_byte_cnt <= #TCQ 0;
                 end else begin
                   bitslip      <= #TCQ 0;
                   phase_error  <= #TCQ 0;
                   pi_edge_adv_wait_cnt <= #TCQ pi_edge_adv_wait_cnt -1 ;
                   inc_byte_cnt <= #TCQ 0;
                 end
  end
end //end of //nCK_PER_CLK == 4
         end //end of else
      end //end of always


これを次のものに置き換えます。

reg  [3:0]                           pi_edge_adv_wait_cnt;
 always @ (posedge clk) begin
         if (rst_clk) begin
             pi_edge_adv  <= #TCQ 0;
bitslip      <= #TCQ 0;
             phase_error  <= #TCQ 0;
             pi_edge_adv_wait_cnt <= #TCQ 0;
             inc_byte_cnt <= #TCQ 0;
         end else begin
    if (nCK_PER_CLK == 2) begin
               if ((clkdiv_phase_cal_done_5r) && (!edge_adv_cal_done)) begin
                 if (phase_bslip_vld_chk[byte_cnt] == 1'b1 &&
        pi_edge_adv_wait_cnt == 4'b0000) begin
                    pi_edge_adv  <= #TCQ 1;
                    phase_error  <= #TCQ 0;
                    pi_edge_adv_wait_cnt <= #TCQ 4'b1111;
                    inc_byte_cnt <= #TCQ 0;
                 end else if (phase_bslip_vld_chk[byte_cnt] == 1'b0 &&
                 pi_edge_adv_wait_cnt == 4'b0000) begin
                    pi_edge_adv  <= #TCQ 0;
                    phase_error  <= #TCQ 0;
                    pi_edge_adv_wait_cnt <= #TCQ 4'b1111;
                    inc_byte_cnt <= #TCQ 0;
                 end else if (pi_edge_adv_wait_cnt == 4'b0010) begin
                    pi_edge_adv  <= #TCQ 0;
                    phase_error  <= #TCQ 0;
                    pi_edge_adv_wait_cnt <= #TCQ pi_edge_adv_wait_cnt -1 ;
                    inc_byte_cnt <= #TCQ 1;
                 end else begin
                    pi_edge_adv  <= #TCQ 0;
                    phase_error  <= #TCQ 0;
                    pi_edge_adv_wait_cnt <= #TCQ pi_edge_adv_wait_cnt -1 ;
                    inc_byte_cnt <= #TCQ 0;
                 end
  end //end of (clkdiv_phase_cal_done_5r) && (!edge_adv_cal_done)
end else begin //nCK_PER_CLK == 4
  //Even though we don't use the edge_adv signal we use the same
  //counter
  if (edge_adv_cal_start_r2 && (!edge_adv_cal_done)) begin
    if (phase_vld_check[byte_cnt] == 1'b1 &&
        pi_edge_adv_wait_cnt == 4'b0000) begin
                   bitslip      <= #TCQ 0;
                   phase_error  <= #TCQ 0;
                   pi_edge_adv_wait_cnt <= #TCQ 4'b1111;
                   inc_byte_cnt <= #TCQ 1;
    end else if (phase_vld_check[byte_cnt] == 1'b0 &&
                 pi_edge_adv_wait_cnt == 4'b0000) begin
                   bitslip      <= #TCQ 1;
                   phase_error  <= #TCQ 0;
                   pi_edge_adv_wait_cnt <= #TCQ 4'b1111;
                   inc_byte_cnt <= #TCQ 0;
    end else if (pi_edge_adv_wait_cnt == 4'b0010) begin
                   bitslip      <= #TCQ 0;
                   phase_error  <= #TCQ 0;
                   pi_edge_adv_wait_cnt <= #TCQ pi_edge_adv_wait_cnt -1 ;
                   inc_byte_cnt <= #TCQ 0;
                 end else begin
                   bitslip      <= #TCQ 0;
                   phase_error  <= #TCQ 0;
                   pi_edge_adv_wait_cnt <= #TCQ pi_edge_adv_wait_cnt -1 ;
                   inc_byte_cnt <= #TCQ 0;
                 end
  end
end //end of //nCK_PER_CLK == 4
         end //end of else
      end //end of always

改訂履歴
2013/05/06 - 初版

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

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

AR# 55884
日付 10/03/2013
ステータス アクティブ
種類 既知の問題
デバイス
  • Artix-7
  • Kintex-7
  • Virtex-7
IP
  • MIG 7 Series
このページをブックマークに追加