x393  1.0
FPGAcodeforElphelNC393camera
mcontr_sequencer.v
Go to the documentation of this file.
1 
39 `timescale 1ns/1ps
40 
42 //command interface parameters
43 //0x1080..10ff - 8- bit data - to set various delay values
44  parameter DLY_LD = 'h080, // address to generate delay load
45  parameter DLY_LD_MASK = 'h780, // address mask to generate delay load
46 // 0x1080..109f - set delay for SDD0-SDD7
47 // 0x10a0..10bf - set delay for SDD8-SDD15
48 // 0x10c0..10df - set delay for SD_CMDA
49 // 0x10e0 - set delay for MMCM
50 //0x1000..103f - 0- bit data (set/reset)
51  parameter MCONTR_PHY_0BIT_ADDR = 'h020, // address to set sequnecer channel and run (4 LSB-s - channel)
52  parameter MCONTR_PHY_0BIT_ADDR_MASK = 'h7f0, // address mask to generate sequencer channel/run
53 // 0x1024..1025 - CMDA_EN // 0 bits - enable/disable command/address outputs
54 // 0x1026..1027 - SDRST_ACT // 0 bits - enable/disable active-low reset signal to DDR3 memory
55 // 0x1028..1029 - CKE_EN // 0 bits - enable/disable CKE signal to memory
56 // 0x102a..102b - DCI_RST // 0 bits - enable/disable CKE signal to memory
57 // 0x102c..102d - DLY_RST // 0 bits - enable/disable CKE signal to memory
58  parameter MCONTR_PHY_0BIT_DLY_SET = 'h0, // set pre-programmed delays
59 
60  parameter MCONTR_PHY_0BIT_CMDA_EN = 'h4, // enable/disable command/address outputs
61  parameter MCONTR_PHY_0BIT_SDRST_ACT = 'h6, // enable/disable active-low reset signal to DDR3 memory
62  parameter MCONTR_PHY_0BIT_CKE_EN = 'h8, // enable/disable CKE signal to memory
63  parameter MCONTR_PHY_0BIT_DCI_RST = 'ha, // enable/disable CKE signal to memory
64  parameter MCONTR_PHY_0BIT_DLY_RST = 'hc, // enable/disable CKE signal to memory
65  parameter MCONTR_PHY_STATUS_REG_ADDR= 'h0, // status register address to use for memory controller phy
66 //0x1040..107f - 16-bit data
67 // 0x1040..104f - RUN_CHN // address to set sequncer channel and run (4 LSB-s - channel) - bits?
68 // parameter RUN_CHN_REL = 'h040, // address to set sequnecer channel and run (4 LSB-s - channel)
69 // parameter RUN_CHN_REL_MASK = 'h7f0, // address mask to generate sequencer channel/run
70 // 0x1050..1057: MCONTR_PHY16
71  parameter MCONTR_PHY_16BIT_ADDR = 'h050, // address to set sequnecer channel and run (4 LSB-s - channel)
72  parameter MCONTR_PHY_16BIT_ADDR_MASK = 'h7f8, // address mask to generate sequencer channel/run
73  parameter MCONTR_PHY_16BIT_PATTERNS = 'h0, // set DQM and DQS patterns (16'h0055)
74  parameter MCONTR_PHY_16BIT_PATTERNS_TRI = 'h1, // 16-bit address to set DQM and DQS tristate on/off patterns {dqs_off,dqs_on, dq_off,dq_on} - 4 bits each
75  parameter MCONTR_PHY_16BIT_WBUF_DELAY = 'h2, // 4? bits - extra delay (in mclk cycles) to add to write buffer enable (DDR3 read data)
76  parameter MCONTR_PHY_16BIT_EXTRA = 'h3, // ? bits - set extra parameters (currently just inv_clk_div)
77  parameter MCONTR_PHY_STATUS_CNTRL = 'h4, // write to status control (8-bit)
78 
79  parameter DFLT_DQS_PATTERN= 8'h55,
80  parameter DFLT_DQM_PATTERN= 8'h00, // 8'h00
81  parameter DFLT_DQ_TRI_ON_PATTERN= 4'h7, // DQ tri-state control word, first when enabling output
82  parameter DFLT_DQ_TRI_OFF_PATTERN= 4'he, // DQ tri-state control word, first after disabling output
83  parameter DFLT_DQS_TRI_ON_PATTERN= 4'h3, // DQS tri-state control word, first when enabling output
84  parameter DFLT_DQS_TRI_OFF_PATTERN=4'hc,// DQS tri-state control word, first after disabling output
85  parameter DFLT_WBUF_DELAY= 4'h8, // write levelling - 7!
86  parameter DFLT_INV_CLK_DIV= 1'b0,
87 
88  parameter PHASE_WIDTH = 8,
89  parameter SLEW_DQ = "SLOW",
90  parameter SLEW_DQS = "SLOW",
91  parameter SLEW_CMDA = "SLOW",
92  parameter SLEW_CLK = "SLOW",
93  parameter IBUF_LOW_PWR = "TRUE",
94  parameter real REFCLK_FREQUENCY = 300.0,
95  parameter HIGH_PERFORMANCE_MODE = "FALSE",
96  parameter CLKIN_PERIOD = 10, //ns >1.25, 600<Fvco<1200
97  parameter CLKFBOUT_MULT = 8, // Fvco=Fclkin*CLKFBOUT_MULT_F/DIVCLK_DIVIDE, Fout=Fvco/CLKOUT#_DIVIDE
98  parameter DIVCLK_DIVIDE= 1,
99  parameter CLKFBOUT_USE_FINE_PS= 1, // 0 - old, 1 - new
100  parameter CLKFBOUT_PHASE = 0.000,
101  parameter SDCLK_PHASE = 0.000,
102  parameter CLK_PHASE = 0.000,
103  parameter CLK_DIV_PHASE = 0.000,
104  parameter MCLK_PHASE = 90.000,
105  parameter REF_JITTER1 = 0.010,
106  parameter SS_EN = "FALSE",
107  parameter SS_MODE = "CENTER_HIGH",
108  parameter SS_MOD_PERIOD = 10000,
109  parameter CMD_PAUSE_BITS= 10,
110  parameter CMD_DONE_BIT= 10
111 )(
112  // DDR3 interface
113  output SDRST, // DDR3 reset (active low)
114  output SDCLK, // DDR3 clock differential output, positive
115  output SDNCLK,// DDR3 clock differential output, negative
116  output [ADDRESS_NUMBER-1:0] SDA, // output address ports (14:0) for 4Gb device
117  output [2:0] SDBA, // output bank address ports
118  output SDWE, // output WE port
119  output SDRAS, // output RAS port
120  output SDCAS, // output CAS port
121  output SDCKE, // output Clock Enable port
122  output SDODT, // output ODT port
123 
124  inout [15:0] SDD, // DQ I/O pads
125  output SDDML, // LDM I/O pad (actually only output)
126  inout DQSL, // LDQS I/O pad
127  inout NDQSL, // ~LDQS I/O pad
128  output SDDMU, // UDM I/O pad (actually only output)
129  inout DQSU, // UDQS I/O pad
130  inout NDQSU, // ~UDQS I/O pad
131 // clocks, reset
132  input clk_in,
133  input rst_in,
134  output mclk, // global clock, half DDR3 clock, synchronizes all I/O through the command port
135  input mrst, // @posedge mclk, sync reset (should not interrupt mclk!)
136  output locked, // to generate sync reset
137  input ref_clk, // global clock for idelay_ctrl calibration
139 // command port 0 (filled by software - 32w->32r) - used for mode set, refresh, write levelling, ...
140  input cmd0_clk,
141  input cmd0_we,
142  input [9:0] cmd0_addr,
143  input [31:0] cmd0_data,
144 // automatic command port1 , filled by the PL, 32w 32r, used for actual page R/W
145  input cmd1_clk,
146  input cmd1_we,
147  input [9:0] cmd1_addr,
148  input [31:0] cmd1_data,
149 // Controller run interface, posedge mclk
150  input [10:0] run_addr, // controller sequencer start address (0..11'h3ff - cmd0, 11'h400..11'h7ff - cmd1)
151  input [3:0] run_chn, // data channel to use
152  input run_refresh, // command is refresh (invalidates channel)
153  input run_seq, // start controller sequence (will end with !ddr_rst for stable mclk)
154  output run_done, // controller sequence finished
155  output run_busy, // controller sequence in progress
156  output mcontr_reset, // == ddr_reset that also resets sequencer
157  // programming interface
158  input [7:0] cmd_ad, // byte-serial command address/data (up to 6 bytes: AL-AH-D0-D1-D2-D3
159  input cmd_stb, // strobe (with first byte) for the command a/d
160  output [7:0] status_ad, // status address/data - up to 5 bytes: A - {seq,status[1:0]} - status[2:9] - status[10:17] - status[18:25]
161  output status_rq, // input request to send status downstream
162  input status_start, // Acknowledge of the first status packet byte (address)
163 
164 // Interface to write-to-memory buffers (up to 16)
165 // There will be =1 cycle external latency in address/re and 1 cycle latency in read data (should match sequence programs)
166 // Address data is sync to posedge mclk
167  output ext_buf_page_nxt, // Generated for both reads and writes, @posedge mclk
168  output ext_buf_rd,
169  output ext_buf_rpage_nxt, // increment external buffer read address to next page start
170 // output [6:0] ext_buf_raddr, // valid with ext_buf_rd, 2 page MSB to be generated externally
171  output [3:0] ext_buf_rchn, // ==run_chn_d valid 1 cycle ahead opf ext_buf_rd!, maybe not needed - will be generated externally
172  output ext_buf_rrefresh, // was refresh, invalidates ext_buf_rchn
173  output ext_buf_rrun, // run read sequence (to be used with external buffer to set initial address
174  input [63:0] ext_buf_rdata, // Latency of ram_1kx32w_512x64r plus 2
175 
176 // Interface to memory read channels (up to 16)
177 // Address/data sync to negedge mclk!, any latency OK - just generate DONE appropriately (through the sequencer with delay?
178 // folowing a sync to negedge!
179  output ext_buf_wr,
180  output ext_buf_wpage_nxt, // increment external buffer write address to next page start
181 // output [6:0] ext_buf_waddr, // valid with ext_buf_wr
182  output [3:0] ext_buf_wchn, // external buffer channel with timing matching buffer writes
183  output ext_buf_wrefresh, // was refresh, invalidates ext_buf_wchn
184  output ext_buf_wrun, // @negedge,first cycle of sequencer run matching write delay
185  output [63:0] ext_buf_wdata, // valid with ext_buf_wr
186 // temporary debug data
187  output [11:0] tmp_debug
188 );
189  localparam ADDRESS_NUMBER = 15;
190  wire [7:0] dly_data;
191  wire [6:0] dly_addr;
192  wire ld_delay;
193  wire set;
194  wire [3:0] phy_0bit_addr;
196  reg cmda_en; // enable (!tristate) command and address lines // not likely to be used
197  reg ddr_rst=1; // generate reset to DDR3 memory (active high)
198  reg dci_rst; // active high - reset DCI circuitry
199  reg dly_rst; // active high - delay calibration circuitry
200  reg ddr_cke; // DDR clock enable , XOR-ed with command bit
201 
202  reg [7:0] dqs_pattern=DFLT_DQS_PATTERN; // 8'h55
203  reg [7:0] dqm_pattern=DFLT_DQM_PATTERN; // 8'h00
204  reg [ 3:0] dq_tri_on_pattern=DFLT_DQ_TRI_ON_PATTERN; // DQ tri-state control word, first when enabling output
205  reg [ 3:0] dq_tri_off_pattern=DFLT_DQ_TRI_OFF_PATTERN; // DQ tri-state control word, first after disabling output
206  reg [ 3:0] dqs_tri_on_pattern=DFLT_DQS_TRI_ON_PATTERN; // DQS tri-state control word, first when enabling output
207  reg [ 3:0] dqs_tri_off_pattern=DFLT_DQS_TRI_OFF_PATTERN;// DQS tri-state control word, first after disabling output
209  wire [ 3:0] wbuf_delay_m1;
210 
211  wire [2:0] phy_16bit_addr;
212  wire [15:0] phy_16bit_data;
214 
215  reg inv_clk_div=0;
216 
217 // Status data:
218 
221  wire dly_ready;
222  wire dci_ready;
223 
224 
225 // wire [PHASE_WIDTH-1:0] ps_out;
226  wire [7:0] ps_out;
227  wire ps_rdy;
228 // wire locked;
229  wire [14:0] status_data;
230 
231 // temporary, debug
232  wire phy_locked_mmcm; // before clock crossing
233  wire phy_locked_pll; // before clock crossing
234  wire phy_dly_ready; // before clock crossing
235  wire phy_dci_ready; // before clock crossing
236 
237 
238 // wire [35:0] phy_cmd; // input[35:0]
239  wire [31:0] phy_cmd_word; // selected output from either cmd0 buffer or cmd1 buffer
240  wire [31:0] phy_cmd0_word; // cmd0 buffer output
241  wire [31:0] phy_cmd1_word; // cmd1 buffer output
243  reg buf_addr_reset; // generated regardless of read/write
246  wire [63:0] buf_wdata; // output[63:0]
247  reg [63:0] buf_wdata_negedge; // output[63:0]
248  wire [63:0] buf_rdata; // multiplexed input from one of the write channels buffer
249  wire buf_wr; // delayed by specified number of clock cycles
250  wire buf_wr_ndly; // before dealy
251  wire buf_rd; // read next 64 bits from the buffer, need one extra pre-read
252  wire buf_rst; // reset buffer address to
253  wire buf_rst_d; //buf_rst delayed to match buf_wr
254  reg [ 9:0] cmd_addr; // command word address
255  reg cmd_sel;
256  reg [ 2:0] cmd_busy; // bit 0 - immediately,
257  wire phy_cmd_nop; // decoded command (ras, cas, we) was NOP
258  wire phy_cmd_add_pause; // decoded from the command word - add one pause command after the current one
259  reg add_pause; // previos command had phy_cmd_add_pause set
262  reg cmd_fetch; // previous cycle command was read from the command memory, current: command valid
263  wire pause; // do not register new data from the command memory
265 
266  wire [3:0] run_chn_w_d; // run chn delayed to match buf_wr delay
267  wire run_refresh_w_d; // run refresh delayed to match buf_wr delay
268  wire run_w_d;
269 
270  reg [3:0] run_chn_d;
272 
276 
277  reg run_seq_d;
278  reg mem_read_mode; // last was buf_wr, not buf_rd
279 
280  wire [7:0] tmp_debug_a;
281  assign tmp_debug[11:0] =
286  tmp_debug_a[7:0]};
287 
288  assign mcontr_reset=ddr_rst; // to reset controller
289  assign run_done=sequence_done; // & cmd_busy[2]; // limit done to 1 cycle only even if duration is non-zero - already set in pause_len
290  assign run_busy=cmd_busy[0]; //earliest
291  assign pause=cmd_fetch? (phy_cmd_add_pause || (phy_cmd_nop && (pause_len != 0))): (cmd_busy[2] && (pause_cntr[CMD_PAUSE_BITS-1:1]!=0));
292 /// debugging
293 // assign phy_cmd_word = cmd_sel?phy_cmd1_word:phy_cmd0_word; // TODO: hangs even with 0-s in phy_cmd
294  assign phy_cmd_word = (cmd_sel?phy_cmd1_word:phy_cmd0_word) & {32{cmd_busy[2]}}; // TODO: hangs even with 0-s in phy_cmd
295 
296 
297 /// assign phy_cmd_word = phy_cmd_word?0:0;
298 
299 // assign buf_rdata[63:0] = ({64{buf_sel_1hot[1]}} & buf1_rdata[63:0]); // ORed with other read channels terms
300 
301 // External buffers buffer related signals
302 
303 // assign buf_raddr_reset= buf_rst & ~mem_read_mode; // run_seq_d;
304  assign ext_buf_rd= buf_rd;
307 // assign ext_buf_raddr= buf_raddr;
308  assign ext_buf_rchn= run_chn_d;
310  assign buf_rdata[63:0] = ext_buf_rdata;
311  assign ext_buf_rrun=run_seq_d;
312 
313  assign ext_buf_wr= buf_wr_negedge;
315 // assign ext_buf_waddr= buf_waddr_negedge;
320 // generation of the control signals from byte-serial channel
321 // generate 8-bit delay data
323  .ADDR (DLY_LD),
324  .ADDR_MASK (DLY_LD_MASK),
325  .NUM_CYCLES (3),
326  .ADDR_WIDTH (7),
327  .DATA_WIDTH (8)
328  ) cmd_deser_dly_i (
329  .rst (1'b0), // rst), // input
330  .clk (mclk), // input
331  .srst (mrst), // input
332  .ad (cmd_ad), // input[7:0]
333  .stb (cmd_stb), // input
334  .addr (dly_addr), // output[15:0]
335  .data (dly_data), // output[31:0]
336  .we( ld_delay) // output
337  );
338 // generate on/off dependent on lsb and 0-bit commands
340  .ADDR (MCONTR_PHY_0BIT_ADDR),
341  .ADDR_MASK (MCONTR_PHY_0BIT_ADDR_MASK),
342  .NUM_CYCLES (2),
343  .ADDR_WIDTH (4),
344  .DATA_WIDTH (0)
345  ) cmd_deser_0bit_i (
346  .rst (1'b0), // rst), // input
347  .clk (mclk), // input
348  .srst (mrst), // input
349  .ad (cmd_ad), // input[7:0]
350  .stb (cmd_stb), // input
351  .addr (phy_0bit_addr), // output[15:0]
352  .data (), // output[31:0]
353  .we (phy_0bit_we) // output
354  );
355 
357  always @ (posedge mclk) begin
358  if (mrst) cmda_en <= 0;
360 
361  if (mrst) ddr_rst <= 1;
363 
364  if (mrst) dci_rst <= 0;
366 
367  if (mrst) dly_rst <= 0;
369 
370  if (mrst) ddr_cke <= 0;
371  else if (phy_0bit_we && (phy_0bit_addr[3:1]==(MCONTR_PHY_0BIT_CKE_EN>>1))) ddr_cke <= phy_0bit_addr[0];
372  end
373 
374 // generate 16-bit data commands (and set defaults to registers)
376  .ADDR (MCONTR_PHY_16BIT_ADDR),
377  .ADDR_MASK (MCONTR_PHY_16BIT_ADDR_MASK),
378  .NUM_CYCLES (4),
379  .ADDR_WIDTH (3),
380  .DATA_WIDTH (16)
381  ) cmd_deser_16bit_i (
382  .rst (1'b0), // rst), // input
383  .clk (mclk), // input
384  .srst (mrst), // input
385  .ad (cmd_ad), // input[7:0]
386  .stb (cmd_stb), // input
387  .addr (phy_16bit_addr), // output[15:0]
388  .data (phy_16bit_data), // output[31:0]
389  .we (phy_16bit_we) // output
390  );
394  wire set_extra;
395 
396  wire control_status_we; // share with write delay (8-but)?
398 
404  assign contral_status_data= phy_16bit_data[7:0];
405 
406  always @ (posedge mclk) begin
407  if (mrst) begin
410  end else if (set_patterns) begin
411  dqm_pattern <= phy_16bit_data[15:8];
412  dqs_pattern <= phy_16bit_data[7:0];
413  end
414 
415  if (mrst) begin
420  end else if (set_patterns_tri) begin
421  dqs_tri_off_pattern[3:0] <= phy_16bit_data[15:12];
422  dqs_tri_on_pattern[3:0] <= phy_16bit_data[11: 8];
423  dq_tri_off_pattern[3:0] <= phy_16bit_data[ 7: 4];
424  dq_tri_on_pattern[3:0] <= phy_16bit_data[ 3: 0];
425  end
427  else if (set_wbuf_delay) wbuf_delay <= phy_16bit_data[ 3: 0];
428 
430  else if (set_extra) inv_clk_div <= phy_16bit_data[0];
431  end
432 
433 // TODO: status
434  assign locked=locked_mmcm && locked_pll;
435 // assign status_data={dly_ready,dci_ready, locked_mmcm, locked_pll, run_busy,locked,ps_rdy,ps_out[7:0]};
438  .STATUS_REG_ADDR (MCONTR_PHY_STATUS_REG_ADDR),
439  .PAYLOAD_BITS (15)
440  ) status_generate_i (
441  .rst (1'b0), // rst), // input
442  .clk (mclk), // input
443  .srst (mrst), // input
444  .we (control_status_we), // input
445  .wd (contral_status_data), // input[7:0]
446  .status (status_data), // input[25:0]
447  .ad (status_ad), // output[7:0]
448  .rq (status_rq), // output
449  .start (status_start) // input
450  );
451 
452 
453  always @ (posedge mclk) begin
454  if (mrst) cmd_busy <= 0;
455  else if (ddr_rst) cmd_busy <= 0; // *************** reset sequencer with DDR reset
456  else if (sequence_done && cmd_busy[2]) cmd_busy <= 0;
457  else cmd_busy <= {cmd_busy[1:0],run_seq | cmd_busy[0]};
458  // Pause counter
459  if (mrst) pause_cntr <= 0;
460  else if (!cmd_busy[1]) pause_cntr <= 0; // not needed?
461  else if (cmd_fetch && phy_cmd_nop) pause_cntr <= pause_len;
462  else if (pause_cntr!=0) pause_cntr <= pause_cntr-1; //SuppressThisWarning ISExst Result of 32-bit expression is truncated to fit in 10-bit target.
463  // Fetch - command data valid
464  if (mrst) cmd_fetch <= 0;
465  else cmd_fetch <= cmd_busy[0] && !pause;
466 
467  if (mrst) add_pause <= 0;
469 
470  // Command read address
471  if (mrst) cmd_addr <= 0;
472  else if (run_seq) cmd_addr <= run_addr[9:0];
473  else if (cmd_busy[0] && !pause) cmd_addr <= cmd_addr + 1; //SuppressThisWarning ISExst Result of 11-bit expression is truncated to fit in 10-bit target.
474  // command bank select (0 - "manual" (software programmed sequences), 1 - "auto" (normal block r/w)
475  if (mrst) cmd_sel <= 0;
476  else if (run_seq) cmd_sel <= run_addr[10];
477 
478 // if (rst) buf_raddr <= 7'h0;
479 // else if (run_seq_d) buf_raddr <= 7'h0;
480 // else if (buf_wr || buf_rd) buf_raddr <= buf_raddr +1; // Separate read/write address? read address re-registered @ negedge //SuppressThisWarning ISExst Result of 10-bit expression is truncated to fit in 9-bit target.
481 
482  if (mrst) run_chn_d <= 0;
483  else if (run_seq) run_chn_d <= run_chn;
484 
485  if (mrst) run_refresh_d <= 0;
486  else if (run_seq) run_refresh_d <= run_refresh;
487 
488  if (mrst) run_seq_d <= 0;
489  else run_seq_d <= run_seq;
490 
491  if (mrst) buf_raddr_reset <= 0;
493 
494  if (mrst) buf_addr_reset <= 0;
495  else buf_addr_reset<= buf_rst;
496  end
497 
498  always @ (posedge mclk) begin
499 
500  if (buf_wr_ndly) mem_read_mode <= 1; // last was buf_wr, not buf_rd
501  else if (buf_rd) mem_read_mode <= 0;
502 
503  end
504  // re-register buffer write address to match DDR3 data
505  always @ (negedge mclk) begin
506 // buf_waddr_negedge <= buf_raddr;
507  buf_waddr_reset_negedge <= buf_rst_d; //buf_raddr_reset;
510  run_chn_w_d_negedge <= run_chn_w_d; //run_chn_d;
513 
514  end
515 // Command sequence memories:
516 // Command sequence memory 0 ("manual"):
517  wire ren0=!cmd_sel && cmd_busy[0] && !pause; // cmd_busy - multibit
518  wire ren1= cmd_sel && cmd_busy[0] && !pause;
520  .REGISTERS(1) // (0) // register output
521  ) cmd0_buf_i (
522  .rclk (mclk), // input
523  .raddr (cmd_addr), // input[9:0]
524  .ren (ren0), // input TODO: verify cmd_busy[0] is correct (was cmd_busy ). TODO: make cleaner ren/regen
525 // .ren (ren0 && !sequence_done), // input TODO: verify cmd_busy[0] is correct (was cmd_busy ). TODO: make cleaner ren/regen
526  .regen (ren0), // input
527  .data_out (phy_cmd0_word), // output[31:0]
528  .wclk (cmd0_clk), // input
529  .waddr (cmd0_addr), // input[9:0]
530  .we (cmd0_we), // input
531  .web (4'hf), // input[3:0]
532  .data_in (cmd0_data) // input[31:0]
533  );
534 // NOTE: Simulation sometimes may show:
535 // Memory Collision Error on RAMB36E1 : x393_testbench03.x393_i.mcntrl393_i.memctrl16_i.mcontr_sequencer_i.cmd1_buf_i.RAMB36E1_i.genblk1.INT_RAMB_TDP.chk_for_col_msg
536 // It is OK, as the sequencer reads 2 extra (unused) locations before it stops at the end of block (stop depends on the read memory that has latency)
537 
538 
539 // Command sequence memory 1
541  .REGISTERS (1) // (0) // register output
542  ) cmd1_buf_i (
543  .rclk (mclk), // input
544  .raddr (cmd_addr), // input[9:0]
545  .ren ( ren1), // input ??? TODO: make cleaner ren/regen
546 // .ren ( ren1 && !sequence_done), // input ??? TODO: make cleaner ren/regen
547  .regen ( ren1), // input ???
548  .data_out (phy_cmd1_word), // output[31:0]
549  .wclk (cmd1_clk), // input
550  .waddr (cmd1_addr), // input[9:0]
551  .we (cmd1_we), // input
552  .web (4'hf), // input[3:0]
553  .data_in (cmd1_data) // input[31:0]
554  );
555 
559  .SLEW_DQ (SLEW_DQ),
560  .SLEW_DQS (SLEW_DQS),
561  .SLEW_CMDA (SLEW_CMDA),
562  .SLEW_CLK (SLEW_CLK),
571  .SDCLK_PHASE (SDCLK_PHASE), /// debugging
572  .CLK_PHASE (CLK_PHASE),
576  .SS_EN (SS_EN),
577  .SS_MODE (SS_MODE),
579  .CMD_PAUSE_BITS (CMD_PAUSE_BITS), // numer of (address) bits to encode pause
580  .CMD_DONE_BIT (CMD_DONE_BIT) // bit number (address) to signal sequence done
581  ) phy_cmd_i (
582  .SDRST (SDRST), // output
583  .SDCLK (SDCLK), // output
584  .SDNCLK (SDNCLK), // output
585  .SDA (SDA[ADDRESS_NUMBER-1:0]), // output[14:0]
586  .SDBA (SDBA[2:0]), // output[2:0]
587  .SDWE (SDWE), // output
588  .SDRAS (SDRAS), // output
589  .SDCAS (SDCAS), // output
590  .SDCKE (SDCKE), // output
591  .SDODT (SDODT), // output
592  .SDD (SDD[15:0]), // inout[15:0]
593  .SDDML (SDDML), // inout
594  .DQSL (DQSL), // inout
595  .NDQSL (NDQSL), // inout
596  .SDDMU (SDDMU), // inout
597  .DQSU (DQSU), // inout
598  .NDQSU (NDQSU), // inout
599  .clk_in (clk_in), // input
600  .rst_in (rst_in), // input
601  .mclk (mclk), // output
602  .mrst (mrst), // input
603  .ref_clk (ref_clk), // input
605  .dly_data (dly_data[7:0]), // input[7:0]
606  .dly_addr (dly_addr[6:0]), // input[6:0]
607  .ld_delay (ld_delay), // input
608  .set (set), // input
609 // .locked (locked), // output
610  .locked_mmcm (locked_mmcm), // output
611  .locked_pll (locked_pll), // output
612  .dly_ready (dly_ready), // output
613  .dci_ready (dci_ready), // output
614 
615  .phy_locked_mmcm (phy_locked_mmcm), // output
616  .phy_locked_pll (phy_locked_pll), // output
617  .phy_dly_ready (phy_dly_ready), // output
618  .phy_dci_ready (phy_dci_ready), // output
619 
620  .tmp_debug (tmp_debug_a[7:0]),
621 
622  .ps_rdy (ps_rdy), // output
623  .ps_out (ps_out[7:0]), // output[7:0]
624  .phy_cmd_word (phy_cmd_word[31:0]), // input[31:0]
625  .phy_cmd_nop (phy_cmd_nop), // output
626  .phy_cmd_add_pause (phy_cmd_add_pause), // one pause cycle (for 8-bursts)
627  .add_pause (add_pause), // input
628  .pause_len (pause_len), // output [CMD_PAUSE_BITS-1:0]
629  .sequence_done (sequence_done), // output
630  .buf_wdata (buf_wdata[63:0]), // output[63:0]
631  .buf_rdata (buf_rdata[63:0]), // input[63:0]
632  .buf_wr (buf_wr_ndly), // output
633  .buf_rd (buf_rd), // output
634  .buf_rst (buf_rst), // reset external buffer address to page start
635  .cmda_en (cmda_en), // input
636  .ddr_rst (ddr_rst), // input
637  .dci_rst (dci_rst), // input
638  .dly_rst (dly_rst), // input
639  .ddr_cke (ddr_cke), // input
640  .inv_clk_div (inv_clk_div), // input
641  .dqs_pattern (dqs_pattern), // input[7:0]
642  .dqm_pattern (dqm_pattern), // input[7:0]
643  .dq_tri_on_pattern (dq_tri_on_pattern[3:0]), // input[3:0]
644  .dq_tri_off_pattern (dq_tri_off_pattern[3:0]), // input[3:0]
645  .dqs_tri_on_pattern (dqs_tri_on_pattern[3:0]), // input[3:0]
646  .dqs_tri_off_pattern (dqs_tri_off_pattern[3:0]) // input[3:0]
647  );
648  // delay buf_wr by 1-16 cycles to compensate for DDR and HDL code latency (~7 cycles?)
649  dly_16 #(2) buf_wr_dly_i (
650  .clk (mclk), // input
651  .rst (mrst), // input
652  .dly (wbuf_delay[3:0]), // input[3:0]
653  .din ({mem_read_mode & buf_rst,buf_wr_ndly}), // input
654  .dout ({buf_rst_d, buf_wr}) // output reg
655  );
656  assign wbuf_delay_m1=wbuf_delay-1;
657 
658  dly_16 #(6) buf_wchn_dly_i (
659  .clk (mclk), // input
660  .rst (mrst), // input
661  .dly (wbuf_delay_m1), //wbuf_delay[3:0]-1), // input[3:0]
662  .din ({run_seq_d, run_refresh_d, run_chn_d}), // input
663  .dout ({run_w_d,run_refresh_w_d,run_chn_w_d}) // output reg
664  );
665 
666 endmodule
667 
[31:0] 11836data_in
[ 3:0] 6454dq_tri_on_pattern
Definition: phy_cmd.v:135
6329phy_cmd0_wordwire[31:0]
6336buf_wdata_negedgereg[63:0]
[15:0] 6407SDD
Definition: phy_cmd.v:80
10332clk
Definition: dly_16.v:44
6410NDQSL
Definition: phy_cmd.v:83
[7:0] 6420dly_data
Definition: phy_cmd.v:95
6189MCONTR_PHY_0BIT_ADDR_MASK'h7f0
6399SDNCLK
Definition: phy_cmd.v:71
6402SDWE
Definition: phy_cmd.v:74
6426dly_ready
Definition: phy_cmd.v:101
6231SS_MODE"CENTER_HIGH"
6354run_chn_w_dwire[3:0]
real 6218REFCLK_FREQUENCY300.0
6425locked_pll
Definition: phy_cmd.v:100
6409DQSL
Definition: phy_cmd.v:82
[ADDRESS_NUMBER-1:0] 6400SDA
Definition: phy_cmd.v:72
6307dq_tri_on_patternreg[3:0]
[2:0] 6401SDBA
Definition: phy_cmd.v:73
[ 3:0] 6455dq_tri_off_pattern
Definition: phy_cmd.v:136
6308dq_tri_off_patternreg[3:0]
[ 3:0] 6456dqs_tri_on_pattern
Definition: phy_cmd.v:137
6414clk_in
Definition: phy_cmd.v:88
6411SDDMU
Definition: phy_cmd.v:84
status_generate_i status_generate
6197MCONTR_PHY_16BIT_ADDR'h050
[ADDRESS_NUMBER-1:0] 6238SDA
buf_wchn_dly_i dly_16
cmd1_buf_i ram_1kx32_1kx32
6416mclk
Definition: phy_cmd.v:90
6415rst_in
Definition: phy_cmd.v:89
6448dci_rst
Definition: phy_cmd.v:129
6427dci_ready
Definition: phy_cmd.v:102
[ADDR_MASK2!=0?2:ADDR_MASK1!=0?1:0:0] 9935we
Definition: cmd_deser.v:60
6444buf_rd
Definition: phy_cmd.v:124
6209DFLT_DQS_TRI_OFF_PATTERN4'hc
6405SDCKE
Definition: phy_cmd.v:77
6330phy_cmd1_wordwire[31:0]
6406SDODT
Definition: phy_cmd.v:78
6298phy_0bit_addrwire[3:0]
[WIDTH-1:0] 10336dout
Definition: dly_16.v:48
6431phy_dci_ready
Definition: phy_cmd.v:107
6335buf_wdatawire[63:0]
[ 3:0] 6457dqs_tri_off_pattern
Definition: phy_cmd.v:138
6398SDCLK
Definition: phy_cmd.v:70
[6:0] 6421dly_addr
Definition: phy_cmd.v:96
6219HIGH_PERFORMANCE_MODE"FALSE"
6323status_datawire[14:0]
6422ld_delay
Definition: phy_cmd.v:97
6403SDRAS
Definition: phy_cmd.v:75
6437phy_cmd_add_pause
Definition: phy_cmd.v:116
6312wbuf_delay_m1wire[3:0]
6417mrst
Definition: phy_cmd.v:91
6200MCONTR_PHY_16BIT_PATTERNS_TRI'h1
[WIDTH-1:0] 10335din
Definition: dly_16.v:47
6423set
Definition: phy_cmd.v:98
6443buf_wr
Definition: phy_cmd.v:123
6350pause_lenwire[CMD_PAUSE_BITS-1:0]
6446cmda_en
Definition: phy_cmd.v:127
[PHASE_WIDTH-1:0] 6434ps_out
Definition: phy_cmd.v:112
[DATA_WIDTH-1:0] 9934data
Definition: cmd_deser.v:59
[7:0] 6452dqs_pattern
Definition: phy_cmd.v:133
6440sequence_done
Definition: phy_cmd.v:119
6418ref_clk
Definition: phy_cmd.v:92
6328phy_cmd_wordwire[31:0]
6430phy_dly_ready
Definition: phy_cmd.v:106
6408SDDML
Definition: phy_cmd.v:81
6445buf_rst
Definition: phy_cmd.v:125
[63:0] 6441buf_wdata
Definition: phy_cmd.v:121
cmd_deser_16bit_i cmd_deser
6424locked_mmcm
Definition: phy_cmd.v:99
[7:0] 9931ad
Definition: cmd_deser.v:56
6433ps_rdy
Definition: phy_cmd.v:111
[ADDR_WIDTH-1:0] 9933addr
Definition: cmd_deser.v:58
6313phy_16bit_addrwire[2:0]
6404SDCAS
Definition: phy_cmd.v:76
6310dqs_tri_off_patternreg[3:0]
[63:0] 6442buf_rdata
Definition: phy_cmd.v:122
6201MCONTR_PHY_16BIT_WBUF_DELAY'h2
6451inv_clk_div
Definition: phy_cmd.v:132
6449dly_rst
Definition: phy_cmd.v:130
[31:0] 11831data_out
6314phy_16bit_datawire[15:0]
[7:0] 6453dqm_pattern
Definition: phy_cmd.v:134
6353pause_cntrreg[CMD_PAUSE_BITS-1:0]
6447ddr_rst
Definition: phy_cmd.v:128
6309dqs_tri_on_patternreg[3:0]
6438add_pause
Definition: phy_cmd.v:117
6436phy_cmd_nop
Definition: phy_cmd.v:115
6359run_chn_w_d_negedgereg[3:0]
6419idelay_ctrl_reset
Definition: phy_cmd.v:93
[31:0] 6435phy_cmd_word
Definition: phy_cmd.v:114
6397SDRST
Definition: phy_cmd.v:69
6337buf_rdatawire[63:0]
6364tmp_debug_awire[7:0]
6198MCONTR_PHY_16BIT_ADDR_MASK'h7f8
6450ddr_cke
Definition: phy_cmd.v:131
[ALL_BITS-1:0] 10777status
6412DQSU
Definition: phy_cmd.v:85
6428phy_locked_mmcm
Definition: phy_cmd.v:104
[7:0] 6432tmp_debug
Definition: phy_cmd.v:109
6370contral_status_datawire[7:0]
10333rst
Definition: dly_16.v:45
6429phy_locked_pll
Definition: phy_cmd.v:105
6413NDQSU
Definition: phy_cmd.v:86
[CMD_PAUSE_BITS-1:0] 6439pause_len
Definition: phy_cmd.v:118
[3:0] 10334dly
Definition: dly_16.v:46