147 lines
5.2 KiB
Systemverilog
147 lines
5.2 KiB
Systemverilog
|
// (C) 2001-2015 Altera Corporation. All rights reserved.
|
||
|
// Your use of Altera Corporation's design tools, logic functions and other
|
||
|
// software and tools, and its AMPP partner logic functions, and any output
|
||
|
// files any of the foregoing (including device programming or simulation
|
||
|
// files), and any associated documentation or information are expressly subject
|
||
|
// to the terms and conditions of the Altera Program License Subscription
|
||
|
// Agreement, Altera MegaCore Function License Agreement, or other applicable
|
||
|
// license agreement, including, without limitation, that your use is for the
|
||
|
// sole purpose of programming logic devices manufactured by Altera and sold by
|
||
|
// Altera or its authorized distributors. Please refer to the applicable
|
||
|
// agreement for further details.
|
||
|
|
||
|
|
||
|
|
||
|
`timescale 1 ps / 1 ps
|
||
|
|
||
|
// altera message_off 10230
|
||
|
module sequencer_scc_acv_wrapper
|
||
|
# (parameter
|
||
|
|
||
|
DATAWIDTH = 24,
|
||
|
IO_SDATA_BITS = 11,
|
||
|
DQS_SDATA_BITS = 46,
|
||
|
AVL_DATA_WIDTH = 32,
|
||
|
DLL_DELAY_CHAIN_LENGTH = 6,
|
||
|
USE_2X_DLL = "false"
|
||
|
|
||
|
)
|
||
|
(
|
||
|
|
||
|
reset_n_scc_clk,
|
||
|
scc_clk,
|
||
|
scc_dataout,
|
||
|
scc_io_cfg,
|
||
|
scc_dqs_cfg
|
||
|
);
|
||
|
|
||
|
input scc_clk;
|
||
|
input reset_n_scc_clk;
|
||
|
input [DATAWIDTH-1:0] scc_dataout;
|
||
|
output [IO_SDATA_BITS - 1:0] scc_io_cfg;
|
||
|
output [DQS_SDATA_BITS - 1:0] scc_dqs_cfg;
|
||
|
|
||
|
typedef enum integer {
|
||
|
SCC_ADDR_DQS_IN_DELAY = 'b0001,
|
||
|
SCC_ADDR_DQS_EN_PHASE = 'b0010,
|
||
|
SCC_ADDR_DQS_EN_DELAY = 'b0011,
|
||
|
SCC_ADDR_DQDQS_OUT_PHASE= 'b0100,
|
||
|
SCC_ADDR_OCT_OUT1_DELAY = 'b0101,
|
||
|
SCC_ADDR_OCT_OUT2_DELAY = 'b0110,
|
||
|
SCC_ADDR_IO_OUT1_DELAY = 'b0111,
|
||
|
SCC_ADDR_IO_OUT2_DELAY = 'b1000,
|
||
|
SCC_ADDR_IO_IN_DELAY = 'b1001,
|
||
|
SCC_ADDR_DQS_BYPASS = 'b1010,
|
||
|
SCC_ADDR_DQ_BYPASS = 'b1011,
|
||
|
SCC_ADDR_RFIFO_MODE = 'b1100
|
||
|
} sdata_addr_t;
|
||
|
|
||
|
wire [DATAWIDTH-1:0] scc_dataout;
|
||
|
reg [IO_SDATA_BITS - 1:0] scc_io_cfg;
|
||
|
reg [DQS_SDATA_BITS - 1:0] scc_dqs_cfg;
|
||
|
|
||
|
wire [3:0] dqse_phase;
|
||
|
|
||
|
typedef bit [6:0] t_setting_mask;
|
||
|
|
||
|
integer unsigned setting_offsets[1:12] = '{ 'd0, 'd5, 'd8, 'd13, 'd13, 'd18, 'd0, 'd5, 'd5 , 'd18, 'd10, 'd11};
|
||
|
t_setting_mask setting_masks [1:12] = '{ 'b011111, 'b0111, 'b011111, 'b0, 'b011111, 'b0, 'b011111, 'b0, 'b011111, 'b01, 'b01, 'b0111 };
|
||
|
|
||
|
// decode phases
|
||
|
|
||
|
sequencer_scc_acv_phase_decode # (
|
||
|
.AVL_DATA_WIDTH (DATAWIDTH ),
|
||
|
.DLL_DELAY_CHAIN_LENGTH (DLL_DELAY_CHAIN_LENGTH ),
|
||
|
.USE_2X_DLL (USE_2X_DLL)
|
||
|
) sequencer_scc_phase_decode_dqe_inst (
|
||
|
.avl_writedata ((scc_dataout >> setting_offsets[SCC_ADDR_DQS_EN_PHASE]) & setting_masks[SCC_ADDR_DQS_EN_PHASE]),
|
||
|
.dqse_phase (dqse_phase )
|
||
|
);
|
||
|
|
||
|
always_ff @ (posedge scc_clk or negedge reset_n_scc_clk) begin
|
||
|
if (~reset_n_scc_clk) begin
|
||
|
scc_io_cfg <= '0;
|
||
|
scc_dqs_cfg <= '0;
|
||
|
end
|
||
|
else begin
|
||
|
scc_io_cfg <= '0;
|
||
|
scc_dqs_cfg <= '0;
|
||
|
|
||
|
|
||
|
// DQS
|
||
|
|
||
|
// T11 Ungating (using same as T11 Gating for now)
|
||
|
scc_dqs_cfg[4:0] <= (scc_dataout >> setting_offsets[SCC_ADDR_DQS_EN_DELAY]) & ({'0, setting_masks[SCC_ADDR_DQS_EN_DELAY]});
|
||
|
|
||
|
// T11 Gating (using same as T11 ungating for now)
|
||
|
scc_dqs_cfg[9:5] <= (scc_dataout >> setting_offsets[SCC_ADDR_DQS_EN_DELAY]) & ({'0, setting_masks[SCC_ADDR_DQS_EN_DELAY]});
|
||
|
|
||
|
scc_dqs_cfg[10] <= dqse_phase[3];
|
||
|
|
||
|
scc_dqs_cfg[15:11] <= (scc_dataout >> setting_offsets[SCC_ADDR_OCT_OUT1_DELAY]) & ({'0, setting_masks[SCC_ADDR_OCT_OUT1_DELAY]});
|
||
|
|
||
|
// Bypass DQS Logic half-rate (0 engage, 1 bypass)
|
||
|
scc_dqs_cfg[16] <= (scc_dataout >> setting_offsets[SCC_ADDR_DQS_BYPASS]) & ({'0, setting_masks[SCC_ADDR_DQS_BYPASS]});
|
||
|
|
||
|
scc_dqs_cfg[21:17] <= (scc_dataout >> setting_offsets[SCC_ADDR_DQS_IN_DELAY]) & ({'0, setting_masks[SCC_ADDR_DQS_IN_DELAY]});
|
||
|
|
||
|
scc_dqs_cfg[22] <= dqse_phase[2];
|
||
|
|
||
|
scc_dqs_cfg[24:23] <= dqse_phase[1:0];
|
||
|
|
||
|
|
||
|
// I/O
|
||
|
|
||
|
scc_io_cfg[4:0] <= (scc_dataout >> setting_offsets[SCC_ADDR_IO_IN_DELAY]) & ({'0, setting_masks[SCC_ADDR_IO_IN_DELAY]});
|
||
|
|
||
|
// T9 OE (using same as T9 output)
|
||
|
scc_io_cfg[9:5] <= (scc_dataout >> setting_offsets[SCC_ADDR_IO_OUT1_DELAY]) & ({'0, setting_masks[SCC_ADDR_IO_OUT1_DELAY]});
|
||
|
|
||
|
// T9 output (using same as T9 OE)
|
||
|
scc_io_cfg[14:10] <= (scc_dataout >> setting_offsets[SCC_ADDR_IO_OUT1_DELAY]) & ({'0, setting_masks[SCC_ADDR_IO_OUT1_DELAY]});
|
||
|
|
||
|
// Input register Read Fifo mode:
|
||
|
// 000: half-rate read fifo
|
||
|
// 001: full-rate read fifo
|
||
|
// 010: deserializer bit slip
|
||
|
// 011: deserializer with input from bit-slip
|
||
|
// 100: deserializer with input from IO
|
||
|
// 101: serializer mode
|
||
|
scc_io_cfg[17:15] <= (scc_dataout >> setting_offsets[SCC_ADDR_RFIFO_MODE]) & ({'0, setting_masks[SCC_ADDR_RFIFO_MODE]});
|
||
|
|
||
|
// Read FIFO Read Clock Source Select
|
||
|
// 00: Select core CLKIN1
|
||
|
// 01: Select DQS_CLK (PHY_CLK)
|
||
|
// 10: Select SEQ_HR_CLK (PHY_CLK)
|
||
|
// 11: Select VCC (Disabled)
|
||
|
scc_io_cfg[19:18] <= (((scc_dataout >> setting_offsets[SCC_ADDR_RFIFO_MODE]) & ({'0, setting_masks[SCC_ADDR_RFIFO_MODE]})) == 3'b001) ? 2'b01 : 2'b10;
|
||
|
|
||
|
// bypass IOE Register half-rate register
|
||
|
// 0: engage half-rate register
|
||
|
// 1: bypass half-rate register
|
||
|
scc_io_cfg[20] <= (scc_dataout >> setting_offsets[SCC_ADDR_DQ_BYPASS]) & ({'0, setting_masks[SCC_ADDR_DQ_BYPASS]});
|
||
|
end
|
||
|
end
|
||
|
|
||
|
endmodule
|