// ---------------------------------------------------------------------- // "THE BEER-WARE LICENSE" (Revision 42): // and wrote this // file. As long as you retain this notice you can do whatever you // want with this stuff. If we meet some day, and you think this // stuff is worth it, you can buy me a beer in return Yasunori // Osana and Akinobu Tomori at University of the Ryukyus, Japan. // ---------------------------------------------------------------------- // OpenFC project: an open FPGA accelerated cluster toolkit // Kyokko project: an open Multi-vendor Aurora 64B/66B-compatible link // // Modules in this file: // kyokko_rx_cb: Kyokko Rx channel-bonding synchronizer // ---------------------------------------------------------------------- `default_nettype none module kyokko_rx_cb # ( parameter BondingCh = 4 ) ( input wire CLK, RST, input wire [BondingCh-1:0] RX_IS_CB, output reg [BondingCh-1:0] CB_STAT, output reg [BondingCh-1:0] FIFO_RE, output wire TIMEOUT); parameter CB_Timeout = 3; parameter CB_Clear_cnt = 10; parameter CB_Limit = 400; reg [BondingCh-1:0] CB; reg [4:0] CNT; reg [7:0] CB_Clear; always @ (posedge CLK) begin if (RST) begin CB_STAT <= 1; CNT <= 0; CB_Clear <= 0; end else begin case (CB_STAT) 'b0001: begin CNT <= 0; CB_STAT <= (CB_Clear == CB_Clear_cnt) ? 'b0100: ( RX_IS_CB ? 'b0010: 'b0001 ); end 'b0010: begin if (CNT == CB_Timeout) begin if (&CB) CB_Clear <= CB_Clear +1; else CB_Clear <= 0; // Reset on fail CB_STAT <= 'b0001; end else CNT <= CNT +1; end // case: 'b001 'b0100: begin // Wait for all FIFO_RE goes down if (&(~FIFO_RE)) begin CB_STAT <= 'b1000; end end 'b1000: begin // Ready // non-synchronous CB detection if ((RX_IS_CB != 0) && (&RX_IS_CB == 0)) begin CB_STAT <= 'b001; CNT <= 0; CB_Clear <= 0; end end default: CB_STAT <= 1; endcase // case (CB_STAT) end end // always @ (posedge CLK) /* // 4-lane always @ (posedge CLK) begin if (RST) begin CB <= 0; FIFO_RE <= {BondingCh{'b1}}; end else begin if (|CB_STAT[1:0]) begin if (CB_STAT[1] & CNT == CB_Timeout) CB <= 0; else begin if (RX_IS_CB[0]) CB[0] <= 1; if (RX_IS_CB[1]) CB[1] <= 1; if (RX_IS_CB[2]) CB[2] <= 1; if (RX_IS_CB[3]) CB[3] <= 1; end end if (CB_STAT[2]) begin if (&(~FIFO_RE)) FIFO_RE <= 'b1111; else begin if (RX_IS_CB[0]) FIFO_RE[0] <= 0; if (RX_IS_CB[1]) FIFO_RE[1] <= 0; if (RX_IS_CB[2]) FIFO_RE[2] <= 0; if (RX_IS_CB[3]) FIFO_RE[3] <= 0; end end end // else: !if(RST) end // always @ (posedge CLK) */ // n-lane version wire [BondingCh-1:0] CB_CNT_FULL; wire [BondingCh-1:0] CB_WAIT_CNT_FULL; genvar lane; generate for (lane=0; lane