自作基板のArtix-7にSiTCPを実装し、SFP光トランシーバで1GbitEthernetを動作させようとしています。AC701評価ボードのSFP用サンプルコードをベースに実装をしているのですが、うまくリンクアップしません。そこでいくつか教えてください。AC701評価基板で使用したSFPトランシーバモジュールの具体的な型番などが分かれば教えてください。またそのSFPモジュールの場合は1000BaseXモードとSGMIIモードのどちらの設定(SEL_SGMIIの設定)で使用しているのでしょうか。
・EthenetPHYはダウンロードしたサンプルコードのgig_ethernet_pcs_pmaモジュールをそのまま使用しています。
・開発環境はVivado2018.3を使用しています。
・SiTCPのネットワークパラメータ設定はFORCE_DEFAULTnを0に設定しています。
よろしくお願いします。
ラッパー(WRAP_gig_ethernet_pcs_pma_0)は、評価ボード用ですので、Vivado のIP Catalog にて、gig_ethernet_pcs_pma を検索してご利用ください。
弊社で使用しているSFPの型番は以下となります。
1000BASE-SX: AFBR-5710PZ
1000BASE-T: GLC-T-AS
SEL_SGMIIの設定は、自動的に認識するようになっております。
SFPの型番情報どうもありがとうございます。
VivadoのIP Catalogでgig_ethernet_pcs_pmaを生成しました。設定は以下のようにしました。
Standard:1000BASEX → チェック入れる
Standard:Additional tranciever control and status ports → チェック外す
Core Functionality:Rx Gmii Clk Src → TXOUTCLK
Core Functionality:MDIO Manegement Interface → チェック外す
Core Functionality:Auto Negotiation → チェック入れる
Shared Logic:Include Shared Logic in Core → チェック入れる
結果、以下のような信号を持つモジュールが生成されました(コメントなどは削除してあります)。
module gig_ethernet_pcs_pma_0 #
(
parameter EXAMPLE_SIMULATION = 0
)
(
input gtrefclk_p,
input gtrefclk_n,
output gtrefclk_out,
output gtrefclk_bufg_out,
output txp,
output txn,
input rxp,
input rxn,
output resetdone,
output userclk_out,
output userclk2_out,
output rxuserclk_out,
output rxuserclk2_out,
input independent_clock_bufg,
output pma_reset_out,
output mmcm_locked_out,
input [7:0] gmii_txd,
input gmii_tx_en,
input gmii_tx_er,
output [7:0] gmii_rxd,
output gmii_rx_dv,
output gmii_rx_er,
output gmii_isolate,
input [4:0] configuration_vector,
output an_interrupt,
input [15:0] an_adv_config_vector,
input an_restart_config,
output [15:0] status_vector,
input reset,
input signal_detect,
output gt0_pll0outclk_out,
output gt0_pll0outrefclk_out,
output gt0_pll1outclk_out,
output gt0_pll1outrefclk_out,
output gt0_pll0lock_out,
output gt0_pll0refclklost_out
);
サンプルコードではこのようなモジュールをラッパー(WRAP_gig_ethernet_pcs_pma)で包んであるためにクロックの結線やパラメータの設定が見えないので、以下の点について教えていただけないでしょうか。
・ラッパーのGMII_CLKと接続されているクロックはどれになりますか(userclk2_out?)
・ラッパーのSYS_CLKと接続されているクロックはどれになりますか(independent_clock_bufg?)
・configuration_vector[4:0]には何を設定しているでしょうか。
・an_adv_config_vector[15:0]には何を設定しているでしょうか。
よろしくお願いします。
ラッパーの内容は、以下の通りです。
//------------------------------------------------------------------------------
// ethernet_pcs_pma
//------------------------------------------------------------------------------
BUFGCE BUF_SGMII(.O(GMII_CLK), .CE(sgmii_clk_en), .I(userclk2));
assign CFG_REG[15:0] = 16’b0000_0000_0010_0000; // Use only BASE-X configulation
gig_ethernet_pcs_pma_0 gig_ethernet_pcs_pma_0
(
// Transceiver Interface
//----------------------
.gtrefclk_p (SGMII_CLK_P), // input OK :
.gtrefclk_n (SGMII_CLK_N), // input OK :
.gtrefclk_out (), // output :
.gtrefclk_bufg_out (), // output :
.txp (SFP_TX_P), // outputOK : Differential +ve of serial transmission from PMA to PMD.
.txn (SFP_TX_N), // outputOK : Differential -ve of serial transmission from PMA to PMD.
.rxp (SFP_RX_P), // input OK : Differential +ve for serial reception from PMD to PMA.
.rxn (SFP_RX_N), // input OK : Differential -ve for serial reception from PMD to PMA.
.resetdone (), // output : The GT transceiver has completed its reset cycle
.userclk_out () , // output :
.userclk2_out (userclk2), // outputOK :
.rxuserclk_out (), // output :
.rxuserclk2_out (), // output :
.independent_clock_bufg (SYS_CLK), // input OK :
.pma_reset_out (), // output : transceiver PMA reset signal
.mmcm_locked_out (), // output : MMCM Locked
// GMII Interface
//---------------
.sgmii_clk_r (), // output :
.sgmii_clk_f (), // output :
.sgmii_clk_en (sgmii_clk_en), // outputOK : Clock enable for client MAC
.gmii_txd (GMII_TXD[7:0]), // input OK : [7:0] Transmit data from client MAC.
.gmii_tx_en (GMII_TX_EN), // input OK : Transmit control signal from client MAC.
.gmii_tx_er (GMII_TX_ER), // input OK : Transmit control signal from client MAC.
.gmii_rxd (GMII_RXD[7:0]), // outputOK: [7:0] Received Data to client MAC.
.gmii_rx_dv (GMII_RX_DV), // outputOK : Received control signal to client MAC.
.gmii_rx_er (GMII_RX_ER), // outputOK : Received control signal to client MAC.
.gmii_isolate (), // output : Tristate control to electrically isolate GMII.
// Management: Alternative to MDIO Interface
//------------------------------------------
.configuration_vector (5’b1_0000), // input : [4:0] Alternative to MDIO interface.
.an_interrupt (), // output : Interrupt to processor to signal that Auto-Negotiation has completed
.an_adv_config_vector (CFG_REG[15:0]), // input OK : [15:0] Alternate interface to program REG4 (AN ADV)
.an_restart_config (1’b0), // input : Alternate signal to modify AN restart bit in REG0
.basex_or_sgmii (SEL_SGMII), // input OK : Reset default for 1000BASE-X (0) or SGMII standard (1)
// Speed Control
//--------------
//1 Gbps Operation
// set speed_is_10_100 to logic 0
//100 Mbps Operation
// set speed_is_10_100 to logic 1
// set speed_is_100 to logic 1
//10 Mbps Operation
// set speed_is_10_100 to logic 1
// set speed_is_100 to logic 0
.speed_is_10_100 (SGMII_LINK[1]), // input OK : Core should operate at either 10Mbps or 100Mbps speeds
.speed_is_100 (SGMII_LINK[0]), // input OK : Core should operate at 100Mbps speed
// General IO’s
//-------------
// status vector
// [15:14] : Pause
// [13] : Remote Fault
// [12] : Duplex mode(1:Full, 0:Half)
// [11:10] : Speed(11:Reserved, 10:1000Mb/s, 01:100Mb/s, 00:10Mb/s)
// [ 9: 8] : Remote Fault Encoding
// [ 7] : PHY Link Status (SGMII mode only)
// [ 6] : RXNOTINTABLE
// [ 5] : RXDISPERR
// [ 4] : RUDI(INVALID)
// [ 3] : RUDI(/I/)
// [ 2] : RUDI(/C/)
// [ 1] : Link Synchronization
// [ 0] : Link Status
.status_vector (STATUS_VECTOR[15:0]), // output : [15:0] Core status.
.reset (RESET_IN), // input : Asynchronous reset for entire core
.signal_detect (1’b1), // input : Input from PMD to indicate presence of optical input.
.gt0_pll0lock_out (),
.gt0_pll0outclk_out (),
.gt0_pll0outrefclk_out (),
.gt0_pll0refclklost_out (),
.gt0_pll1outclk_out (),
.gt0_pll1outrefclk_out ()
);
assign LINKSpeed[1:0] = STATUS_VECTOR[11:10];
assign SGMII_LINK[1:0] = (
((LINKSpeed[1:0]==2’b10)? 2’b00: 2’b00)|
((LINKSpeed[1:0]==2’b01)? 2’b11: 2’b00)|
((LINKSpeed[1:0]==2’b00)? 2’b10: 2’b00)
);
上記ラッパー内部のコードを参考にして、an_adv_config_vector=16’h0020に、configuration_vector=5’b10000にセットして接続を試みましたが、status vectorのbit1(Link Synchronization)が点滅するのみでした。configuration_vector=5’b00000に設定してAuto-NegotiationをDisableにすると、status vectorのbit0,1,3が点灯するようになりました(オシロで見ると実際は数十msごとに数msリンクステータスがLoになっていました)。この時、Speedのステータスは1000Mb/sになっていましたが、DuplexModeは0でHalf Duplexの表示になっています。この状態でもPingは通りません。
ネットワークの設定値を確認するために、WRAP_SiTCP_GMII_XC7A_32K.VのモジュールからDEFAULT_IP_ADDRとTCP_SERVER_MACを外部に出力してレジスタで読み出してみたところ、IPアドレスはデフォルトの192.168.10.16が読み出されたのですが、MACアドレスは00-00-00-00-00-00でした。FORCE_DEFAULTn=0に設定しています。これは正しい状態でしょうか?
FORCE_DEFAULTn=0でMACアドレスが00-00-00-00-00-00はありえません。
リセット解除時にFORCE_DEFAULTn=1であったと思われます。
FORCE_DEFAULTnは、SiTCPのリセット(RST)の解除した一定時間後にサンプルされます。
後から0に変えても効果はありません。
FORCE_DEFAULTnはディップスイッチにつながっていて、これを1にして立ち上げるとEEPROMのアクセスが始まり、MACアドレスのレジスタを読み出すとFF-FF-FF-FF-FF-FFが読み出されます(EEPROMの中身が全てFFなので)。ただし数秒おきにEEPROMのアクセスがあり、SiTCPが再起動しているように見えます(読み出したデータが不正のため?)。FORCE_DEFAULTn=0の時とは明らかに動作が異なるので、FORCE_DEFAULTnの信号は設定できているように思います。
現状ではSiTCPのライブラリとして御社サイトからダウンロードしたSiTCP_Netlist_for_Artix7-master/SiTCP_XC7A_32K_BBT_V110.ngcを使用していますが、これはAC701用のSFPサンプルコード内のSiTCP_XC7A_32K_BBT_V110.ngcと全く同じものでしょうか?
SiTCP_XC7A_32K_BBT_V110.ngcは同じものです。
MACアドレスが00-00-00-00-00-00はSiTCPがリセットされていないのかもしれません。
はじめにRSTを1にしてください。
RSTは1から0に変化させています。CLK(200MHz)が入力されてから約1秒ほど後にRSTを0にして解除しています。考慮すべきリセット信号の条件などありますでしょうか。PHY(gig_ethernet_pcs_pma)のリセット解除との順番などは特に規定はないでしょうか。
FORCE_DEFAULTn=1の時はEEPROMへのアクセスが開始されるので、リセットは解除されていると思うのですが、この時にSiTCPからのGMII_RSTn、SiTCP_RSTをモニタすると数秒おきにリセット信号が出力されています。現状書き換えができておらずEEPROMの中身が全てFFでデータの整合が取れないため、リブートするという認識で正しいでしょうか。
またこの時にMACアドレスを読み出してみるとリセット時=全部0、リセット解除時=全部Fになりました。一方でIPアドレスの方はリセット時=0xC0A80A10(192.168.10.16)でリセット解除時=全部Fとなりました。リセット解除時の動作としてはROMの中身が反映されているように見えるのでよさそうですが、リセット時はMACとIPで少し様子が違います。FORCE_DEFAULTn=0の時にこのあたりのロジックがうまく動いていないということはないでしょうか。
CLK,RST,FORCE_DEFAULTnの信号でMACの出力は決まりそうですし、特に速度が厳しいようなロジックでもないのでMACがうまく出力されない理由がちょっとわかりません。
お手数をおかけしますがよろしくお願いします。
RSTはシステムクロックで数クロックで十分です。
FORCE_DEFAULTn=1でEEPROMにライセンスが入っていない場合、リセットを繰り返します。
FORCE_DEFAULTn=1の場合、MACアドレスの値がEEPROMの状態に応じて変わります。
MACアドレスの初期値は、リリースされている「SiTCP_XC7A_32K_BBT_V110.ngc」を
再度実機で確認しましたが、02-00-C0-A8-00-10です。
SiTCPから出力されるMACアドレスも異常ですがgig_ethernet_pcs_pmaもAuto-Negができない、Linkが安定しないなど
FPGAの動作が不安定な可能性があります。FPGAの電源などの回路的問題がないかも確認してください。
MACアドレスは、MY_MAC_ADDRですが、TCP_SERVER_MACを見ていませんか?
TCP_SERVER_MACの初期値は00-00-00-00-00-00で正常です。
MY_MAC_ADDRは正しいアドレスが出力されていました。
何が原因なのかよくわからなくなり、SFP光モジュールの送受信ポートを1本のファイバーで直結してループバックのパスを作り、GMIIのTXポートからデータを送信してRXポートに戻ってくるデータを確認するようなロジックを作って様子を見たところ、プリアンブルのパターンがビット反転しており、回路を確認すると基板上で受信側のRXPとRXN信号が逆に接続されていました。改修した結果Pingが通るようになりました。オートネゴシエーションをOFFにしていると、間違った接続でもSYNC,LINKランプが点灯したりするので、物理層は動いているのかと勘違いしてました。こちらの凡ミスでお騒がせしました。