Xilinx KU系列三速以太网IP核RGMII时序约束方法

1. 概述
基于rgmii时序广泛应用于以太网通信中,基于xilinx的三速以太网时序分析,不同的xilinx系列方法不一样。当使用2路以上以太网通信,ku系列fpga的mac核需要进行修改,以支持2路以太网和满足时序要求。以下笔者对修改的部分进行说明,希望对广大开发者有所帮助,如果有不对的地方欢迎指针。
2. 代码修改
主要针对以上三个文件修改,详细的可以打开我们的配套工程阅读代码,下图是第一个以太网的三个文件
tri_mode_ethernet_mac_1_rgmii_v2_0_if.v文件关键部分修改如下:
发送部分odelay3的代码修改,原来默认的代码对于rgmii_tx发送时序调整是通过级联一个idelay3模块来实现,这里注释掉级联的idelay3模块,默认为 time模式最大是1ns延迟调整,修改odelay3模块的delay模式为count模式,这样每调整1个tap代表了0.005ns,最大可以调整512个tap,这样我们可以实现最大2ns以上的延迟调整
// instantiate the output delay primitive (delay output by 2 ns).  in order to   // achieve 2ns, an odelay is cascaded with an idelay from the bitslice   // immediately below it.  odelaye3 #(             .delay_value      (300),      .delay_format     (count),     // units of the delay_value (count, time)               .delay_type       (fixed),      //.cascade          (master),      .refclk_frequency (333.333),      .sim_device       (ultrascale)          )   delay_rgmii_tx_clk (      .odatain          (rgmii_txc_odelay),      .dataout          (rgmii_txc_obuf),      .clk              (1'b0),      .ce               (1'b0),      .inc              (1'b0),      .cntvaluein       (9'h0),      .cntvalueout      (),      .load             (1'b0),      .rst              (1'b0),      .casc_in          (1'b0),      .casc_return      (1'b0),      .casc_out         (),      .en_vtc           (1'b1)   );/* idelaye3 #(      .delay_value      (320),      .delay_type       (fixed),      .cascade          (slave_end),      .refclk_frequency (333.333),      .sim_device       (ultrascale_plus)         )  delay_rgmii_tx_clk_casc (      .idatain          (1'b0),      .dataout          (delay_rgmii_tx_clk_casc_return),      .datain           (1'b0),      .clk              (1'b0),      .ce               (1'b0),      .inc              (1'b0),      .cntvaluein       (9'h0),      .cntvalueout      (),      .load             (1'b0),      .rst              (1'b0),      .casc_in          (delay_rgmii_tx_clk_casc_out),      .casc_return      (1'b0),      .casc_out         (),      .en_vtc           (1'b1)  );*/      //---------------------------------------------------------------------------   // rgmii transmitter logic :   // drive tx signals through iobs onto rgmii interface   //---------------------------------------------------------------------------    // encode rgmii ctl signal   assign rgmii_tx_ctl_int = tx_en_from_mac ^ tx_er_from_mac;    // instantiate double data rate output components. then   // put data and control signals through odelay components to   // provide similiar net delays to those seen on the clk signal.    assign gmii_txd_falling = txd_from_mac[7:4];    genvar i;   generate for (i=0; i<4; i=i+1)     begin : txdata_out_bus       oddre1 #(                   .srval         (1'b0)       )       rgmii_txd_out (          .q             (rgmii_txd_odelay[i]),          .c             (tx_clk),          .d1            (txd_from_mac[i]),          .d2            (gmii_txd_falling[i]),          .sr            (tx_reset)       );       odelaye3 #(          .delay_value      (0),          .delay_type       (fixed),          .refclk_frequency (333.333),      .sim_device       (ultrascale)              )       delay_rgmii_txd (          .odatain       (rgmii_txd_odelay[i]),          .dataout       (rgmii_txd_obuf[i]),          .clk           (1'b0),          .ce            (1'b0),          .inc           (1'b0),          .cntvaluein    (9'h0),          .cntvalueout   (),          .load          (1'b0),          .rst           (1'b0),          .casc_in       (1'b0),          .casc_return   (1'b0),          .casc_out      (),          .en_vtc        (1'b1)       );      end   endgenerate  
同理,接收部分idelay3的代码修改,原来默认为 time模式最大是1ns延迟调整,修改idelay3模块的delay模式为count模式,这样每调整1个tap代表了0.005ns,最大可以调整512个tap,这样我们可以实现最大2ns以上的延迟调整
idelaye3 #(      .delay_format     (count),     // units of the delay_value (count, time)      .delay_type       (fixed),      .refclk_frequency (333.333),      .delay_value      (330),           // input delay value setting      .sim_device    (ultrascale)   )   delay_rgmii_rx_ctl (      .idatain       (rgmii_rx_ctl_ibuf),      .dataout       (rgmii_rx_ctl_delay),      .datain        (1'b0),      .clk           (1'b0),      .ce            (1'b0),      .inc           (1'b0),      .cntvaluein    (9'h0),      .cntvalueout   (),      .load          (1'b0),      .rst           (1'b0),      .casc_in       (1'b0),      .casc_return   (1'b0),      .casc_out      (),      .en_vtc        (1'b1)      );   genvar j;   generate for (j=0; j<4; j=j+1)     begin : rxdata_bus       idelaye3 #(       .delay_format     (count),     // units of the delay_value (count, time)                  .delay_type       (fixed),          .refclk_frequency (333.333),          .delay_value      (330),           // input delay value setting          .sim_device    (ultrascale)       )       delay_rgmii_rxd (          .idatain       (rgmii_rxd_ibuf[j]),          .dataout       (rgmii_rxd_delay[j]),          .datain        (1'b0),          .clk           (1'b0),          .ce            (1'b0),          .inc           (1'b0),          .cntvaluein    (9'h0),          .cntvalueout   (),          .load          (1'b0),          .rst           (1'b0),          .casc_in       (1'b0),          .casc_return   (1'b0),          .casc_out      (),          .en_vtc        (1'b1)       );     end   endgenerate  
下图是第二个以太网的三个文件,由于需要贡献一部分fpga的delay_ctr资源,他们的代码稍微有点差异。
修改方法和第一个以太网修改方法一样
odelaye3 #(      .delay_value      (300),      .delay_format     (count),     // units of the delay_value (count, time)        .delay_type       (fixed),      //.cascade          (master),      .refclk_frequency (333.333),      .sim_device       (ultrascale)   )   delay_rgmii_tx_clk (      .odatain          (rgmii_txc_odelay),      .dataout          (rgmii_txc_obuf),      .clk              (1'b0),      .ce               (1'b0),      .inc              (1'b0),      .cntvaluein       (9'h0),      .cntvalueout      (),      .load             (1'b0),      .rst              (1'b0),      .casc_in          (1'b0),      .casc_return      (1'b0),      .casc_out         (),      .en_vtc           (1'b1)   );/*idelaye3 #(      .delay_value      (320),      .delay_type       (fixed),      .cascade          (slave_end),      .refclk_frequency (333.333),      .sim_device       (ultrascale_plus)  )  delay_rgmii_tx_clk_casc (      .idatain          (1'b0),      .dataout          (delay_rgmii_tx_clk_casc_return),      .datain           (1'b0),      .clk              (1'b0),      .ce               (1'b0),      .inc              (1'b0),      .cntvaluein       (9'h0),      .cntvalueout      (),      .load             (1'b0),      .rst              (1'b0),      .casc_in          (delay_rgmii_tx_clk_casc_out),      .casc_return      (1'b0),      .casc_out         (),      .en_vtc           (1'b1)  );*/   //---------------------------------------------------------------------------   // rgmii transmitter logic :   // drive tx signals through iobs onto rgmii interface   //---------------------------------------------------------------------------   // encode rgmii ctl signal   assign rgmii_tx_ctl_int = tx_en_from_mac ^ tx_er_from_mac;   // instantiate double data rate output components. then   // put data and control signals through odelay components to   // provide similiar net delays to those seen on the clk signal.   assign gmii_txd_falling = txd_from_mac[7:4];   genvar i;   generate for (i=0; i<4; i=i+1)     begin : txdata_out_bus       oddre1 #(          .srval         (1'b0)       )       rgmii_txd_out (          .q             (rgmii_txd_odelay),          .c             (tx_clk),          .d1            (txd_from_mac),          .d2            (gmii_txd_falling),          .sr            (tx_reset)       );      odelaye3 #(          .delay_value      (0),          .delay_type       (fixed),          .refclk_frequency (333.333),      .sim_device       (ultrascale)       )       delay_rgmii_txd (          .odatain       (rgmii_txd_odelay),          .dataout       (rgmii_txd_obuf),          .clk           (1'b0),          .ce            (1'b0),          .inc           (1'b0),          .cntvaluein    (9'h0),          .cntvalueout   (),          .load          (1'b0),          .rst           (1'b0),          .casc_in       (1'b0),          .casc_return   (1'b0),          .casc_out      (),          .en_vtc        (1'b1)       );     end   endgenerate  
接收部分
idelaye3 #(      .delay_format     (count),      .delay_type       (fixed),      .refclk_frequency (333.333),      .delay_value      (250),           // input delay value setting                    .sim_device    (ultrascale)   )   delay_rgmii_rx_ctl (      .idatain       (rgmii_rx_ctl_ibuf),      .dataout       (rgmii_rx_ctl_delay),      .datain        (1'b0),      .clk           (1'b0),      .ce            (1'b0),      .inc           (1'b0),      .cntvaluein    (9'h0),      .cntvalueout   (),      .load          (1'b0),      .rst           (1'b0),      .casc_in       (1'b0),      .casc_return   (1'b0),      .casc_out      (),      .en_vtc        (1'b1)      );   genvar j;   generate for (j=0; j<4; j=j+1)     begin : rxdata_bus       idelaye3 #(          .delay_format     (count),          .delay_type       (fixed),          .refclk_frequency (333.333),          .delay_value      (250),           // input delay value setting                        .sim_device    (ultrascale)       )       delay_rgmii_rxd (          .idatain       (rgmii_rxd_ibuf[j]),          .dataout       (rgmii_rxd_delay[j]),          .datain        (1'b0),          .clk           (1'b0),          .ce            (1'b0),          .inc           (1'b0),          .cntvaluein    (9'h0),          .cntvalueout   (),          .load          (1'b0),          .rst           (1'b0),          .casc_in       (1'b0),          .casc_return   (1'b0),          .casc_out      (),          .en_vtc        (1'b1)       );     end   endgenerate  
以上也能看出第二个以太网和第一个以太网的时序调整有所差异。
3. 约束文件修改
由于我们在tri_mode_ethernet_mac_1_rgmii_v2_0_if.v中完成了时序的调整,因此需要注释以下约束
时序约束部分修改和硬件上phy的delay延迟设置有关系,米联客的fpga的phy以太网芯片rx 有2ns延迟,tx没有2ns延迟。因此rgmii_rx数据是源同步中心对齐方式分析,而rgmii_tx数据是源源步边沿对齐方式分析,米联客使用的是rtl8211fd芯片,关键的时序参数如下:
因此给出如下时序约束:
############################################################# rx clock period constraints (per instance)               ############################################################## receiver clock period constraints: please do not relaxset rx_clk [get_clocks -of [get_ports rgmii_rxc]]############################################################# obtain input clocks from top level xdc                         #############################################################set ip_gtx_clk     [get_clocks -of_objects [get_ports gtx_clk]]#####################################################block constraints############################################################# for setup and hold time analysis on rgmii inputs         ############################################################## define a virtual clock to simplify the timing constraintscreate_clock -name [current_instance .]_rgmii_rx_clk -period 8set rgmii_rx_clk [current_instance .]_rgmii_rx_clk# identify rgmii rx pads only.  # this prevents setup/hold analysis being performed on false inputs,# eg, the configuration_vector inputs.set_input_delay -clock [get_clocks $rgmii_rx_clk] -max -1.5 [get_ports {rgmii_rxdrgmii_rx_ctl}]set_input_delay -clock [get_clocks $rgmii_rx_clk] -min -2.5 [get_ports {rgmii_rxdrgmii_rx_ctl}]set_input_delay -clock [get_clocks $rgmii_rx_clk] -clock_fall -max -1.5 -add_delay[get_ports {rgmii_rxdrgmii_rx_ctl}]set_input_delay -clock [get_clocks $rgmii_rx_clk] -clock_fall -min -2.5 -add_delay[get_ports {rgmii_rxdrgmii_rx_ctl}]set_false_path -rise_from [get_clocks $rgmii_rx_clk] -fall_to $rx_clk -setupset_false_path -fall_from [get_clocks $rgmii_rx_clk] -rise_to $rx_clk -setupset_false_path -rise_from [get_clocks $rgmii_rx_clk] -rise_to $rx_clk -holdset_false_path -fall_from [get_clocks $rgmii_rx_clk] -fall_to $rx_clk -holdset_multicycle_path -from [get_clocks $rgmii_rx_clk] -to $rx_clk -setup 0set_multicycle_path -from [get_clocks $rgmii_rx_clk] -to $rx_clk -hold -1############################################################# for setup and hold time analysis on rgmii outputs        #############################################################create_generated_clock -name [current_instance .]_rgmii_tx_clk -divide_by 1 -source[get_pins {tri_mode_ethernet_mac_i/rgmii_interface/rgmii_txc_ddr/c}] [get_ports rgmii_txc]set rgmii_tx_clk [current_instance .]_rgmii_tx_clkset_output_delay -0.5 -max -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txdrgmii_tx_ctl}]set_output_delay -1.2 -min -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txdrgmii_tx_ctl}]set_output_delay -0.5 -max -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txdrgmii_tx_ctl}] -clock_fall -add_delayset_output_delay -1.2 -min -clock [get_clocks $rgmii_tx_clk] [get_ports {rgmii_txdrgmii_tx_ctl}] -clock_fall -add_delayset_false_path -rise_from $ip_gtx_clk -fall_to [get_clocks $rgmii_tx_clk] -setupset_false_path -fall_from $ip_gtx_clk -rise_to [get_clocks $rgmii_tx_clk] -setupset_false_path -rise_from $ip_gtx_clk -rise_to [get_clocks $rgmii_tx_clk] -holdset_false_path -fall_from $ip_gtx_clk -fall_to [get_clocks $rgmii_tx_clk] -holdset_multicycle_path -from $ip_gtx_clk -to [get_clocks $rgmii_tx_clk] 0 -setupset_multicycle_path -from $ip_gtx_clk -to [get_clocks $rgmii_tx_clk] -1 -hold  
这里时序分析是比较难理解的部分,尤其是根据datasheet分析时序要求,更多的关于时序相关的内容,请看米联客时序课程相关内容。


华为Mate 9保时捷版开箱谍照:简直帅到颜值炸裂
工业自动化领域如何降低机器人风险
热水器泄压阀安装位置_热水器泄压阀一直流水
热保护器和温控器的区别
虚拟网络流量的采集与分析有什么作用?应该怎么做?
Xilinx KU系列三速以太网IP核RGMII时序约束方法
调频发射又一新招
Bebop无人机目标跟踪与运动控制环境搭建
基于R&S的矢量源和信号分析仪构建无线系统仿真平台的方案
紫光展锐CEO楚庆表示未来的趋势将是5G+AI并举
ADC前端运算放大器及RC滤波器设计案例
一篇讲述北极熊栖息地变化的可视化作品
开关电源专业术语汇总
WiMax芯片厂商开始关注LTE的兴起
隐私和代币安全性如何来保证
7纳米的A12处理器对比高通骁龙845 GPU提升近40%
管理系统将是促进企业能源管理的一个重要手段
世界各国加快布局,硬科技各领域发展呈现新趋势
dfrobot迷你2自由度云台简介
光伏赛道再度引爆 利尔达联合ST亮相广州光伏展