| `default_nettype none | 
 |  | 
 | `define CLKFBOUT_MULT 2 | 
 |  | 
 | // ============================================================================ | 
 |  | 
 | module top | 
 | ( | 
 | input  wire clk, | 
 |  | 
 | input  wire rst, | 
 |  | 
 | input  wire [7:0] sw, | 
 | output wire [9:0] led, | 
 |  | 
 | inout wire io | 
 | ); | 
 |  | 
 | localparam DATA_WIDTH = `DATA_WIDTH_DEFINE; | 
 | localparam DATA_RATE =  `DATA_RATE_DEFINE; | 
 |  | 
 | // ============================================================================ | 
 | // Clock & reset | 
 | reg [3:0] rst_sr; | 
 |  | 
 | initial rst_sr <= 4'hF; | 
 |  | 
 | wire CLK; | 
 |  | 
 | BUFG bufg(.I(clk), .O(CLK)); | 
 |  | 
 | always @(posedge CLK) | 
 |     if (rst) | 
 |         rst_sr <= 4'hF; | 
 |     else | 
 |         rst_sr <= rst_sr >> 1; | 
 |  | 
 | wire RST = rst_sr[0]; | 
 |  | 
 | // ============================================================================ | 
 | // Clocks for ISERDES | 
 |  | 
 | wire PRE_BUFG_SYSCLK; | 
 | wire PRE_BUFG_CLKDIV; | 
 |  | 
 | wire SYSCLK; | 
 | wire CLKDIV; | 
 |  | 
 | wire O_LOCKED; | 
 |  | 
 | wire clk_fb_i; | 
 | wire clk_fb_o; | 
 |  | 
 | localparam DIVIDE_RATE = DATA_RATE == "SDR" ? DATA_WIDTH : DATA_WIDTH / 2; | 
 |  | 
 | PLLE2_ADV #( | 
 | .BANDWIDTH          ("HIGH"), | 
 | .COMPENSATION       ("ZHOLD"), | 
 |  | 
 | .CLKIN1_PERIOD      (10.0),  // 100MHz | 
 |  | 
 | .CLKFBOUT_MULT      (`CLKFBOUT_MULT), | 
 | .CLKOUT0_DIVIDE     (`CLKFBOUT_MULT * 4), // SYSCLK, 25MHz | 
 | .CLKOUT1_DIVIDE     ((`CLKFBOUT_MULT * 4) * DIVIDE_RATE), // CLKDIV, 25MHz / DIVIDE RATE | 
 |  | 
 | .STARTUP_WAIT       ("FALSE"), | 
 |  | 
 | .DIVCLK_DIVIDE      (1'd1) | 
 | ) | 
 | pll | 
 | ( | 
 | .CLKIN1     (CLK), | 
 | .CLKINSEL   (1), | 
 |  | 
 | .RST        (RST), | 
 | .PWRDWN     (0), | 
 | .LOCKED     (O_LOCKED), | 
 |  | 
 | .CLKFBIN    (clk_fb_i), | 
 | .CLKFBOUT   (clk_fb_o), | 
 |  | 
 | .CLKOUT0    (PRE_BUFG_SYSCLK), | 
 | .CLKOUT1    (PRE_BUFG_CLKDIV) | 
 | ); | 
 |  | 
 | BUFG bufg_clk(.I(PRE_BUFG_SYSCLK), .O(SYSCLK)); | 
 | BUFG bufg_clkdiv(.I(PRE_BUFG_CLKDIV), .O(CLKDIV)); | 
 |  | 
 | // ============================================================================ | 
 | // Test uints | 
 | wire [7:0] OUTPUTS; | 
 |  | 
 | wire [7:0] INPUTS = sw[7:0]; | 
 |  | 
 | localparam MASK = DATA_WIDTH == 2 ? 8'b00000011 : | 
 |                   DATA_WIDTH == 3 ? 8'b00000111 : | 
 |                   DATA_WIDTH == 4 ? 8'b00001111 : | 
 |                   DATA_WIDTH == 5 ? 8'b00011111 : | 
 |                   DATA_WIDTH == 6 ? 8'b00111111 : | 
 |                   DATA_WIDTH == 7 ? 8'b01111111 : | 
 |                 /*DATA_WIDTH == 8*/ 8'b11111111; | 
 |  | 
 | wire [7:0] MASKED_INPUTS = INPUTS & MASK; | 
 |  | 
 | wire I_DAT; | 
 | wire O_DAT; | 
 | wire T_DAT; | 
 |  | 
 | IOBUF iobuf(.I(O_DAT), .O(I_DAT), .T(T_DAT), .IO(io)); | 
 |  | 
 | serdes_test # | 
 | ( | 
 | .DATA_WIDTH   (DATA_WIDTH), | 
 | .DATA_RATE    (DATA_RATE) | 
 | ) | 
 | serdes_test | 
 | ( | 
 | .SYSCLK     (SYSCLK), | 
 | .CLKDIV     (CLKDIV), | 
 | .RST        (RST), | 
 |  | 
 | .OUTPUTS    (OUTPUTS), | 
 | .INPUTS     (MASKED_INPUTS), | 
 |  | 
 | .I_DAT      (I_DAT), | 
 | .O_DAT      (O_DAT), | 
 | .T_DAT      (T_DAT) | 
 | ); | 
 |  | 
 | wire [7:0] MASKED_OUTPUTS = OUTPUTS & MASK; | 
 |  | 
 | // ============================================================================ | 
 | // I/O connections | 
 |  | 
 | reg [23:0] heartbeat_cnt; | 
 |  | 
 | always @(posedge SYSCLK) | 
 |     heartbeat_cnt <= heartbeat_cnt + 1; | 
 |  | 
 |  | 
 | assign led[0] = heartbeat_cnt[22]; | 
 | assign led[8:1] = MASKED_OUTPUTS; | 
 |  | 
 | endmodule |