【SelectIO】bitslice原语学习记录

news2025/2/23 11:18:19
  • 基本概念

  在Ultrascale (plus)系列上的FPGA中,Xilinx引入了bitslice硬核,它取代了7系列上的IDELAYCTRL/IODELAY/IOSERDES/IODDR系列硬核,用于为HP(High Performance)类型Bank上的IO接口提供串并转化、信号延时、三态控制等功能。Xilinx为bitslice硬核提供了TXRX_BITSLICE/TX_BITSLICE/RX_BITSLICE/BITSLICE_CONTROL/TX_BITSLICE_TRI/RIU_OR这些与bitslice硬核接口一致的原生原语便于用户直接调用例化。同时为了提供向前兼容性,IDELAYCTRL/IODELAY/IOSERDES/IODDR系列原语作为组件原语仍能继续使用,在综合时会被软件综合为bitslice。
  使用bitslice原生原语的优势在于其能够对位于一个字节组上的接口进行批量控制,这对于存储控制器(如DDR)的接口信号时序的优化十分有效。此外bitslice在接收侧增加了一个异步FIFO,便于用户逻辑通过用户时钟读取数据。

在Vivado的综合/实现设计界面,选择package pin选项卡能够看到每个HP bank中字节组的使用情况及相应接口的特殊功能(DBC,QBC,GC)。

下面两张图展示了一个HP bank的引脚情况,大多数bank均具有52个输入输出引脚,对应52个引脚缓冲(IOB),分为四个字节组(每个字节组具有13个IOB),每个字节组又分为两个半字节组(高半字节组、低半字节组),高半字节组具有7个IOB,低半字节组具有6个IOB。每个半字节的最低2位可作为半字节组数据捕获时钟,在需要时能够对同一半字节组的其他引脚的数据进行采样。此外一些具有特殊功能的引脚也能作为数据捕获时钟使用:DBC引脚,能够作为同一字节组的数据捕获时钟进行采样;QBC引脚,能够作为整个bank的数据捕获时钟进行采样;GC引脚,能够作为bank中MMCM/PLL的输入时钟,进而为用户逻辑提供用户时钟。
2-1

在这里插入图片描述
HP Bank每个输入输出引脚经过对应的输入输出引脚缓冲后连接到对应的一个TXRX_BITSLICE硬核上,每个半字节组的TXRX_BITSLICE由同一个TX_BITSLICE_TRI和BITSLICE_CONTROL控制,TX_BITSLICE_TRI可视作一个仅向其他TX_BITSLICE三态输出接口输出的特殊TX_BITSLICE,也受BITSLICE_CONTROL的控制。此外每个BITSLICE_CONTROL均具有RIU(寄存器接口单元)接口,能够通过类似ram读写的方式控制BITSLICE_CONTROL中的属性(复位、延时、时钟等),进而间接控制TXRX_BITSLICE。同时,Ultrascale系列提供了RIU_OR硬核能够通过地址划分的方式对位于同一字节组的两个BITSLICE_CONTROL进行统一控制。

下图展示了RXTX_BITSLICE的逻辑结构,它可分为下半部分的接收逻辑(RX_BITSLICE)和上半部分的发送逻辑(TX_BITSLICE)。在端口只用于接收或发送的单一用途时,TXRX_BITSLICE可进一步替换为RX_BITSLICE或TX_BITSLICE。在这种情况下,RX_BITSLICE可以借用TX_BITSLICE中的延时线从而实现更长时间的延时。
在这里插入图片描述

  • 注意事项

  1. 使用bitslice需要注意复位顺序,在初始化未完成前功能可能有误。
  2. MMCM与PLL的输入时钟、反馈时钟和输出时钟存在范围限制需要考虑。PLL的VCO在750-1500MHz
  3. 多个pll输出时钟相位对齐需要保证输入时钟相同,且不能进行DIV,即CLKOUT_DIV=1
  • 调用示例

这里举例说明了bitslice的复位过程,同时利用bitslice进行了简单的发送和接收过程,已通过仿真和实现。

  • dut_top_tb.v
`timescale 1ns / 1ps
//
// Company: 
// Engineer: wjh776a68
// 
// Create Date: 01/27/2024 10:38:55 PM
// Design Name: 
// Module Name: dut_top_tb
// Project Name: 
// Target Devices: xcvu37p
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module dut_top_tb(

    );
    
    wire           dm_dbi_n;
    wire   [7:0]   dq;
    wire           dqs_t;
    wire           dqs_c;
    logic clk_n, clk_p;
    assign clk_n = ~clk_p;
    
    initial begin
        clk_p = 0;
        forever #5 clk_p = ~clk_p;
    end
    
    initial begin
        repeat(4) @(posedge dqs_t);
        #100;
        force dqs_t = 0;
        force dqs_c = 1;
//        #100;
        #(0.75 / 2);
        force dqs_t = 1;
        force dqs_c = 0;
        force dm_dbi_n = 1;
        force dq = 8'b00010110;
        #(0.75 / 2);
        force dqs_t = 0;
        force dqs_c = 1;
        force dm_dbi_n = 0;
        force dq = 8'b00000000;
        #(0.75 / 2);
        force dqs_t = 1;
        force dqs_c = 0;
        force dm_dbi_n = 1;
        force dq = 8'b00010110;
        #(0.75 / 2);
        force dqs_t = 0;
        force dqs_c = 1;
        force dm_dbi_n = 0;
        force dq = 8'b00000000;
        #(0.75 / 2);
        force dqs_t = 1;
        force dqs_c = 0;
        force dm_dbi_n = 1;
        force dq = 8'b00010110;
        #(0.75 / 2);
        force dqs_t = 0;
        force dqs_c = 1;
        force dm_dbi_n = 0;
        force dq = 8'b00000000;
        #(0.75 / 2);
        force dqs_t = 1;
        force dqs_c = 0;
        force dm_dbi_n = 1;
        force dq = 8'b00010110;
        
        #(0.75 / 2);
        force dqs_t = 0;
        force dqs_c = 1;
        force dm_dbi_n = 0;
        force dq = 8'b00000000;
        #(0.75 / 2);
        force dqs_t = 0;
        force dqs_c = 1;
        force dm_dbi_n = 0;
        force dq = 8'b00000000;
        #(0.75 / 2);
//        force dqs_t = 0;
//        force dqs_c = 1;
//        #(0.75 / 2);
//        #100;
        release dqs_t;
        release dqs_c;
        release dm_dbi_n;
        release dq;
    end
    
    dut_top dut_top_inst(
        clk_n,
        clk_p,
    
        dm_dbi_n,
        dq,
        dqs_t,
        dqs_c
    );
endmodule
  • dut_top.v
`timescale 1ns / 1ps
//
// Company: 
// Engineer: wjh776a68
// 
// Create Date: 01/25/2024 05:20:05 PM
// Design Name: 
// Module Name: dut_top
// Project Name: 
// Target Devices: xcvu37p
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module dut_top(
    input clk_n,
    input clk_p,        // 100MHz

    inout          dm_dbi_n,
    inout  [7:0]   dq,
    inout          dqs_t,
    inout          dqs_c
);
    wire clk_I; // 100MHz
    wire mmcm_clk_I, mmcm_clk_o_I; // 100MHz
    wire mmcm_clk_locked;
    wire pll_clk_I; // 1333.333MHz
    wire pll_clk_locked;
    wire pll_clkfbout;
    reg pll_phyclk_en = 1'b0;
    wire usr_clk_p, usr_clk_n; // 333.333MHz
    wire riu_clk_p, riu_clk_n; // 250MHz
    reg clk_rst = 1;//, mmcm_clk_rst = 1, pll_clk_rst = 1;
    (* srl_style = "srl_reg" *) reg [31:0] clk_rst_slr32 = {32{1'b1}};
    (* srl_style = "srl_reg" *) reg [31:0] pll_clk_rst_slr32 = {32{1'b1}};
    wire mmcm_clk_rst = clk_rst_slr32[31];
    wire pll_clk_rst = pll_clk_rst_slr32[31];
    
    wire itf_rst_done; // byte initialization finish
    
    always @(posedge clk_I) begin
       clk_rst_slr32 <= {clk_rst_slr32[30:0], clk_rst}; 
       clk_rst <= 1'b0;
    end
    
    always @(posedge clk_I) begin
        if (mmcm_clk_locked) begin
//            pll_clk_rst <= 1'b0;
            pll_clk_rst_slr32 <= {pll_clk_rst_slr32[30:0], 1'b0}; 
        end else begin
//            pll_clk_rst <= 1'b1;
            pll_clk_rst_slr32 <= {32{1'b1}};
        end
       
    end
    

    IBUFDS IBUFDS_inst (
        .O(clk_I),   // 1-bit output: Buffer output
        .I(clk_p),   // 1-bit input: Diff_p buffer input (connect directly to top-level port)
        .IB(clk_n)  // 1-bit input: Diff_n buffer input (connect directly to top-level port)
    ); 

    MMCME4_BASE #(
        .BANDWIDTH("OPTIMIZED"),    // Jitter programming
        .CLKFBOUT_MULT_F(10.0),      // Multiply value for all CLKOUT
        .CLKFBOUT_PHASE(0.0),       // Phase offset in degrees of CLKFB
        .CLKIN1_PERIOD(10.0),        // Input clock period in ns to ps resolution (i.e., 33.333 is 30 MHz).
        .CLKOUT0_DIVIDE_F(2.0),     // Divide amount for CLKOUT0
        .CLKOUT0_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT0
        .CLKOUT0_PHASE(0.0),        // Phase offset for CLKOUT0
        .CLKOUT1_DIVIDE(1),         // Divide amount for CLKOUT (1-128)
        .CLKOUT1_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT outputs (0.001-0.999).
        .CLKOUT1_PHASE(0.0),        // Phase offset for CLKOUT outputs (-360.000-360.000).
        .CLKOUT2_DIVIDE(1),         // Divide amount for CLKOUT (1-128)
        .CLKOUT2_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT outputs (0.001-0.999).
        .CLKOUT2_PHASE(0.0),        // Phase offset for CLKOUT outputs (-360.000-360.000).
        .CLKOUT3_DIVIDE(1),         // Divide amount for CLKOUT (1-128)
        .CLKOUT3_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT outputs (0.001-0.999).
        .CLKOUT3_PHASE(0.0),        // Phase offset for CLKOUT outputs (-360.000-360.000).
        .CLKOUT4_CASCADE("FALSE"),  // Divide amount for CLKOUT (1-128)
        .CLKOUT4_DIVIDE(1),         // Divide amount for CLKOUT (1-128)
        .CLKOUT4_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT outputs (0.001-0.999).
        .CLKOUT4_PHASE(0.0),        // Phase offset for CLKOUT outputs (-360.000-360.000).
        .CLKOUT5_DIVIDE(1),         // Divide amount for CLKOUT (1-128)
        .CLKOUT5_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT outputs (0.001-0.999).
        .CLKOUT5_PHASE(0.0),        // Phase offset for CLKOUT outputs (-360.000-360.000).
        .CLKOUT6_DIVIDE(1),         // Divide amount for CLKOUT (1-128)
        .CLKOUT6_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT outputs (0.001-0.999).
        .CLKOUT6_PHASE(0.0),        // Phase offset for CLKOUT outputs (-360.000-360.000).
        .DIVCLK_DIVIDE(1),          // Master division value
        .IS_CLKFBIN_INVERTED(1'b0), // Optional inversion for CLKFBIN
        .IS_CLKIN1_INVERTED(1'b0),  // Optional inversion for CLKIN1
        .IS_PWRDWN_INVERTED(1'b0),  // Optional inversion for PWRDWN
        .IS_RST_INVERTED(1'b0),     // Optional inversion for RST
        .REF_JITTER1(0.0),          // Reference input jitter in UI (0.000-0.999).
        .STARTUP_WAIT("FALSE")      // Delays DONE until MMCM is locked
    )
    MMCME4_BASE_inst ( // 100MHz to 1000MHz(VCO) -> 500MHz
        .CLKFBOUT(),   // 1-bit output: Feedback clock pin to the MMCM
        .CLKFBOUTB(), // 1-bit output: Inverted CLKFBOUT
        .CLKOUT0(mmcm_clk_o_I),     // 1-bit output: CLKOUT0
        .CLKOUT0B(),   // 1-bit output: Inverted CLKOUT0
        .CLKOUT1(),     // 1-bit output: CLKOUT1
        .CLKOUT1B(),   // 1-bit output: Inverted CLKOUT1
        .CLKOUT2(),     // 1-bit output: CLKOUT2
        .CLKOUT2B(),   // 1-bit output: Inverted CLKOUT2
        .CLKOUT3(),     // 1-bit output: CLKOUT3
        .CLKOUT3B(),   // 1-bit output: Inverted CLKOUT3
        .CLKOUT4(),     // 1-bit output: CLKOUT4
        .CLKOUT5(),     // 1-bit output: CLKOUT5
        .CLKOUT6(),     // 1-bit output: CLKOUT6
        .LOCKED(mmcm_clk_locked),       // 1-bit output: LOCK
        .CLKFBIN(clk_I),     // 1-bit input: Feedback clock pin to the MMCM
        .CLKIN1(clk_I),       // 1-bit input: Primary clock
        .PWRDWN(1'b0),       // 1-bit input: Power-down
        .RST(mmcm_clk_rst)              // 1-bit input: Reset
    );  
    
    BUFGCE #(
        .CE_TYPE("SYNC"),               // ASYNC, HARDSYNC, SYNC
        .IS_CE_INVERTED(1'b0),          // Programmable inversion on CE
        .IS_I_INVERTED(1'b0),           // Programmable inversion on I
        .SIM_DEVICE("ULTRASCALE_PLUS")  // ULTRASCALE, ULTRASCALE_PLUS
    )
    BUFGCE_inst (
      .O(mmcm_clk_I),   // 1-bit output: Buffer
      .CE(mmcm_clk_locked), // 1-bit input: Buffer enable
      .I(mmcm_clk_o_I)    // 1-bit input: Buffer
    );

    PLLE4_BASE #(
        .CLKFBOUT_MULT(8),          // Multiply value for all CLKOUT
        .CLKFBOUT_PHASE(0.0),       // Phase offset in degrees of CLKFB
        .CLKIN_PERIOD(2.0),         // Input clock period in ns to ps resolution (i.e., 33.333 is 30 MHz).
        .CLKOUT0_DIVIDE(4),         // Divide amount for CLKOUT0
        .CLKOUT0_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT0
        .CLKOUT0_PHASE(0.0),        // Phase offset for CLKOUT0
        .CLKOUT1_DIVIDE(8),         // Divide amount for CLKOUT1
        .CLKOUT1_DUTY_CYCLE(0.5),   // Duty cycle for CLKOUT1
        .CLKOUT1_PHASE(0.0),        // Phase offset for CLKOUT1
        .CLKOUTPHY_MODE("VCO_2X"),  // Frequency of the CLKOUTPHY
        .DIVCLK_DIVIDE(3),          // Master division value
        .IS_CLKFBIN_INVERTED(1'b0), // Optional inversion for CLKFBIN
        .IS_CLKIN_INVERTED(1'b0),   // Optional inversion for CLKIN
        .IS_PWRDWN_INVERTED(1'b0),  // Optional inversion for PWRDWN
        .IS_RST_INVERTED(1'b0),     // Optional inversion for RST
        .REF_JITTER(0.0),           // Reference input jitter in UI
        .STARTUP_WAIT("FALSE")      // Delays DONE until PLL is locked
    )
    PLLE4_BASE_inst ( // 500MHz to 2666.6MHz (PHY) and 1333.3/4 MHz (usr_clk)
        .CLKFBOUT(pll_clkfbout),       // 1-bit output: Feedback clock
        .CLKOUT0(usr_clk_p),         // 1-bit output: General Clock output
        .CLKOUT0B(usr_clk_n),       // 1-bit output: Inverted CLKOUT0
        .CLKOUT1(riu_clk_p),         // 1-bit output: General Clock output 1333.333/8MHz user clock for riu clk(<260MHz)
        .CLKOUT1B(riu_clk_n),       // 1-bit output: Inverted CLKOUT1
        .CLKOUTPHY(pll_clk_I),     // 1-bit output: Bitslice clock
        .LOCKED(pll_clk_locked),           // 1-bit output: LOCK
        .CLKFBIN(pll_clkfbout),         // 1-bit input: Feedback clock
        .CLKIN(mmcm_clk_I),             // 1-bit input: Input clock
        .CLKOUTPHYEN(pll_phyclk_en), // 1-bit input: CLKOUTPHY enable
        .PWRDWN(1'b0),           // 1-bit input: Power-down
        .RST(pll_clk_rst)                  // 1-bit input: Reset
    );
    

    (* srl_style = "srl_reg" *) reg [63:0] pll_clk_rst_fin_slr64 = {64{1'b0}};
    wire pll_clk_rst_fin = pll_clk_rst_fin_slr64[63];
    always @(posedge mmcm_clk_I) begin
        if (pll_clk_locked) begin
            pll_clk_rst_fin_slr64[31:0]  <= {pll_clk_rst_fin_slr64[31 - 1 : 0],  1'b1};
            pll_clk_rst_fin_slr64[63:32] <= {pll_clk_rst_fin_slr64[63 - 1 : 32], pll_clk_rst_fin_slr64[31]};
        end else begin
            pll_clk_rst_fin_slr64[31:0]  <= {32{1'b0}};
            pll_clk_rst_fin_slr64[63:32] <= {32{1'b0}};
        end
    end

    logic          delay_rst = 0;
    logic          ctrl_rst = 0;
    
    always @(posedge mmcm_clk_I) begin
        if (pll_clk_rst_fin) begin
            pll_phyclk_en <= 1'b1;
        end else begin
            pll_phyclk_en <= 1'b0;
        end
    end

    always @(posedge mmcm_clk_I) begin
        if (pll_clk_locked) begin
            delay_rst <= 1'b0;
            ctrl_rst <= 1'b0;
        end else begin
            delay_rst <= 1'b1;
            ctrl_rst <= 1'b1;
        end
    end

    logic  [3:0]   lo_TRI_TBYTE_IN = 0;
    logic  [3:0]   hi_TRI_TBYTE_IN = 0;
    reg [3:0] lo_PHY_RDEN = 4'b0000, hi_PHY_RDEN = 4'b0000;

    logic  [7:0]   dm_dbi_n_o_I = 0;
    logic          dm_dbi_n_FIFO_EMPTY;
    logic          dm_dbi_n_FIFO_RD_CLK;
    logic          dm_dbi_n_FIFO_RD_EN = 0;
    logic  [7:0]   dq_o_I[7:0] = '{0, 0, 0, 0, 0, 0, 0, 0};
    logic          dq_FIFO_EMPTY[7:0];
    logic          dq_FIFO_RD_CLK[7:0];
    logic          dq_FIFO_RD_EN[7:0] = '{0, 0, 0, 0, 0, 0, 0, 0};
    logic  [7:0]   dqs_o_I = 0;
    logic          dqs_FIFO_EMPTY;
    logic          dqs_FIFO_RD_CLK;
    logic          dqs_FIFO_RD_EN = 0;

    logic  [7:0]   dm_dbi_n_i_I;
    logic  [7:0]   dq_i_I[7:0];
    logic  [7:0]   dqs_i_I;

    dut #(
        .CLK_FREQ(2666.666) // 4 * 333.333  * 2
    ) dut_inst (
        .pll_clk(pll_clk_I),
        .riu_clk(riu_clk_p),
        .delay_rst(delay_rst),
        .ctrl_rst(ctrl_rst),
        .itf_rst_done(itf_rst_done),

        .dm_dbi_n(dm_dbi_n),
        .dq(dq),
        .dqs_t(dqs_t),
        .dqs_c(dqs_c),

        .lo_TRI_TBYTE_IN(lo_TRI_TBYTE_IN),
        .hi_TRI_TBYTE_IN(hi_TRI_TBYTE_IN), 
        .lo_PHY_RDEN(lo_PHY_RDEN),
        .hi_PHY_RDEN(hi_PHY_RDEN),

        .dm_dbi_n_o_I(dm_dbi_n_o_I),
        .dm_dbi_n_FIFO_EMPTY(dm_dbi_n_FIFO_EMPTY),
        .dm_dbi_n_FIFO_RD_CLK(dm_dbi_n_FIFO_RD_CLK),
        .dm_dbi_n_FIFO_RD_EN(dm_dbi_n_FIFO_RD_EN),
        .dq_o_I(dq_o_I),
        .dq_FIFO_EMPTY(dq_FIFO_EMPTY),
        .dq_FIFO_RD_CLK(dq_FIFO_RD_CLK),
        .dq_FIFO_RD_EN(dq_FIFO_RD_EN),
        .dqs_o_I(dqs_o_I),
        .dqs_FIFO_EMPTY(dqs_FIFO_EMPTY),
        .dqs_FIFO_RD_CLK(dqs_FIFO_RD_CLK),
        .dqs_FIFO_RD_EN(dqs_FIFO_RD_EN),

        .dm_dbi_n_i_I(dm_dbi_n_i_I),
        .dq_i_I(dq_i_I),
        .dqs_i_I(dqs_i_I)
    );
    
    reg [5:0] cs = 0, ns;
    reg itf_rst_done_ff = 1'b0, itf_rst_done_ff2 = 1'b0;
    always @(posedge usr_clk_p) begin
        itf_rst_done_ff <= itf_rst_done;
        itf_rst_done_ff2 <= itf_rst_done_ff;
        
        if (~itf_rst_done_ff2) begin
            cs <= 0;
        end else begin
            cs <= ns;
        end
    end
    
    always @(*) begin
        case (cs)
        0: begin
            ns = 1;
        end
        1: begin
            ns = 2;
        end
        2: begin
            ns = 3;
        end
        3: begin
            ns = 4;
        end
        4: begin
            ns = 5;
        end
        5: begin
            ns = 6;
        end
        6: begin
            ns = 6;
        end   
        default: begin
            ns = 0;
        end
        endcase
    end
    
    always @(posedge usr_clk_p) begin // cdc
        case (ns)
        0, 1: begin
            lo_PHY_RDEN <= 4'b0000;
            hi_PHY_RDEN <= 4'b0000;
            lo_TRI_TBYTE_IN <= 4'b0000;
            hi_TRI_TBYTE_IN <= 4'b0000;
        end
        2: begin
            dqs_o_I   <= 8'b01010101;
            dq_o_I[0] <= 8'b01010101;
            dq_o_I[1] <= 8'b01010101;
            dq_o_I[2] <= 8'b01010101;
            dq_o_I[3] <= 8'b01010101;
            dq_o_I[4] <= 8'b01010101;
            dq_o_I[5] <= 8'b01010101;
            dq_o_I[6] <= 8'b01010101;
            dq_o_I[7] <= 8'b01010101;
            dm_dbi_n_o_I <= 8'b00000000;
            lo_TRI_TBYTE_IN <= 4'b1111;
            hi_TRI_TBYTE_IN <= 4'b1111;
        end
        3: begin
            lo_PHY_RDEN <= 4'b1111;
            hi_PHY_RDEN <= 4'b1111;
            lo_TRI_TBYTE_IN <= 4'b0000;
            hi_TRI_TBYTE_IN <= 4'b0000;
        end
        endcase
    end
    
    always @(*) begin
        dm_dbi_n_FIFO_RD_CLK = usr_clk_p;
        dqs_FIFO_RD_CLK = usr_clk_p;
        for (int i = 0; i < 8; i++) begin
            dq_FIFO_RD_CLK[i] = usr_clk_p;
        end
    end
    
    reg [3:0] rdfifo_cs = 0, rdfifo_ns;
    
    always @(posedge usr_clk_p) begin
        rdfifo_cs <= rdfifo_ns;
    end
    
    always @(*) begin
        case (rdfifo_cs)
        0: begin
            if (~dq_FIFO_EMPTY[7]) begin
                rdfifo_ns = 1;
            end else begin
                rdfifo_ns = 0;
            end
        end
        1: begin
            rdfifo_ns = 2;
        end
        2: begin
            rdfifo_ns = 0;
        end
        default: begin
            rdfifo_ns = 0;
        end
        endcase
    end    
    
    always @(*) begin
        if (itf_rst_done_ff2) begin
            for (int i = 0; i < 8; i++) begin
                dq_FIFO_RD_EN[i] = ~dq_FIFO_EMPTY[7];
            end
            dqs_FIFO_RD_EN = ~dq_FIFO_EMPTY[7];
            dm_dbi_n_FIFO_RD_EN = ~dq_FIFO_EMPTY[7];
        end else begin
            for (int i = 0; i < 8; i++) begin
                dq_FIFO_RD_EN[i] = 0;
            end
            dqs_FIFO_RD_EN = 0;
            dm_dbi_n_FIFO_RD_EN = 0;
        end
    end
        
endmodule

  • dut.v
`timescale 1ns / 1ps
//
// Company: 
// Engineer: wjh776a68
// 
// Create Date: 01/24/2024 03:36:45 PM
// Design Name: 
// Module Name: dut
// Project Name: 
// Target Devices: xcvu37p
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//

module dut #(
    parameter CLK_FREQ = 1333.333 // 4 * 333.333
) (
    input           pll_clk,
    input           riu_clk,
    input           delay_rst, // async
    input           ctrl_rst,   // async
    output reg      itf_rst_done, //

    inout           dm_dbi_n,
    inout   [7:0]   dq,
    inout           dqs_t,
    inout           dqs_c,

    input   [3:0]   lo_TRI_TBYTE_IN, // pll_clk 
    input   [3:0]   hi_TRI_TBYTE_IN, // pll_clk 
    input   [3:0]   lo_PHY_RDEN, // pll_clk 
    input   [3:0]   hi_PHY_RDEN, // pll_clk

    input   [7:0]   dm_dbi_n_o_I,
    input   [7:0]   dq_o_I[7:0],
    input   [7:0]   dqs_o_I,

    output  [7:0]   dm_dbi_n_i_I,
    output          dm_dbi_n_FIFO_EMPTY,
    input           dm_dbi_n_FIFO_RD_CLK,
    input           dm_dbi_n_FIFO_RD_EN,
    output  [7:0]   dq_i_I[7:0],
    output          dq_FIFO_EMPTY[7:0],
    input           dq_FIFO_RD_CLK[7:0],
    input           dq_FIFO_RD_EN[7:0],
    output  [7:0]   dqs_i_I,
    output          dqs_FIFO_EMPTY,
    input           dqs_FIFO_RD_CLK,
    input           dqs_FIFO_RD_EN
);
   // wire    riu_clk = usr_clk;
    wire    hi_DLY_RDY, lo_DLY_RDY, hi_VTC_RDY, lo_VTC_RDY;
    reg     lo_TBYTE_IN, hi_TBYTE_IN;
    reg     EN_VTC = 1'b0;
    wire    hi_clkout_n, hi_clkout_p, lo_clkout_n, lo_clkout_p;

    wire    [39:0]  hi_TRI_BIT_CTRL_OUT, hi_TRI_BIT_CTRL_IN, lo_TRI_BIT_CTRL_OUT, lo_TRI_BIT_CTRL_IN;

    wire    [39:0]  dm_dbi_n_TRI_BIT_CTRL_OUT;
    wire    [39:0]  dm_dbi_n_TRI_BIT_CTRL_IN;
    wire    [39:0]  dm_dbi_n_RX_BIT_CTRL_OUT;
    wire    [39:0]  dm_dbi_n_TX_BIT_CTRL_OUT;
    wire    [39:0]  dm_dbi_n_RX_BIT_CTRL_IN;
    wire    [39:0]  dm_dbi_n_TX_BIT_CTRL_IN;
    // logic           dm_dbi_n_TBYTE_IN;

    wire    [39:0]  dq_TRI_BIT_CTRL_OUT[7:0];
    wire    [39:0]  dq_TRI_BIT_CTRL_IN[7:0];
    wire    [39:0]  dq_RX_BIT_CTRL_OUT[7:0];
    wire    [39:0]  dq_TX_BIT_CTRL_OUT[7:0];
    wire    [39:0]  dq_RX_BIT_CTRL_IN[7:0];
    wire    [39:0]  dq_TX_BIT_CTRL_IN[7:0];
    // logic           dq_TBYTE_IN[7:0];

    wire    [39:0]  dqs_TRI_BIT_CTRL_OUT;
    wire    [39:0]  dqs_TRI_BIT_CTRL_IN;
    wire    [39:0]  dqs_RX_BIT_CTRL_OUT;
    wire    [39:0]  dqs_TX_BIT_CTRL_OUT;
    wire    [39:0]  dqs_RX_BIT_CTRL_IN;
    wire    [39:0]  dqs_TX_BIT_CTRL_IN;
    // logic           dqs_TBYTE_IN;

    (* ASYNC_REG="true" *) reg hi_DLY_RDY_ff = 1'b0, hi_DLY_RDY_ff2 = 1'b0, lo_DLY_RDY_ff = 1'b0, lo_DLY_RDY_ff2 = 1'b0;
    reg DLY_RDY_COMB = 1'b0;
    always @(posedge riu_clk) begin
       hi_DLY_RDY_ff2 <= hi_DLY_RDY_ff;
       hi_DLY_RDY_ff <= hi_DLY_RDY; 
       lo_DLY_RDY_ff2 <= lo_DLY_RDY_ff;
       lo_DLY_RDY_ff <= lo_DLY_RDY;
       DLY_RDY_COMB <= hi_DLY_RDY_ff2 & lo_DLY_RDY_ff2;
       if (DLY_RDY_COMB) begin
           EN_VTC <= 1'b1;
       end else begin
           EN_VTC <= 1'b0;
       end
    end
    
    (* ASYNC_REG="true" *) reg hi_VTC_RDY_ff = 1'b0, hi_VTC_RDY_ff2 = 1'b0, lo_VTC_RDY_ff = 1'b0, lo_VTC_RDY_ff2 = 1'b0;
    reg VTC_RDY_COMB = 1'b0;
    always @(posedge riu_clk) begin
        hi_VTC_RDY_ff2 <= hi_VTC_RDY_ff;
        hi_VTC_RDY_ff  <= hi_VTC_RDY; 
        lo_VTC_RDY_ff2 <= lo_VTC_RDY_ff;
        lo_VTC_RDY_ff  <= lo_VTC_RDY;
        VTC_RDY_COMB <= hi_VTC_RDY_ff2 & lo_VTC_RDY_ff2;
        if (VTC_RDY_COMB) begin
            itf_rst_done <= 1'b1;
        end else begin
            itf_rst_done <= 1'b0;
        end
    end
    
    dq #(
        .CLK_FREQ(CLK_FREQ)
    ) dm_dbi_n_inst(
        .dq(dm_dbi_n),
    //  .TRI_BIT_CTRL_OUT(dm_dbi_n_TRI_BIT_CTRL_OUT),
    //  .TRI_BIT_CTRL_IN(dm_dbi_n_TRI_BIT_CTRL_IN),
        .RX_BIT_CTRL_OUT(dm_dbi_n_RX_BIT_CTRL_OUT),    
        .TX_BIT_CTRL_OUT(dm_dbi_n_TX_BIT_CTRL_OUT),    
        .RX_BIT_CTRL_IN(dm_dbi_n_RX_BIT_CTRL_IN),
        .TX_BIT_CTRL_IN(dm_dbi_n_TX_BIT_CTRL_IN),     
        .Q(dm_dbi_n_i_I),                  
        .D(dm_dbi_n_o_I),                  
        .FIFO_EMPTY(dm_dbi_n_FIFO_EMPTY),         
        .FIFO_RD_CLK(dm_dbi_n_FIFO_RD_CLK),        
        .FIFO_RD_EN(dm_dbi_n_FIFO_RD_EN),         
        .TBYTE_IN(lo_TBYTE_IN),
    //    .TRI_TBYTE_IN(dm_dbi_n_TRI_TBYTE_IN)
        .rst(delay_rst)
    );

    generate for (genvar i = 0; i < 8; i++) begin
        if (i < 4) begin: lo_halfbyte
            dq #(
                .CLK_FREQ(CLK_FREQ)
            ) dq_lo_halfbyte_inst(
                .dq(dq[i]),
         //     .TRI_BIT_CTRL_OUT(dq_TRI_BIT_CTRL_OUT[i]),
         //     .TRI_BIT_CTRL_IN(dq_TRI_BIT_CTRL_IN[i]),
                .RX_BIT_CTRL_OUT(dq_RX_BIT_CTRL_OUT[i]),    
                .TX_BIT_CTRL_OUT(dq_TX_BIT_CTRL_OUT[i]),    
                .RX_BIT_CTRL_IN(dq_RX_BIT_CTRL_IN[i]),
                .TX_BIT_CTRL_IN(dq_TX_BIT_CTRL_IN[i]),     
                .Q(dq_i_I[i]),                  
                .D(dq_o_I[i]),                  
                .FIFO_EMPTY(dq_FIFO_EMPTY[i]),         
                .FIFO_RD_CLK(dq_FIFO_RD_CLK[i]),        
                .FIFO_RD_EN(dq_FIFO_RD_EN[i]),         
                .TBYTE_IN(lo_TBYTE_IN),
         //     .TRI_TBYTE_IN(dq_TRI_TBYTE_IN[i])
                .rst(delay_rst)
            );
        end else begin: hi_halfbyte
            dq #(
                .CLK_FREQ(CLK_FREQ)
            ) hi_halfbyte_inst(
                .dq(dq[i]),
         //     .TRI_BIT_CTRL_OUT(dq_TRI_BIT_CTRL_OUT[i]),
         //     .TRI_BIT_CTRL_IN(dq_TRI_BIT_CTRL_IN[i]),
                .RX_BIT_CTRL_OUT(dq_RX_BIT_CTRL_OUT[i]),    
                .TX_BIT_CTRL_OUT(dq_TX_BIT_CTRL_OUT[i]),    
                .RX_BIT_CTRL_IN(dq_RX_BIT_CTRL_IN[i]),
                .TX_BIT_CTRL_IN(dq_TX_BIT_CTRL_IN[i]),     
                .Q(dq_i_I[i]),                  
                .D(dq_o_I[i]),                  
                .FIFO_EMPTY(dq_FIFO_EMPTY[i]),         
                .FIFO_RD_CLK(dq_FIFO_RD_CLK[i]),        
                .FIFO_RD_EN(dq_FIFO_RD_EN[i]),         
                .TBYTE_IN(hi_TBYTE_IN),
         //     .TRI_TBYTE_IN(dq_TRI_TBYTE_IN[i])
                .rst(delay_rst)
            );
        end
    end endgenerate

    dqs #(
        .CLK_FREQ(CLK_FREQ)
    ) dqs_inst(
        .dqs_t(dqs_t),
        .dqs_c(dqs_c),
    //  .TRI_BIT_CTRL_OUT(dqs_TRI_BIT_CTRL_OUT),
    //  .TRI_BIT_CTRL_IN(dqs_TRI_BIT_CTRL_IN),
        .RX_BIT_CTRL_OUT(dqs_RX_BIT_CTRL_OUT),    
        .TX_BIT_CTRL_OUT(dqs_TX_BIT_CTRL_OUT),    
        .RX_BIT_CTRL_IN(dqs_RX_BIT_CTRL_IN),
        .TX_BIT_CTRL_IN(dqs_TX_BIT_CTRL_IN),     
        .Q(dqs_i_I),                  
        .D(dqs_o_I),                  
        .FIFO_EMPTY(dqs_FIFO_EMPTY),         
        .FIFO_RD_CLK(dqs_FIFO_RD_CLK),        
        .FIFO_RD_EN(dqs_FIFO_RD_EN),         
        .TBYTE_IN(hi_TBYTE_IN),
    //  .TRI_TBYTE_IN(dqs_TRI_TBYTE_IN)
        .rst(delay_rst)
    );

    generate // tri_logic
    TX_BITSLICE_TRI #(
        .DATA_WIDTH(8),             // Parallel data input width (4-8)
        .DELAY_FORMAT("TIME"),      // Units of the DELAY_VALUE (COUNT, TIME)
        .DELAY_TYPE("FIXED"),       // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
        .DELAY_VALUE(0),            // Output delay value setting
        .INIT(1'b1),                // Defines initial O value
        .IS_CLK_INVERTED(1'b0),     // Optional inversion for CLK
        .IS_RST_DLY_INVERTED(1'b0), // Optional inversion for RST_DLY
        .IS_RST_INVERTED(1'b0),     // Optional inversion for RST
        .OUTPUT_PHASE_90("FALSE"),  // Delays the output phase by 90-degrees
        .REFCLK_FREQUENCY(CLK_FREQ),   // Specification of the reference clock frequency in MHz (200.0-2667.0)
        .SIM_DEVICE("ULTRASCALE_PLUS"),  // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1,
        // ULTRASCALE_PLUS_ES2)
        .UPDATE_MODE("ASYNC")       // Determines when updates to the delay will take effect (ASYNC, MANUAL,
        // SYNC)
    )
    TX_BITSLICE_TRI_hi_halfbyte_inst (
        .BIT_CTRL_OUT(hi_TRI_BIT_CTRL_OUT), // 40-bit output: Output bus to BITSLICE_CONTROL
        .CNTVALUEOUT(),   // 9-bit output: Counter value to device logic
        .TRI_OUT(hi_TBYTE_IN),           // 1-bit output: Output to the TBYTE_IN pins of the bitslices
        .BIT_CTRL_IN(hi_TRI_BIT_CTRL_IN),   // 40-bit input: Input bus from BITSLICE_CONTROL
        .CE(1'b0),                     // 1-bit input: Active high enable increment/decrement input
        .CLK(1'b1),                   // 1-bit input: Clock input
        .CNTVALUEIN(9'b0),     // 9-bit input: Counter value input
        .EN_VTC(1'b1),             // 1-bit input: Enable to keep stable delay over VT
        .INC(1'b0),                   // 1-bit input: Increment the current delay tap setting
        .LOAD(1'b0),                 // 1-bit input: Load the CNTVALUEIN tap setting
        .RST(delay_rst),                   // 1-bit input: Asynchronous assert, synchronous deassert
        .RST_DLY(delay_rst)            // 1-bit input: Reset the internal DELAY value to DELAY_VALUE
    );

    TX_BITSLICE_TRI #(
        .DATA_WIDTH(8),             // Parallel data input width (4-8)
        .DELAY_FORMAT("TIME"),      // Units of the DELAY_VALUE (COUNT, TIME)
        .DELAY_TYPE("FIXED"),       // Set the type of tap delay line (FIXED, VARIABLE, VAR_LOAD)
        .DELAY_VALUE(0),            // Output delay value setting
        .INIT(1'b1),                // Defines initial O value
        .IS_CLK_INVERTED(1'b0),     // Optional inversion for CLK
        .IS_RST_DLY_INVERTED(1'b0), // Optional inversion for RST_DLY
        .IS_RST_INVERTED(1'b0),     // Optional inversion for RST
        .OUTPUT_PHASE_90("FALSE"),  // Delays the output phase by 90-degrees
        .REFCLK_FREQUENCY(CLK_FREQ),   // Specification of the reference clock frequency in MHz (200.0-2667.0)
        .SIM_DEVICE("ULTRASCALE_PLUS"),  // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1,
        // ULTRASCALE_PLUS_ES2)
        .UPDATE_MODE("ASYNC")       // Determines when updates to the delay will take effect (ASYNC, MANUAL,
        // SYNC)
    )
    TX_BITSLICE_TRI_lo_halfbyte_inst (
        .BIT_CTRL_OUT(lo_TRI_BIT_CTRL_OUT), // 40-bit output: Output bus to BITSLICE_CONTROL
        .CNTVALUEOUT(),   // 9-bit output: Counter value to device logic
        .TRI_OUT(lo_TBYTE_IN),           // 1-bit output: Output to the TBYTE_IN pins of the bitslices
        .BIT_CTRL_IN(lo_TRI_BIT_CTRL_IN),   // 40-bit input: Input bus from BITSLICE_CONTROL
        .CE(1'b0),                     // 1-bit input: Active high enable increment/decrement input
        .CLK(1'b1),                   // 1-bit input: Clock input
        .CNTVALUEIN(9'b0),     // 9-bit input: Counter value input
        .EN_VTC(1'b1),             // 1-bit input: Enable to keep stable delay over VT
        .INC(1'b0),                   // 1-bit input: Increment the current delay tap setting
        .LOAD(1'b0),                 // 1-bit input: Load the CNTVALUEIN tap setting
        .RST(delay_rst),                   // 1-bit input: Asynchronous assert, synchronous deassert
        .RST_DLY(delay_rst)            // 1-bit input: Reset the internal DELAY value to DELAY_VALUE
    );
    endgenerate

    BITSLICE_CONTROL #(
        .DIV_MODE("DIV4"),               // Controller DIV2/DIV4 mode (DIV2, DIV4)
        .EN_CLK_TO_EXT_NORTH("DISABLE"), // Enable clock forwarding to north
        .EN_CLK_TO_EXT_SOUTH("DISABLE"), // Enable clock forwarding to south
        .EN_DYN_ODLY_MODE("FALSE"),      // Enable dynamic output delay mode
        .EN_OTHER_NCLK("FALSE"),         // Select the NCLK from the other BITSLICE_CONTROL in the nibble (FALSE, TRUE)
        .EN_OTHER_PCLK("FALSE"),         // Select the PCLK from the other BITSLICE_CONTROL in the nibble (FALSE, TRUE)
        .IDLY_VT_TRACK("TRUE"),          // Enable VT tracking for input delays
        .INV_RXCLK("FALSE"),             // Invert clock path from IOB to upper RX bitslice
        .ODLY_VT_TRACK("TRUE"),          // Enable VT tracking for output delays
        .QDLY_VT_TRACK("TRUE"),          // Enable VT tracking for clock delays
        .READ_IDLE_COUNT(6'h00),         // Gap count between read bursts for ODT control counter (0-3f)
        .REFCLK_SRC("PLLCLK"),           // Select the input clock for delay control (PLLCLK, REFCLK). REFCLK is only supported for RX_BITSLICE.
        .ROUNDING_FACTOR(16),            // Rounding factor in BISC spec (128-8)
        .RXGATE_EXTEND("FALSE"),         // Reserved for use by Memory IP. Do Not Change.
        .RX_CLK_PHASE_N("SHIFT_0"),      // Shift the Read CLK relative to read DQ during calibration (SHIFT_0, SHIFT_90)
        .RX_CLK_PHASE_P("SHIFT_0"),      // Shift the Read CLK relative to read DQ during calibration (SHIFT_0, SHIFT_90)
        .RX_GATING("ENABLE"),           // ENABLE/DISABLE read DQS gating
        .SELF_CALIBRATE("ENABLE"),       // Enable BISC of nibble controlled by BITSLICE_CONTROL
        .SERIAL_MODE("FALSE"),           // Put BITSLICE read paths into serial mode (FALSE, TRUE)
        .SIM_DEVICE("ULTRASCALE_PLUS"),       // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
        .TX_GATING("ENABLE")            // ENABLE/DISABLE clock gating in WClkgen
    )
    BITSLICE_CONTROL_hi_halfbyte_inst (
        .CLK_TO_EXT_NORTH(),       // 1-bit output: Inter-byte clock going to north
        // BITSLICE_CONTROL

        .CLK_TO_EXT_SOUTH(),       // 1-bit output: Inter-byte clock going to south
        // BITSLICE_CONTROL

        .DLY_RDY(hi_DLY_RDY),                         // 1-bit output: Fixed delay calibration complete
        .DYN_DCI(),                    // 7-bit output: Direct control of IOB DCI when using a memory interface 
        .NCLK_NIBBLE_OUT(hi_clkout_n),         // 1-bit output: Intra-byte DQS strobes/clock to other control block

        .PCLK_NIBBLE_OUT(hi_clkout_p),         // 1-bit output: Intra-byte DQS strobes/clock to other control block

        .RIU_RD_DATA(),                 // 16-bit output: RIU Output Read data to the controller
        .RIU_VALID(),                     // 1-bit output: Last data written has been accepted when High
        .RX_BIT_CTRL_OUT0(dqs_RX_BIT_CTRL_IN),       // 40-bit output: Output bus to Bitslice 0
        .RX_BIT_CTRL_OUT1(),       // 40-bit output: Output bus to Bitslice 1
        .RX_BIT_CTRL_OUT2(dq_RX_BIT_CTRL_IN[4]),       // 40-bit output: Output bus to Bitslice 2
        .RX_BIT_CTRL_OUT3(dq_RX_BIT_CTRL_IN[5]),       // 40-bit output: Output bus to Bitslice 3
        .RX_BIT_CTRL_OUT4(dq_RX_BIT_CTRL_IN[6]),       // 40-bit output: Output bus to Bitslice 4
        .RX_BIT_CTRL_OUT5(dq_RX_BIT_CTRL_IN[7]),       // 40-bit output: Output bus to Bitslice 5
        .RX_BIT_CTRL_OUT6(),       // 40-bit output: Output bus to Bitslice 6
        .TX_BIT_CTRL_OUT0(dqs_TX_BIT_CTRL_IN),       // 40-bit output: Output bus to Bitslice 0
        .TX_BIT_CTRL_OUT1(),       // 40-bit output: Output bus to Bitslice 1
        .TX_BIT_CTRL_OUT2(dq_TX_BIT_CTRL_IN[4]),       // 40-bit output: Output bus to Bitslice 2
        .TX_BIT_CTRL_OUT3(dq_TX_BIT_CTRL_IN[5]),       // 40-bit output: Output bus to Bitslice 3
        .TX_BIT_CTRL_OUT4(dq_TX_BIT_CTRL_IN[6]),       // 40-bit output: Output bus to Bitslice 4
        .TX_BIT_CTRL_OUT5(dq_TX_BIT_CTRL_IN[7]),       // 40-bit output: Output bus to Bitslice 5
        .TX_BIT_CTRL_OUT6(),       // 40-bit output: Output bus to Bitslice 6
        .TX_BIT_CTRL_OUT_TRI(hi_TRI_BIT_CTRL_IN), // 40-bit output: Output bus to 3-state TX_BITSLICE_TRI
        .VTC_RDY(hi_VTC_RDY),                         // 1-bit output: PHY calibration is complete
        .CLK_FROM_EXT(1'b0),             // 1-bit input: Inter-byte clock coming from north or south BITSLICE_CONTROL
        .EN_VTC(EN_VTC),                     // 1-bit input: Enables voltage and temperature compensation when High

        .NCLK_NIBBLE_IN(lo_clkout_n),           // 1-bit input: Intra-byte DQS strobes from other/clock control block

        .PCLK_NIBBLE_IN(lo_clkout_p),           // 1-bit input: Intra-byte DQS strobes/clock from other control block

        .PHY_RDCS0(4'b0),                     // 4-bit input: Rank select
        .PHY_RDCS1(4'b0),                     // 4-bit input: Rank select
        .PHY_RDEN(hi_PHY_RDEN),                       // 4-bit input: Read burst enable when using a memory interface
        .PHY_WRCS0(4'b0),                     // 4-bit input: Rank select
        .PHY_WRCS1(4'b0),                     // 4-bit input: Rank select
        .PLL_CLK(pll_clk),                         // 1-bit input: PLL clock input
        .REFCLK(1'b0),                           // 1-bit input: Frequency reference clock for delay control
        .RIU_ADDR(6'b0),                       // 6-bit input: Address input for RIU
        .RIU_CLK(riu_clk),                         // 1-bit input: System clock from fabric for RIU access
        .RIU_NIBBLE_SEL(1'b0),           // 1-bit input: Nibble select to enable RIU read/write
        .RIU_WR_DATA(16'b0),                 // 16-bit input: RIU Input Write data from the controller
        .RIU_WR_EN(1'b0),                     // 1-bit input: Enables write to RIU when High
        .RST(ctrl_rst),                                 // 1-bit input: Asynchronous global reset
        .RX_BIT_CTRL_IN0(dqs_RX_BIT_CTRL_OUT),         // 40-bit input: Input bus from Bitslice 0
        .RX_BIT_CTRL_IN1(40'b0),         // 40-bit input: Input bus from Bitslice 1
        .RX_BIT_CTRL_IN2(dq_RX_BIT_CTRL_OUT[4]),         // 40-bit input: Input bus from Bitslice 2
        .RX_BIT_CTRL_IN3(dq_RX_BIT_CTRL_OUT[5]),         // 40-bit input: Input bus from Bitslice 3
        .RX_BIT_CTRL_IN4(dq_RX_BIT_CTRL_OUT[6]),         // 40-bit input: Input bus from Bitslice 4
        .RX_BIT_CTRL_IN5(dq_RX_BIT_CTRL_OUT[7]),         // 40-bit input: Input bus from Bitslice 5
        .RX_BIT_CTRL_IN6(40'b0),         // 40-bit input: Input bus from Bitslice 6
        .TBYTE_IN(hi_TRI_TBYTE_IN),                       // 4-bit input: Output enable for 3-state control
        .TX_BIT_CTRL_IN0(dqs_TX_BIT_CTRL_OUT),         // 40-bit input: Input bus from Bitslice 0
        .TX_BIT_CTRL_IN1(40'b0),         // 40-bit input: Input bus from Bitslice 1
        .TX_BIT_CTRL_IN2(dq_TX_BIT_CTRL_OUT[4]),         // 40-bit input: Input bus from Bitslice 2
        .TX_BIT_CTRL_IN3(dq_TX_BIT_CTRL_OUT[5]),         // 40-bit input: Input bus from Bitslice 3
        .TX_BIT_CTRL_IN4(dq_TX_BIT_CTRL_OUT[6]),         // 40-bit input: Input bus from Bitslice 4
        .TX_BIT_CTRL_IN5(dq_TX_BIT_CTRL_OUT[7]),         // 40-bit input: Input bus from Bitslice 5
        .TX_BIT_CTRL_IN6(40'b0),         // 40-bit input: Input bus from Bitslice 6
        .TX_BIT_CTRL_IN_TRI(hi_TRI_BIT_CTRL_OUT)    // 40-bit input: Input bus from 3-state TX_BITSLICE_TRI
    );

    BITSLICE_CONTROL #(
        .DIV_MODE("DIV4"),               // Controller DIV2/DIV4 mode (DIV2, DIV4)
        .EN_CLK_TO_EXT_NORTH("DISABLE"), // Enable clock forwarding to north
        .EN_CLK_TO_EXT_SOUTH("DISABLE"), // Enable clock forwarding to south
        .EN_DYN_ODLY_MODE("FALSE"),      // Enable dynamic output delay mode
        .EN_OTHER_NCLK("TRUE"),         // Select the NCLK from the other BITSLICE_CONTROL in the nibble (FALSE, TRUE)
        .EN_OTHER_PCLK("TRUE"),         // Select the PCLK from the other BITSLICE_CONTROL in the nibble (FALSE, TRUE)
        .IDLY_VT_TRACK("TRUE"),          // Enable VT tracking for input delays
        .INV_RXCLK("FALSE"),             // Invert clock path from IOB to upper RX bitslice
        .ODLY_VT_TRACK("TRUE"),          // Enable VT tracking for output delays
        .QDLY_VT_TRACK("TRUE"),          // Enable VT tracking for clock delays
        .READ_IDLE_COUNT(6'h00),         // Gap count between read bursts for ODT control counter (0-3f)
        .REFCLK_SRC("PLLCLK"),           // Select the input clock for delay control (PLLCLK, REFCLK). REFCLK is only supported for RX_BITSLICE.
        .ROUNDING_FACTOR(16),            // Rounding factor in BISC spec (128-8)
        .RXGATE_EXTEND("FALSE"),         // Reserved for use by Memory IP. Do Not Change.
        .RX_CLK_PHASE_N("SHIFT_0"),      // Shift the Read CLK relative to read DQ during calibration (SHIFT_0, SHIFT_90)
        .RX_CLK_PHASE_P("SHIFT_0"),      // Shift the Read CLK relative to read DQ during calibration (SHIFT_0, SHIFT_90)
        .RX_GATING("ENABLE"),           // ENABLE/DISABLE read DQS gating
        .SELF_CALIBRATE("ENABLE"),       // Enable BISC of nibble controlled by BITSLICE_CONTROL
        .SERIAL_MODE("FALSE"),           // Put BITSLICE read paths into serial mode (FALSE, TRUE)
        .SIM_DEVICE("ULTRASCALE_PLUS"),       // Set the device version (ULTRASCALE, ULTRASCALE_PLUS, ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
        .TX_GATING("ENABLE")            // ENABLE/DISABLE clock gating in WClkgen
    )
    BITSLICE_CONTROL_lo_halfbyte_inst (
        .CLK_TO_EXT_NORTH(),       // 1-bit output: Inter-byte clock going to north
        // BITSLICE_CONTROL

        .CLK_TO_EXT_SOUTH(),       // 1-bit output: Inter-byte clock going to south
        // BITSLICE_CONTROL

        .DLY_RDY(lo_DLY_RDY),                         // 1-bit output: Fixed delay calibration complete
        .DYN_DCI(),                    // 7-bit output: Direct control of IOB DCI when using a memory interface 
        .NCLK_NIBBLE_OUT(lo_clkout_n),         // 1-bit output: Intra-byte DQS strobes/clock to other control block

        .PCLK_NIBBLE_OUT(lo_clkout_p),         // 1-bit output: Intra-byte DQS strobes/clock to other control block

        .RIU_RD_DATA(),                 // 16-bit output: RIU Output Read data to the controller
        .RIU_VALID(),                     // 1-bit output: Last data written has been accepted when High
        .RX_BIT_CTRL_OUT0(dm_dbi_n_RX_BIT_CTRL_IN),       // 40-bit output: Output bus to Bitslice 0
        .RX_BIT_CTRL_OUT1(),       // 40-bit output: Output bus to Bitslice 1
        .RX_BIT_CTRL_OUT2(dq_RX_BIT_CTRL_IN[0]),       // 40-bit output: Output bus to Bitslice 2
        .RX_BIT_CTRL_OUT3(dq_RX_BIT_CTRL_IN[1]),       // 40-bit output: Output bus to Bitslice 3
        .RX_BIT_CTRL_OUT4(dq_RX_BIT_CTRL_IN[2]),       // 40-bit output: Output bus to Bitslice 4
        .RX_BIT_CTRL_OUT5(dq_RX_BIT_CTRL_IN[3]),       // 40-bit output: Output bus to Bitslice 5
        .RX_BIT_CTRL_OUT6(),       // 40-bit output: Output bus to Bitslice 6
        .TX_BIT_CTRL_OUT0(dm_dbi_n_TX_BIT_CTRL_IN),       // 40-bit output: Output bus to Bitslice 0
        .TX_BIT_CTRL_OUT1(),       // 40-bit output: Output bus to Bitslice 1
        .TX_BIT_CTRL_OUT2(dq_TX_BIT_CTRL_IN[0]),       // 40-bit output: Output bus to Bitslice 2
        .TX_BIT_CTRL_OUT3(dq_TX_BIT_CTRL_IN[1]),       // 40-bit output: Output bus to Bitslice 3
        .TX_BIT_CTRL_OUT4(dq_TX_BIT_CTRL_IN[2]),       // 40-bit output: Output bus to Bitslice 4
        .TX_BIT_CTRL_OUT5(dq_TX_BIT_CTRL_IN[3]),       // 40-bit output: Output bus to Bitslice 5
        .TX_BIT_CTRL_OUT6(),       // 40-bit output: Output bus to Bitslice 6
        .TX_BIT_CTRL_OUT_TRI(lo_TRI_BIT_CTRL_IN), // 40-bit output: Output bus to 3-state TX_BITSLICE_TRI
        .VTC_RDY(lo_VTC_RDY),                         // 1-bit output: PHY calibration is complete
        .CLK_FROM_EXT(1'b1),             // 1-bit input: Inter-byte clock coming from north or south BITSLICE_CONTROL
        .EN_VTC(EN_VTC),                     // 1-bit input: Enables voltage and temperature compensation when High

        .NCLK_NIBBLE_IN(hi_clkout_n),           // 1-bit input: Intra-byte DQS strobes from other/clock control block

        .PCLK_NIBBLE_IN(hi_clkout_p),           // 1-bit input: Intra-byte DQS strobes/clock from other control block

        .PHY_RDCS0(4'b0),                     // 4-bit input: Rank select
        .PHY_RDCS1(4'b0),                     // 4-bit input: Rank select
        .PHY_RDEN(lo_PHY_RDEN),                       // 4-bit input: Read burst enable when using a memory interface
        .PHY_WRCS0(4'b0),                     // 4-bit input: Rank select
        .PHY_WRCS1(4'b0),                     // 4-bit input: Rank select
        .PLL_CLK(pll_clk),                         // 1-bit input: PLL clock input
        .REFCLK(1'b0),                           // 1-bit input: Frequency reference clock for delay control
        .RIU_ADDR(6'b0),                       // 6-bit input: Address input for RIU
        .RIU_CLK(riu_clk),                         // 1-bit input: System clock from fabric for RIU access
        .RIU_NIBBLE_SEL(1'b0),           // 1-bit input: Nibble select to enable RIU read/write
        .RIU_WR_DATA(16'b0),                 // 16-bit input: RIU Input Write data from the controller
        .RIU_WR_EN(1'b0),                     // 1-bit input: Enables write to RIU when High
        .RST(ctrl_rst),                                 // 1-bit input: Asynchronous global reset
        .RX_BIT_CTRL_IN0(dm_dbi_n_RX_BIT_CTRL_OUT),         // 40-bit input: Input bus from Bitslice 0
        .RX_BIT_CTRL_IN1(40'b0),         // 40-bit input: Input bus from Bitslice 1
        .RX_BIT_CTRL_IN2(dq_RX_BIT_CTRL_OUT[0]),         // 40-bit input: Input bus from Bitslice 2
        .RX_BIT_CTRL_IN3(dq_RX_BIT_CTRL_OUT[1]),         // 40-bit input: Input bus from Bitslice 3
        .RX_BIT_CTRL_IN4(dq_RX_BIT_CTRL_OUT[2]),         // 40-bit input: Input bus from Bitslice 4
        .RX_BIT_CTRL_IN5(dq_RX_BIT_CTRL_OUT[3]),         // 40-bit input: Input bus from Bitslice 5
        .RX_BIT_CTRL_IN6(40'b0),         // 40-bit input: Input bus from Bitslice 6
        .TBYTE_IN(lo_TRI_TBYTE_IN),                       // 4-bit input: Output enable for 3-state control
        .TX_BIT_CTRL_IN0(dm_dbi_n_TX_BIT_CTRL_OUT),         // 40-bit input: Input bus from Bitslice 0
        .TX_BIT_CTRL_IN1(40'b0),         // 40-bit input: Input bus from Bitslice 1
        .TX_BIT_CTRL_IN2(dq_TX_BIT_CTRL_OUT[0]),         // 40-bit input: Input bus from Bitslice 2
        .TX_BIT_CTRL_IN3(dq_TX_BIT_CTRL_OUT[1]),         // 40-bit input: Input bus from Bitslice 3
        .TX_BIT_CTRL_IN4(dq_TX_BIT_CTRL_OUT[2]),         // 40-bit input: Input bus from Bitslice 4
        .TX_BIT_CTRL_IN5(dq_TX_BIT_CTRL_OUT[3]),         // 40-bit input: Input bus from Bitslice 5
        .TX_BIT_CTRL_IN6(40'b0),         // 40-bit input: Input bus from Bitslice 6
        .TX_BIT_CTRL_IN_TRI(lo_TRI_BIT_CTRL_OUT)    // 40-bit input: Input bus from 3-state TX_BITSLICE_TRI
    );
endmodule
  • dq.v
`timescale 1ns / 1ps
//
// Company: 
// Engineer: wjh776a68
// 
// Create Date: 01/29/2024 05:58:32 PM
// Design Name: 
// Module Name: dq
// Project Name: 
// Target Devices: xcvu37p
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module dq #(
    parameter CLK_FREQ = 1333.333
) (
    inout           dq,
    // output  [39:0]  TRI_BIT_CTRL_OUT,
    // input   [39:0]  TRI_BIT_CTRL_IN,
    output  [39:0]  RX_BIT_CTRL_OUT,    // output
    output  [39:0]  TX_BIT_CTRL_OUT,    // output
    output  [7:0]   Q,                  // output
    input   [7:0]   D,                  // input   -- ass
    output          FIFO_EMPTY,         // output
    input           FIFO_RD_CLK,        // input   -- ass
    input           FIFO_RD_EN,         // input   -- ass
    input   [39:0]  RX_BIT_CTRL_IN,     // input
    input   [39:0]  TX_BIT_CTRL_IN,     // input
    input           TBYTE_IN,           // input
    // input   [3:0]   TRI_TBYTE_IN
    input           rst
);

    logic   [8:0]   TX_CNTVALUEOUT;             // output // internal
    logic   [8:0]   RX_CNTVALUEOUT;             // output // internal
    logic           O;                          // output  -- ass // internal
    logic           T_OUT;                      // output  -- ass // internal
    logic           DATAIN;                     // input   -- ass // internal
    logic           FIFO_WRCLK_OUT;             // output // internal
    logic           T               = 1'b0;     // input
    logic           TX_CE           = 1'b0;     // input   -- ass
    logic           TX_CLK          = 1'b1;     // input   -- ass
    logic           RX_CE           = 1'b0;     // input   -- ass
    logic           RX_CLK          = 1'b1;     // input   -- ass
    logic   [8:0]   RX_CNTVALUEIN   = 9'b0;     // input   -- ass
    logic           RX_EN_VTC       = 1'b1;     // input   -- ass
    logic           RX_INC          = 1'b0;     // input   -- ass
    logic           RX_LOAD         = 1'b0;     // input   -- ass
    wire            RX_RST          = rst;     // input    -- ass
    wire            RX_RST_DLY      = rst;     // input    -- ass
    logic   [8:0]   TX_CNTVALUEIN   = 9'b0;     // input   -- ass
    logic           TX_EN_VTC       = 1'b1;     // input   -- ass
    logic           TX_INC          = 1'b0;     // input   -- ass
    logic           TX_LOAD         = 1'b0;     // input   -- ass
    wire            TX_RST          = rst;     // input   -- ass
    wire            TX_RST_DLY      = rst;     // input   -- ass

    RXTX_BITSLICE #(
        .ENABLE_PRE_EMPHASIS("FALSE"), // Enable the pre-emphasis
        .FIFO_SYNC_MODE("FALSE"),      // Internal write clock and FIFO_RD_CLK are coming from a common source
        .INIT(1'b1),                   // Defines initial O value
        .IS_RX_CLK_INVERTED(1'b0),     // Optional inversion for RX_CLK
        .IS_RX_RST_DLY_INVERTED(1'b0), // Optional inversion for RX_RST_DLY
        .IS_RX_RST_INVERTED(1'b0),     // Optional inversion for RX_RST
        .IS_TX_CLK_INVERTED(1'b0),     // Optional inversion for TX_CLK
        .IS_TX_RST_DLY_INVERTED(1'b0), // Optional inversion for TX_RST_DLY
        .IS_TX_RST_INVERTED(1'b0),     // Optional inversion for TX_RST
        .RX_DATA_TYPE("DATA"),         // Defines what the RX input pin is carrying (CLOCK, DATA, DATA_AND_CLOCK,
        // SERIAL)
        .RX_DATA_WIDTH(8),             // Defines the width of the serial-to-parallel converter (4-8)
        .RX_DELAY_FORMAT("TIME"),      // Units of the RX DELAY_VALUE (COUNT, TIME)
        .RX_DELAY_TYPE("FIXED"),       // Set the type of RX tap delay line (FIXED, VARIABLE, VAR_LOAD)
        .RX_DELAY_VALUE(0),            // RX Input delay value setting in ps
        .RX_REFCLK_FREQUENCY(CLK_FREQ),   // Specification of the RX reference clock frequency in MHz (200.0-2667.0)
        .RX_UPDATE_MODE("ASYNC"),      // Determines when updates to the RX delay will take effect (ASYNC,
        // MANUAL, SYNC)
        .SIM_DEVICE("ULTRASCALE_PLUS"),     // Set the device version (ULTRASCALE, ULTRASCALE_PLUS,
        // ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
        .TBYTE_CTL("TBYTE_IN"),        // Select between T and TBYTE_IN inputs
        .TX_DATA_WIDTH(8),             // Parallel data input width (4-8)
        .TX_DELAY_FORMAT("TIME"),      // Units of the TX DELAY_VALUE (COUNT, TIME)
        .TX_DELAY_TYPE("FIXED"),       // Set the type of TX tap delay line (FIXED, VARIABLE, VAR_LOAD)
        .TX_DELAY_VALUE(0),            // TX Input delay value setting in ps
        .TX_OUTPUT_PHASE_90("FALSE"),  // Delays the output phase by 90-degrees
        .TX_REFCLK_FREQUENCY(CLK_FREQ),   // Specification of the TX reference clock frequency in MHz (200.0-2667.0)
        .TX_UPDATE_MODE("ASYNC")       // Determines when updates to the delay will take effect (ASYNC, MANUAL,
        // SYNC)
    )
    RXTX_BITSLICE_dq_inst (
        .FIFO_EMPTY(FIFO_EMPTY),           // 1-bit output: FIFO empty flag
        .FIFO_WRCLK_OUT(FIFO_WRCLK_OUT),   // 1-bit output: FIFO source synchronous write clock out to the device
        // logic (currently unsupported, do not connect)

        .O(O),                             // 1-bit output: Serialized output going to output buffer
        .Q(Q),                             // 8-bit output: Registered output data from FIFO
        .RX_BIT_CTRL_OUT(RX_BIT_CTRL_OUT), // 40-bit output: RX Output bus to BITSLICE_CONTROL
        .RX_CNTVALUEOUT(RX_CNTVALUEOUT),   // 9-bit output: RX Counter value from device logic
        .TX_BIT_CTRL_OUT(TX_BIT_CTRL_OUT), // 40-bit output: Output bus to BITSLICE_CONTROL for TX
        .TX_CNTVALUEOUT(TX_CNTVALUEOUT),   // 9-bit output: TX Counter value to device logic
        .T_OUT(T_OUT),                     // 1-bit output: Byte group 3-state output
        .D(D),                             // 8-bit input: Data from device logic
        .DATAIN(DATAIN),                   // 1-bit input: Input signal from IOBUF
        .FIFO_RD_CLK(FIFO_RD_CLK),         // 1-bit input: FIFO read clock
        .FIFO_RD_EN(FIFO_RD_EN),           // 1-bit input: FIFO read enable
        .RX_BIT_CTRL_IN(RX_BIT_CTRL_IN),   // 40-bit input: RX Input bus from BITSLICE_CONTROL
        .RX_CE(RX_CE),                     // 1-bit input: Clock enable for IDELAY
        .RX_CLK(RX_CLK),                   // 1-bit input: RX Clock used to sample LOAD, CE, INC
        .RX_CNTVALUEIN(RX_CNTVALUEIN),     // 9-bit input: RX Counter value from device logic
        .RX_EN_VTC(RX_EN_VTC),             // 1-bit input: RX Enable to keep stable delay over VT
        .RX_INC(RX_INC),                   // 1-bit input: RX Increment the current delay tap setting
        .RX_LOAD(RX_LOAD),                 // 1-bit input: RX Load the CNTVALUEIN tap setting
        .RX_RST(RX_RST),                   // 1-bit input: RX Asynchronous assert, synchronous deassert for
        // RXTX_BITSLICE ISERDES

        .RX_RST_DLY(RX_RST_DLY),           // 1-bit input: RX Reset the internal DELAY value to DELAY_VALUE
        .T(T),                             // 1-bit input: Legacy T byte input from device logic
        .TBYTE_IN(TBYTE_IN),               // 1-bit input: Byte group 3-state input from TX_BITSLICE_TRI
        .TX_BIT_CTRL_IN(TX_BIT_CTRL_IN),   // 40-bit input: TX Input bus from BITSLICE_CONTROL
        .TX_CE(TX_CE),                     // 1-bit input: Clock enable for ODELAY
        .TX_CLK(TX_CLK),                   // 1-bit input: TX Clock used to sample LOAD, CE, INC
        .TX_CNTVALUEIN(TX_CNTVALUEIN),     // 9-bit input: TX Counter value from device logic
        .TX_EN_VTC(TX_EN_VTC),             // 1-bit input: TX Enable to keep stable delay over VT
        .TX_INC(TX_INC),                   // 1-bit input: TX Increment the current delay tap setting
        .TX_LOAD(TX_LOAD),                 // 1-bit input: TX Load the CNTVALUEIN tap setting
        .TX_RST(TX_RST),                   // 1-bit input: TX Asynchronous assert, synchronous deassert for
        // RXTX_BITSLICE OSERDES

        .TX_RST_DLY(TX_RST_DLY)            // 1-bit input: TX Reset the internal DELAY value to DELAY_VALUE
    );

    IOBUF IOBUF_dqs_inst (
        .O(DATAIN),     // Buffer output
        .IO(dq),     // Diff_p inout (connect directly to top-level port)
        .I(O),          // Buffer input
        .T(T_OUT)       // 3-state enable input, high=input, low=output
    );

endmodule
  • dqs.v
`timescale 1ns / 1ps
//
// Company: 
// Engineer: wjh776a68
// 
// Create Date: 01/29/2024 05:58:32 PM
// Design Name: 
// Module Name: dqs
// Project Name: 
// Target Devices: xcvu37p
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module dqs #(
    parameter CLK_FREQ = 1333.333
) (
    inout           dqs_t,
    inout           dqs_c,
    // output  [39:0]  TRI_BIT_CTRL_OUT,
    // input   [39:0]  TRI_BIT_CTRL_IN,
    output  [39:0]  RX_BIT_CTRL_OUT,    // output
    output  [39:0]  TX_BIT_CTRL_OUT,    // output
    output  [7:0]   Q,                  // output
    input   [7:0]   D,                  // input   -- ass
    output          FIFO_EMPTY,         // output
    input           FIFO_RD_CLK,        // input   -- ass
    input           FIFO_RD_EN,         // input   -- ass
    input   [39:0]  RX_BIT_CTRL_IN,     // input
    input   [39:0]  TX_BIT_CTRL_IN,     // input
    input           TBYTE_IN,           // input
    // input   [3:0]   TRI_TBYTE_IN
    input           rst
);

    logic   [8:0]   TX_CNTVALUEOUT;             // output // internal
    logic   [8:0]   RX_CNTVALUEOUT;             // output // internal
    logic           O;                          // output  -- ass // internal
    logic           T_OUT;                      // output  -- ass // internal
    logic           DATAIN;                     // input   -- ass // internal
    logic           FIFO_WRCLK_OUT;             // output // internal
    logic           T               = 1'b0;     // input
    logic           TX_CE           = 1'b0;     // input   -- ass
    logic           TX_CLK          = 1'b1;     // input   -- ass
    logic           RX_CE           = 1'b0;     // input   -- ass
    logic           RX_CLK          = 1'b1;     // input   -- ass
    logic   [8:0]   RX_CNTVALUEIN   = 9'b0;     // input   -- ass
    logic           RX_EN_VTC       = 1'b1;     // input   -- ass
    logic           RX_INC          = 1'b0;     // input   -- ass
    logic           RX_LOAD         = 1'b0;     // input   -- ass
    wire            RX_RST          = rst;     // input    -- ass
    wire            RX_RST_DLY      = rst;     // input    -- ass
    logic   [8:0]   TX_CNTVALUEIN   = 9'b0;     // input   -- ass
    logic           TX_EN_VTC       = 1'b1;     // input   -- ass
    logic           TX_INC          = 1'b0;     // input   -- ass
    logic           TX_LOAD         = 1'b0;     // input   -- ass
    wire            TX_RST          = rst;     // input   -- ass
    wire            TX_RST_DLY      = rst;     // input   -- ass

    RXTX_BITSLICE #(
        .ENABLE_PRE_EMPHASIS("FALSE"), // Enable the pre-emphasis
        .FIFO_SYNC_MODE("FALSE"),      // Internal write clock and FIFO_RD_CLK are coming from a common source
        .INIT(1'b1),                   // Defines initial O value
        .IS_RX_CLK_INVERTED(1'b0),     // Optional inversion for RX_CLK
        .IS_RX_RST_DLY_INVERTED(1'b0), // Optional inversion for RX_RST_DLY
        .IS_RX_RST_INVERTED(1'b0),     // Optional inversion for RX_RST
        .IS_TX_CLK_INVERTED(1'b0),     // Optional inversion for TX_CLK
        .IS_TX_RST_DLY_INVERTED(1'b0), // Optional inversion for TX_RST_DLY
        .IS_TX_RST_INVERTED(1'b0),     // Optional inversion for TX_RST
        .RX_DATA_TYPE("DATA_AND_CLOCK"),         // Defines what the RX input pin is carrying (CLOCK, DATA, DATA_AND_CLOCK,
        // SERIAL)
        .RX_DATA_WIDTH(8),             // Defines the width of the serial-to-parallel converter (4-8)
        .RX_DELAY_FORMAT("TIME"),      // Units of the RX DELAY_VALUE (COUNT, TIME)
        .RX_DELAY_TYPE("FIXED"),       // Set the type of RX tap delay line (FIXED, VARIABLE, VAR_LOAD)
        .RX_DELAY_VALUE(0),            // RX Input delay value setting in ps
        .RX_REFCLK_FREQUENCY(CLK_FREQ),   // Specification of the RX reference clock frequency in MHz (200.0-2667.0)
        .RX_UPDATE_MODE("ASYNC"),      // Determines when updates to the RX delay will take effect (ASYNC,
        // MANUAL, SYNC)
        .SIM_DEVICE("ULTRASCALE_PLUS"),     // Set the device version (ULTRASCALE, ULTRASCALE_PLUS,
        // ULTRASCALE_PLUS_ES1, ULTRASCALE_PLUS_ES2)
        .TBYTE_CTL("TBYTE_IN"),        // Select between T and TBYTE_IN inputs
        .TX_DATA_WIDTH(8),             // Parallel data input width (4-8)
        .TX_DELAY_FORMAT("TIME"),      // Units of the TX DELAY_VALUE (COUNT, TIME)
        .TX_DELAY_TYPE("FIXED"),       // Set the type of TX tap delay line (FIXED, VARIABLE, VAR_LOAD)
        .TX_DELAY_VALUE(0),            // TX Input delay value setting in ps
        .TX_OUTPUT_PHASE_90("FALSE"),  // Delays the output phase by 90-degrees
        .TX_REFCLK_FREQUENCY(CLK_FREQ),   // Specification of the TX reference clock frequency in MHz (200.0-2667.0)
        .TX_UPDATE_MODE("ASYNC")       // Determines when updates to the delay will take effect (ASYNC, MANUAL,
        // SYNC)
    )
    RXTX_BITSLICE_dqs_inst (
        .FIFO_EMPTY(FIFO_EMPTY),           // 1-bit output: FIFO empty flag
        .FIFO_WRCLK_OUT(FIFO_WRCLK_OUT),   // 1-bit output: FIFO source synchronous write clock out to the device
        // logic (currently unsupported, do not connect)

        .O(O),                             // 1-bit output: Serialized output going to output buffer
        .Q(Q),                             // 8-bit output: Registered output data from FIFO
        .RX_BIT_CTRL_OUT(RX_BIT_CTRL_OUT), // 40-bit output: RX Output bus to BITSLICE_CONTROL
        .RX_CNTVALUEOUT(RX_CNTVALUEOUT),   // 9-bit output: RX Counter value from device logic
        .TX_BIT_CTRL_OUT(TX_BIT_CTRL_OUT), // 40-bit output: Output bus to BITSLICE_CONTROL for TX
        .TX_CNTVALUEOUT(TX_CNTVALUEOUT),   // 9-bit output: TX Counter value to device logic
        .T_OUT(T_OUT),                     // 1-bit output: Byte group 3-state output
        .D(D),                             // 8-bit input: Data from device logic
        .DATAIN(DATAIN),                   // 1-bit input: Input signal from IOBUF
        .FIFO_RD_CLK(FIFO_RD_CLK),         // 1-bit input: FIFO read clock
        .FIFO_RD_EN(FIFO_RD_EN),           // 1-bit input: FIFO read enable
        .RX_BIT_CTRL_IN(RX_BIT_CTRL_IN),   // 40-bit input: RX Input bus from BITSLICE_CONTROL
        .RX_CE(RX_CE),                     // 1-bit input: Clock enable for IDELAY
        .RX_CLK(RX_CLK),                   // 1-bit input: RX Clock used to sample LOAD, CE, INC
        .RX_CNTVALUEIN(RX_CNTVALUEIN),     // 9-bit input: RX Counter value from device logic
        .RX_EN_VTC(RX_EN_VTC),             // 1-bit input: RX Enable to keep stable delay over VT
        .RX_INC(RX_INC),                   // 1-bit input: RX Increment the current delay tap setting
        .RX_LOAD(RX_LOAD),                 // 1-bit input: RX Load the CNTVALUEIN tap setting
        .RX_RST(RX_RST),                   // 1-bit input: RX Asynchronous assert, synchronous deassert for
        // RXTX_BITSLICE ISERDES

        .RX_RST_DLY(RX_RST_DLY),           // 1-bit input: RX Reset the internal DELAY value to DELAY_VALUE
        .T(T),                             // 1-bit input: Legacy T byte input from device logic
        .TBYTE_IN(TBYTE_IN),               // 1-bit input: Byte group 3-state input from TX_BITSLICE_TRI
        .TX_BIT_CTRL_IN(TX_BIT_CTRL_IN),   // 40-bit input: TX Input bus from BITSLICE_CONTROL
        .TX_CE(TX_CE),                     // 1-bit input: Clock enable for ODELAY
        .TX_CLK(TX_CLK),                   // 1-bit input: TX Clock used to sample LOAD, CE, INC
        .TX_CNTVALUEIN(TX_CNTVALUEIN),     // 9-bit input: TX Counter value from device logic
        .TX_EN_VTC(TX_EN_VTC),             // 1-bit input: TX Enable to keep stable delay over VT
        .TX_INC(TX_INC),                   // 1-bit input: TX Increment the current delay tap setting
        .TX_LOAD(TX_LOAD),                 // 1-bit input: TX Load the CNTVALUEIN tap setting
        .TX_RST(TX_RST),                   // 1-bit input: TX Asynchronous assert, synchronous deassert for
        // RXTX_BITSLICE OSERDES

        .TX_RST_DLY(TX_RST_DLY)            // 1-bit input: TX Reset the internal DELAY value to DELAY_VALUE
    );

    IOBUFDS #(
        .DIFF_TERM("FALSE"),     // Differential Termination ("TRUE"/"FALSE")
        .IBUF_LOW_PWR("TRUE"),   // Low Power - "TRUE", High Performance = "FALSE" 
        .IOSTANDARD("LVDS"), // Specify the I/O standard
        .SLEW("SLOW")            // Specify the output slew rate
    ) IOBUFDS_dqs_inst (
        .O(DATAIN),     // Buffer output
        .IO(dqs_t),   // Diff_p inout (connect directly to top-level port)
        .IOB(dqs_c), // Diff_n inout (connect directly to top-level port)
        .I(O),     // Buffer input
        .T(T_OUT)      // 3-state enable input, high=input, low=output
    );

endmodule

参考文献:
UltraScale 架构 SelectIO 资源 (ug571)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1465933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

制造业客户数据安全解决方案(数据防泄密需求分析)

机械行业是历史悠久的工业形式&#xff0c;与国民经济密切相关&#xff0c;属于周期性行业&#xff0c;是我国最重要的工业制造行业之一。即使网络经济与IT信息技术在世界范围内占据主导地位&#xff0c;依然离不开一个发达的、先进的物质基础&#xff0c;而机械行业正是为生成…

基于springboot+vue的植物健康系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

小迪安全26WEB 攻防-通用漏洞SQL 注入 SqlmapOracleMongodbDB2 等

#知识点&#xff1a; 1、数据库注入-Oracle&Mongodb 2、数据库注入-DB2&SQLite&Sybase 3、SQL 注入神器-SQLMAP 安装使用拓展 数据库注入&#xff1a; 数据库注入-联合猜解-Oracle&Mongodb 1.Oracle数据库一般会在java上执行 参考:https://www.cnblog…

有ai换脸证件照的工具吗?分享3款好用的工具!

在当今数字化时代&#xff0c;随着人工智能技术的飞速发展&#xff0c;AI换脸技术已经成为了一种热门的应用。从电影特效到日常生活中的照片处理&#xff0c;AI换脸技术都为我们带来了前所未有的便捷和乐趣。而在这其中&#xff0c;AI换脸证件照工具更是受到了广大用户的青睐。…

jetson nano——安装archiconda

目录 1.archiconda3我在这提供了下载链接&#xff0c;点解下面链接即可1.看好文件所在位置&#xff0c;如果装错了&#xff0c;那么环境变量的路径自己进行相应的修改。2.添加环境变量 2.可能部分伙伴输入一些激活&#xff0c;啥的命令激活不了&#xff0c;那么输入下面这些代码…

如何在nginx增加健康检查接口

在docker中部署的nginx或者在nginx部署的nginx一般是需要一个健康检查接口的 这样的话&#xff0c;就可以确定容器当前的状态是否是健康的 那么&#xff0c;如何给nginx增加一个健康检查的接口呢&#xff1f; 接下来呢&#xff0c;我们就演示一个在nginx中如何增加健康检查的…

瑞_23种设计模式_装饰者模式

文章目录 1 装饰者模式&#xff08;Decorator Pattern&#xff09;1.1 介绍1.2 概述1.3 装饰者模式的结构 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析5 总结5.1 装饰者模式的优缺点5.2 装饰者模式的使用场景5.3 装饰者模式 VS 代理模式 &#x…

Druid无法登录监控页面

问题表现&#xff1a;在配置和依赖都正确的情况下&#xff0c;无法通过配置的用户名密码登录Druid的监控页面 检查配置发现 配置的用户名和密码和请求中参数是一致的&#x1f914; Debug发现 ResourceServlet 是Druid的登录实现&#xff0c; 且调试发现usernameParam是null&am…

Day17_集合与数据结构(链表,栈和队列,Map,Collections工具类,二叉树,哈希表)

文章目录 Day17 集合与数据结构学习目标1 数据结构2 动态数组2.1 动态数组的特点2.2 自定义动态数组2.3 ArrayList与Vector的区别&#xff1f;2.4 ArrayList部分源码分析1、JDK1.6构造器2、JDK1.7构造器3、JDK1.8构造器4、添加与扩容5、删除元素6、get/set元素7、查询元素8、迭…

【安卓基础5】中级控件

&#x1f3c6;作者简介&#xff1a;|康有为| &#xff0c;大四在读&#xff0c;目前在小米安卓实习&#xff0c;毕业入职 &#x1f3c6;本文收录于 安卓学习大全持续更新中&#xff0c;欢迎关注 &#x1f3c6;安卓学习资料推荐&#xff1a; 视频&#xff1a;b站搜动脑学院 视频…

二进制部署k8集群,搭建单机matser和etcd集群

单机matser预部署设计 组件部署&#xff1a; mater节点 mater01 192.168.66.10 kube-apiserver kube-controller-manager kube-scheduler etcd node节点 node01 192.168.66.30 kubelet kube-proxy docker &…

在 Windows 上使用 VC++ 编译 OpenSSL 源码的步骤

在 Windows 上使用 VC 编译 OpenSSL 源码的步骤如下&#xff1a; 准备工作 安装 Visual Studio 2017 或更高版本。安装 Perl 脚本解释器。安装 NASM 汇编器。 编译步骤 下载 OpenSSL 源码。解压 OpenSSL 源码。打开命令行工具&#xff0c;并进入 OpenSSL 源码目录。运行以下…

Linux常见指令(2)

目录 1、tar指令 &#xff01; 2、bc指令 3、uname 4、重要热键 5、关机 1、tar指令 &#xff01; 功能&#xff1a;压缩/解压缩文件或目录,类似zip 我们先来看一下我们的文件即目录&#xff0c;接下来我们输入指令&#xff1a; tar -czf test.tgz test 压缩 -c &#xf…

Linux调试器——gdb的基础使用

目录 1.背景 2.指令的使用 2.1gdb的使用和退出 2.2显示源代码 2.3运行程序 2.4调试 1.打断点 2.查断点 3.去断点 4.运行 5.关闭断点 6.启用断点 7.逐过程 8.进入函数 9.显示变量的值 1.背景 众所周知&#xff0c;我们的程序发布有两种&#xff0c;分别是debug模式和release模式…

【Azure 架构师学习笔记】- Azure Databricks (10) -- UC 使用

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (9) – UC权限 在前面的文章&#xff1a;【Azure 架构师学习笔记】- Azure Databricks (6) - 配置Unity Catalog中演示了如何配置一个UC。 本文…

深度剖析Selenium与Scrapy的黄金组合:实现动态网页爬虫

在当今互联网时代&#xff0c;大量网站采用动态网页技术呈现信息&#xff0c;这给爬虫技术提出了新的挑战。本文将带您深入探讨如何应对动态网页的爬取难题&#xff0c;结合Python爬虫框架Scrapy和自动化测试工具Selenium进行实战&#xff0c;为您揭示动态网页爬取的技术奥秘。…

阿里巴巴中国站获得淘口令真实url API(1688.item_password)

阿里巴巴&#xff08;1688.com&#xff09;是一个B2B电商平台&#xff0c;而淘口令&#xff08;或称为淘宝口令&#xff09;是一种在阿里巴巴集团旗下的淘宝和天猫平台中分享商品或活动链接的特殊形式。淘口令通常包含一串字符&#xff0c;用户可以复制这串字符并在淘宝或天猫的…

ffmpeg深度学习滤镜

环境搭建 安装显卡驱动 当前所用显卡为NVIDIA的P6000,在英伟达的官网上查看对应的驱动, 下载NVIDIA-Linux-x86_64-535.104.05.run并安装。 sudo ./NVIDIA-Linux-x86_64-535.104.05.run 安装成功后用nvidia-smi命令后查看 安装的cuda版本不能超过12.2,选择安装cuda11.8。…

高并发Server的基石:reactor反应堆模式

业务开发同学只关心业务处理流程。但是我们开发的程序都是运行服务端server上&#xff0c;服务端server接收到IO请求后&#xff0c;是如何处理请求并最终进入业务流程的呢&#xff1f;这里不得不提到reactor反应堆模型。nginx tomcat redis nodejs dubbo等软件的网络处理模型都…

《Linux C编程实战》笔记:信号量

信号量在操作系统的书里一般都有介绍&#xff0c;这里就只写书上说的了。 信号量是一个计数器&#xff0c;常用于处理进程或线程的同步问题&#xff0c;特别是对临界资源访问的同步。临界资源可以简单地理解为在某一时刻只能由一个进程或线程进行操作的资源&#xff0c;这里的…