x393  1.0
FPGAcodeforElphelNC393camera
ahci_dma_wr_fifo.v
Go to the documentation of this file.
1 
41 `timescale 1ns/1ps
42 
44  parameter WCNT_BITS = 21,
45  parameter ADDRESS_BITS = 3
46 )(
47  input mrst,
48  input hrst,
49  input mclk,
50  input hclk,
51  // hclk domain
52  input [WCNT_BITS-1:0] wcnt, // decrementing word counter, 0- based (0 need 1, 1 - need 2, ...) valid @ start
53  input [1:0] woffs, // 2 LSBs of the initial word address - valid @ start
54  input init, // initializes cross-clock 32->64 FIFO, disables FIFO read until confirmed back form mclk domain
55  input start, // start transfer
56  output reg [63:0] dout, // allow only each 3-rd wr if not many
57 // input dout_av, // at least one QWORD space avaiable in AXI FIFO
58  input dout_av_many, // several QWORD space avaiable in AXI FIFO
59  input last_prd, // last prd, flush partial dword if there were odd number of words transferred. valid @ start
60  // Or maybe use "last_prd"?
61  output dout_we,
62  output reg [3:0] dout_wstb, // word write enable (apply to wstb, 2 wstb input bits for one dout_wstb bit)
63  output reg done, // this PRD data sent AXI FIFO (Some partial QWORD data may be left in this module if
64  // last_prd was not set
65  output busy,
66 // output done_flush, // finished last PRD (indicated by last_prd @ start), data left module
67  output reg fifo_nempty_mclk, // to detect extra data from FIS, has some latency - only valid after read is stopped
68  // mclk domain
69  input [31:0] din,
70  output din_rdy, // can accept data from HBA (multiple dwords, so reasonable latency is OK)
71  input din_avail
72 );
73  localparam ADDRESS_NUM = (1<<ADDRESS_BITS); // 8 for ADDRESS_BITS==3
74  reg [31:0] fifo0_ram [0: ADDRESS_NUM - 1];
75  reg [31:0] fifo1_ram [0: ADDRESS_NUM - 1];
76  wire init_mclk;
80  wire flush_hclk; // TODO: Define (less than 4 left to receive)?
81  wire flush_mclk;
82 // wire flush_conf;
83  reg [ADDRESS_BITS : 0] raddr; // 1 extra bit
84  reg [ADDRESS_BITS+1:0] waddr; // 1 extra bit
85  reg [63:16] fifo_do_prev; // only 48 bits are needed
86  reg [(1<<ADDRESS_BITS)-1:0] fifo_full; // set in write clock domain
87  reg [(1<<ADDRESS_BITS)-1:0] fifo_nempty;// set in read clock domain
88  wire fifo_wr = en_fifo_wr && ((din_avail && din_rdy) || (waddr[0] && flush_mclk)); // flush may add extra write of junk
89 // wire fifo_rd;
90  wire [(1<<ADDRESS_BITS)-1:0] fifo_full2 = {~fifo_full[0],fifo_full[ADDRESS_NUM-1:1]};
91  reg hrst_mclk;
92  reg fifo_dav; // @hclk
93  reg fifo_dav2; // @hclk - ??? at least two are available?
94  reg fifo_half_mclk; // Half Fifo is empty, OK to write
95 /// wire [63:0] fifo_do = {fifo1_ram [raddr[ADDRESS_BITS:1]], fifo0_ram [raddr[ADDRESS_BITS:1]]};
97  wire dout_we_w;
98  reg [1:0] dout_we_r;
99 
100  reg [1:0] wp; // word pointer in the output (0..3)
101  reg [1:0] fp; // pointer in the {fifo_do,fifo_do_prev} pointer (0 - fifo_do_prev[16], ..., 3 - fifo_do[0])
102  reg [1:0] wl; // words left: 0: 1 word, ..., 3: >=4 words
103  // implementing 6 -> 23 unregistered ROM
104  reg [1:0] mx0; //4:1
105  reg [2:0] mx1; //5:1
106  reg [2:0] mx2; //6:1
107  reg [2:0] mx3; //7:1
108  reg [3:0] pm; // re_dout_wstb;
109  wire fifo_rd;
111 // reg [1:0] nwp; // Needed? 0 for all but first
112  reg [1:0] nfp; // next {fifo_do,fifo_do_prev} pointer (0 - fifo_do_prev[16], ..., 3 - fifo_do[0])
113  reg [2:0] swl; // subtract from words_left;
114  reg need_fifo; // needs reading fifo
115  // TODO: make separate register bits for wl == 0, wl > =4
116  reg busy_r;
118  reg [WCNT_BITS-1:0] wcntr;
119  wire [WCNT_BITS-1:0] next_wcntr = wcntr[WCNT_BITS-1:0] - swl[2:0];
120  reg flushing;
121 // wire done_w = dout_we_r[0] && !(next_wcntr[WCNT_BITS];
122  wire last_qword= !(|wcntr[WCNT_BITS-1:2]) &&
123  ((wcntr[1:0] == 0) ||
124  swl[2] ||
125  (!wcntr[1] && swl[1]) ||
126  (!wcntr[0] && (&swl[1:0])) );
128 
129 // wire axi_ready = dout_av && (dout_av_many || (!dout_we_r));
131 
133 
134 /// assign flush_hclk = is_last_prd && !flushing && !nfp[1] && last_qword && waddr[0]; // waddr[0] - other clock domain, but OK here,
135  assign flush_hclk = busy && is_last_prd && !flushing && !nfp[1] && last_qword && waddr[0]; // waddr[0] - other clock domain, but OK here,
136  // it was last 1->0 before previous FIFO read. flush_hclk will only be generated for odd number of dwords
137 
138  assign din_rdy = en_fifo_wr && fifo_half_mclk;
139  assign dout_we = dout_we_r[0]; // dout_we_r[0] - write to dout, use dout_av && (!(|dout_we_r) || dout_av_many) to enable dout_we_r[0]<=
140  assign busy = busy_r || dout_we_r[0];
141 
142  assign dout_we_w = axi_ready && fifo_out_ready && busy_r;
143  assign fifo_rd = dout_we_w && need_fifo;
144 
145  always @ (posedge hclk) begin
146  if (hrst || init) en_fifo_rd <= 0;
147  else if (init_confirm) en_fifo_rd <= 1;
148  else if (done_w && is_last_prd) en_fifo_rd <= 0;
149 
150  done <= done_w;
151 
152  fifo_rd_r <= fifo_rd;
153 
154 
155  if (hrst || init) raddr <= 0;
156  else if (fifo_rd) raddr <= raddr + 1; // increment for 64-bit words
157 
158  // reg [ADDRESS_BITS : 0] raddr; // 1 extra bit
159 
160 
161  if (hrst || init) fifo_nempty <= {{(ADDRESS_NUM>>1){1'b0}},{(ADDRESS_NUM>>1){1'b1}}};// 8'b00001111
162 /// else if (fifo_rd && raddr[0]) fifo_nempty <= {fifo_nempty[ADDRESS_NUM-2:0],raddr[ADDRESS_BITS] ^ raddr[ADDRESS_BITS-1]};
164 
165 
166 /// fifo_dav <= !init && en_fifo_rd && (fifo_full [raddr[ADDRESS_BITS:1]] ^ raddr[ADDRESS_BITS]);
168 /// fifo_dav2 <= !init && en_fifo_rd && (fifo_full2[raddr[ADDRESS_BITS:1]]); //?^ raddr[ADDRESS_BITS]); // FIXME
169  fifo_dav2 <= !init && en_fifo_rd && (fifo_full2[raddr[ADDRESS_BITS-1:0]] ^ raddr[ADDRESS_BITS]); //?^ raddr[ADDRESS_BITS]); // FIXME
170 
171  if (fifo_rd) fifo_do_prev[63:16] <= fifo_do[63:16];
172 
173  if (start) is_last_prd <= last_prd;
174 
175  // flushing will only be set for the last dword in last PRD if total number of dwords is ODD.
176  // Odd number of words should be handled outside of this module (before)
177  if (hrst || init || start) flushing <= 0;
178  else if (flush_hclk) flushing <= 1;
179  else if (done_w) flushing <= 0;
180 
181  if (hrst || init) busy_r <= 0;
182  else if (start) busy_r <= 1;
183  else if (done_w) busy_r <= 0;
184 
185  dout_we_r <= {dout_we_r[0], dout_we_w};
186 
187  if (start) wcntr <= wcnt;
188  else if (dout_we_w) wcntr <= next_wcntr; // wcntr - swl[2:0];
189 
190  if (start) wp <= woffs;
191  else if (dout_we_w) wp <= 0; // all but possibly wirst QWORD are aligned to th low word
192 
193  if (init) fp <= 3; // only reset for the first PRD, points to the beginning of the fifo_do (fifo_do_prev - empty)
194  else if (dout_we_w) fp <= nfp;
195 
196  // words left: 0: 1 word, ..., 3: >=4 words
197  if (start) wl <= wcnt[1:0] | {2{|wcnt[WCNT_BITS-1:2]}};
198  else if (dout_we_w) wl <= next_wcntr[1:0] | {2{|wcntr[WCNT_BITS-1:3] | next_wcntr[2]}};
199 
200  if (dout_we_w) begin
201  dout_wstb <= pm;
202 
203  case (mx0)
204  2'h0: dout[15: 0] <= fifo_do_prev[31:16];
205  2'h1: dout[15: 0] <= fifo_do_prev[47:32];
206  2'h2: dout[15: 0] <= fifo_do_prev[63:48];
207  2'h3: dout[15: 0] <= fifo_do [15: 0];
208  endcase
209 
210  case (mx1)
211  3'h0: dout[31:16] <= fifo_do_prev[31:16];
212  3'h1: dout[31:16] <= fifo_do_prev[47:32];
213  3'h2: dout[31:16] <= fifo_do_prev[63:48];
214  3'h3: dout[31:16] <= fifo_do [15: 0];
215  3'h4: dout[31:16] <= fifo_do [31:16];
216  default: dout[31:16] <= 16'bx; // should never get here
217  endcase
218 
219  case (mx2)
220  3'h0: dout[47:32] <= fifo_do_prev[31:16];
221  3'h1: dout[47:32] <= fifo_do_prev[47:32];
222  3'h2: dout[47:32] <= fifo_do_prev[63:48];
223  3'h3: dout[47:32] <= fifo_do [15: 0];
224  3'h4: dout[47:32] <= fifo_do [31:16];
225  3'h5: dout[47:32] <= fifo_do [47:32];
226  default: dout[47:32] <= 16'bx; // should never get here
227  endcase
228 
229  case (mx3)
230  3'h0: dout[63:48] <= fifo_do_prev[31:16];
231  3'h1: dout[63:48] <= fifo_do_prev[47:32];
232  3'h2: dout[63:48] <= fifo_do_prev[63:48];
233  3'h3: dout[63:48] <= fifo_do [15: 0];
234  3'h4: dout[63:48] <= fifo_do [31:16];
235  3'h5: dout[63:48] <= fifo_do [47:32];
236  3'h6: dout[63:48] <= fifo_do [63:48];
237  default: dout[63:48] <= 16'bx; // should never get here
238  endcase
239 
240  end
241 
242  end
243  /*
244 
245  output reg [63:0] dout, // allow only each 3-rd wr if not many
246  input dout_av, // at least one QWORD space avaiable in AXI FIFO
247  input dout_av_many, // several QWORD space avaiable in AXI FIFO
248  input last_prd, // last prd, flush partial dword if there were odd number of words transferred. valid @ start
249  // Or maybe use "last_prd"?
250  output dout_we,
251  output reg [3:0] dout_wstb, // word write enable (apply to wstb, 2 wstb input bits for one dout_wstb bit)
252  output reg done, // this PRD data sent AXI FIFO (Some partial QWORD data may be left in this module if
253 
254  wl3[2:0]
255 
256  always @* case ({wp, fp, wl})
257  6'h00: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b0001; fifo_rd <= 0; nfp <= 1; swl <= 1; end
258 
259  */
260 
261  // mclk domain
262  always @ (posedge mclk) begin
263  hrst_mclk <= hrst;
264 
265  if (mrst || hrst_mclk) en_fifo_wr <= 0;
266  else if (init_mclk) en_fifo_wr <= 1;
267  else if (flush_mclk) en_fifo_wr <= 0;
268 
269 
270  if (hrst_mclk || init_mclk) waddr <= 0;
271  else if (fifo_wr) waddr <= waddr + 1;
272 
273  if (hrst_mclk || init_mclk) fifo_full <= 0;
274 /// else if (fifo_wr) fifo_full <= {fifo_full[ADDRESS_NUM-2:0], waddr[ADDRESS_BITS+1]};
275  else if (fifo_wr && waddr[0]) fifo_full <= {fifo_full[ADDRESS_NUM-2:0], ~waddr[ADDRESS_BITS+1]};
276 
278 
279  if (fifo_wr && !waddr[0]) fifo0_ram[waddr[ADDRESS_BITS:1]] <= din;
280  if (fifo_wr && waddr[0]) fifo1_ram[waddr[ADDRESS_BITS:1]] <= din;
281 
282 /// fifo_nempty_mclk <= (fifo_full [raddr[ADDRESS_BITS:1]] ^ raddr[ADDRESS_BITS]); // only valid after read is stopped
283  fifo_nempty_mclk <= (fifo_full [raddr[ADDRESS_BITS-1:0]] ^ raddr[ADDRESS_BITS]); // only valid after read is stopped
284 
285  end
286 
287 
288  // hclk -> mclk cross-clock synchronization
290  .EXTRA_DLY(0)
291  ) init_mclk_i (
292  .rst (hrst), // input
293  .src_clk (hclk), // input
294  .dst_clk (mclk), // input
295  .in_pulse (init), // input
296  .out_pulse (init_mclk), // output
297  .busy() // output
298  );
299 
301  .EXTRA_DLY(0)
302  ) flush_mclk_i (
303  .rst (hrst), // input
304  .src_clk (hclk), // input
305  .dst_clk (mclk), // input
306  .in_pulse (flush_hclk), // input
307  .out_pulse (flush_mclk), // output
308  .busy() // output
309  );
310 
311  // mclk -> hclk cross-clock synchronization
313  .EXTRA_DLY(0)
314  ) init_confirm_i (
315  .rst (mrst), // input
316  .src_clk (mclk), // input
317  .dst_clk (hclk), // input
318  .in_pulse (init_mclk), // input
319  .out_pulse (init_confirm), // output
320  .busy() // output
321  );
322 /*
323  pulse_cross_clock #(
324  .EXTRA_DLY(0)
325  ) flush_conf_i (
326  .rst (mrst), // input
327  .src_clk (mclk), // input
328  .dst_clk (hclk), // input
329  .in_pulse (flush_mclk), // input
330  .out_pulse (flush_conf), // output
331  .busy() // output
332  );
333 */
334  /*
335  wl: 0: left 1 word, 1: left 2 words, 2: left 3 words, 3: left >=4 words
336  wp (pointer in the output qword, only first in PRD can be non-zero) 0: word 0 of output QW, ...
337  mx0 0: use fifo_do_prev[16], 1: fifo_do_prev[32], 2:fifo_do_prev[48], 3:fifo_do[0];
338  mx1 0: use fifo_do_prev[16], 1: fifo_do_prev[32], 2:fifo_do_prev[48], 3:fifo_do[0], 4:fifo_do[16];
339  mx2 0: use fifo_do_prev[16], 1: fifo_do_prev[32], 2:fifo_do_prev[48], 3:fifo_do[0], 4:fifo_do[16], 5:fifo_do[32];
340  mx3 0: use fifo_do_prev[16], 1: fifo_do_prev[32], 2:fifo_do_prev[48], 3:fifo_do[0], 4:fifo_do[16], 5:fifo_do[32], 6:fifo_do[48];
341  fp/nfp: 0 - pointer to fifo_do_prev[16], 1 : fifo_do_prev[32], 2: fifo_do_prev[48], 3: fifo_do[0]
342 
343  */
344  always @* case ({wp, fp, wl})
345  6'h00: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b0001; need_fifo <= 0; nfp <= 1; swl <= 1; end
346  6'h01: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b0011; need_fifo <= 0; nfp <= 2; swl <= 2; end
347  6'h02: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b0111; need_fifo <= 0; nfp <= 3; swl <= 3; end
348  6'h03: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b1111; need_fifo <= 1; nfp <= 0; swl <= 4; end
349 
350  6'h04: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b0001; need_fifo <= 0; nfp <= 2; swl <= 1; end
351  6'h05: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b0011; need_fifo <= 0; nfp <= 3; swl <= 2; end
352  6'h06: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b0111; need_fifo <= 1; nfp <= 0; swl <= 3; end
353  6'h07: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b1111; need_fifo <= 1; nfp <= 1; swl <= 4; end
354 
355  6'h08: begin mx0 <= 2; mx1 <= 3; mx2 <= 4; mx3 <= 5; pm <= 4'b0001; need_fifo <= 0; nfp <= 3; swl <= 1; end
356  6'h09: begin mx0 <= 2; mx1 <= 3; mx2 <= 4; mx3 <= 5; pm <= 4'b0011; need_fifo <= 1; nfp <= 0; swl <= 2; end
357  6'h0a: begin mx0 <= 2; mx1 <= 3; mx2 <= 4; mx3 <= 5; pm <= 4'b0111; need_fifo <= 1; nfp <= 1; swl <= 3; end
358  6'h0b: begin mx0 <= 2; mx1 <= 3; mx2 <= 4; mx3 <= 5; pm <= 4'b1111; need_fifo <= 1; nfp <= 2; swl <= 4; end
359 
360  6'h0c: begin mx0 <= 3; mx1 <= 4; mx2 <= 5; mx3 <= 6; pm <= 4'b0001; need_fifo <= 1; nfp <= 0; swl <= 1; end
361  6'h0d: begin mx0 <= 3; mx1 <= 4; mx2 <= 5; mx3 <= 6; pm <= 4'b0011; need_fifo <= 1; nfp <= 1; swl <= 2; end
362  6'h0e: begin mx0 <= 3; mx1 <= 4; mx2 <= 5; mx3 <= 6; pm <= 4'b0111; need_fifo <= 1; nfp <= 2; swl <= 3; end
363  6'h0f: begin mx0 <= 3; mx1 <= 4; mx2 <= 5; mx3 <= 6; pm <= 4'b1111; need_fifo <= 1; nfp <= 3; swl <= 4; end
364 
365  6'h10: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b0010; need_fifo <= 0; nfp <= 1; swl <= 1; end
366  6'h11: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b0110; need_fifo <= 0; nfp <= 2; swl <= 2; end
367  6'h12: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b1110; need_fifo <= 0; nfp <= 3; swl <= 3; end
368  6'h13: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b1110; need_fifo <= 0; nfp <= 3; swl <= 3; end
369 
370  6'h14: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b0010; need_fifo <= 0; nfp <= 2; swl <= 1; end
371  6'h15: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b0110; need_fifo <= 0; nfp <= 3; swl <= 2; end
372  6'h16: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b1110; need_fifo <= 1; nfp <= 0; swl <= 3; end
373  6'h17: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b1110; need_fifo <= 1; nfp <= 0; swl <= 3; end
374 
375  6'h18: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b0010; need_fifo <= 0; nfp <= 3; swl <= 1; end
376  6'h19: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b0110; need_fifo <= 1; nfp <= 0; swl <= 2; end
377  6'h1a: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b1110; need_fifo <= 1; nfp <= 1; swl <= 3; end
378  6'h1b: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b1110; need_fifo <= 1; nfp <= 1; swl <= 3; end
379 
380  6'h1c: begin mx0 <= 2; mx1 <= 3; mx2 <= 4; mx3 <= 5; pm <= 4'b0010; need_fifo <= 1; nfp <= 0; swl <= 1; end
381  6'h1d: begin mx0 <= 2; mx1 <= 3; mx2 <= 4; mx3 <= 5; pm <= 4'b0110; need_fifo <= 1; nfp <= 1; swl <= 2; end
382  6'h1e: begin mx0 <= 2; mx1 <= 3; mx2 <= 4; mx3 <= 5; pm <= 4'b1110; need_fifo <= 1; nfp <= 2; swl <= 3; end
383  6'h1f: begin mx0 <= 2; mx1 <= 3; mx2 <= 4; mx3 <= 5; pm <= 4'b1110; need_fifo <= 1; nfp <= 2; swl <= 3; end
384 
385  6'h20: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 1; pm <= 4'b0100; need_fifo <= 0; nfp <= 1; swl <= 1; end
386  6'h21: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 1; pm <= 4'b1100; need_fifo <= 0; nfp <= 2; swl <= 2; end
387  6'h22: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 1; pm <= 4'b1100; need_fifo <= 0; nfp <= 2; swl <= 2; end
388  6'h23: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 1; pm <= 4'b1100; need_fifo <= 0; nfp <= 2; swl <= 2; end
389 
390  6'h24: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b0100; need_fifo <= 0; nfp <= 2; swl <= 1; end
391  6'h25: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b1100; need_fifo <= 0; nfp <= 3; swl <= 2; end
392  6'h26: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b1100; need_fifo <= 0; nfp <= 3; swl <= 2; end
393  6'h27: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b1100; need_fifo <= 0; nfp <= 3; swl <= 2; end
394 
395  6'h28: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b0100; need_fifo <= 0; nfp <= 3; swl <= 1; end
396  6'h29: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b1100; need_fifo <= 1; nfp <= 0; swl <= 2; end
397  6'h2a: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b1100; need_fifo <= 1; nfp <= 0; swl <= 2; end
398  6'h2b: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b1100; need_fifo <= 1; nfp <= 0; swl <= 2; end
399 
400  6'h2c: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b0100; need_fifo <= 1; nfp <= 0; swl <= 1; end
401  6'h2d: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b1100; need_fifo <= 1; nfp <= 1; swl <= 2; end
402  6'h2e: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b1100; need_fifo <= 1; nfp <= 1; swl <= 2; end
403  6'h2f: begin mx0 <= 1; mx1 <= 2; mx2 <= 3; mx3 <= 4; pm <= 4'b1100; need_fifo <= 1; nfp <= 1; swl <= 2; end
404 
405  6'h30: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 0; pm <= 4'b1000; need_fifo <= 0; nfp <= 1; swl <= 1; end
406  6'h31: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 0; pm <= 4'b1000; need_fifo <= 0; nfp <= 1; swl <= 1; end
407  6'h32: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 0; pm <= 4'b1000; need_fifo <= 0; nfp <= 1; swl <= 1; end
408  6'h33: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 0; pm <= 4'b1000; need_fifo <= 0; nfp <= 1; swl <= 1; end
409 
410  6'h34: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 1; pm <= 4'b1000; need_fifo <= 0; nfp <= 2; swl <= 1; end
411  6'h35: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 1; pm <= 4'b1000; need_fifo <= 0; nfp <= 2; swl <= 1; end
412  6'h36: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 1; pm <= 4'b1000; need_fifo <= 0; nfp <= 2; swl <= 1; end
413  6'h37: begin mx0 <= 0; mx1 <= 0; mx2 <= 0; mx3 <= 1; pm <= 4'b1000; need_fifo <= 0; nfp <= 2; swl <= 1; end
414 
415  6'h38: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b1000; need_fifo <= 0; nfp <= 3; swl <= 1; end
416  6'h39: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b1000; need_fifo <= 0; nfp <= 3; swl <= 1; end
417  6'h3a: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b1000; need_fifo <= 0; nfp <= 3; swl <= 1; end
418  6'h3b: begin mx0 <= 0; mx1 <= 0; mx2 <= 1; mx3 <= 2; pm <= 4'b1000; need_fifo <= 0; nfp <= 3; swl <= 1; end
419 
420  6'h3c: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b1000; need_fifo <= 1; nfp <= 0; swl <= 1; end
421  6'h3d: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b1000; need_fifo <= 1; nfp <= 0; swl <= 1; end
422  6'h3e: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b1000; need_fifo <= 1; nfp <= 0; swl <= 1; end
423  6'h3f: begin mx0 <= 0; mx1 <= 1; mx2 <= 2; mx3 <= 3; pm <= 4'b1000; need_fifo <= 1; nfp <= 0; swl <= 1; end
424  endcase
425 
426 endmodule
427 
[0:ADDRESS_NUM-1] 13120fifo0_ramreg[31:0]
reg [63:0] 13108dout
13139fifo_dowire[63:0]
13132fifo_nemptyreg[1<<ADDRESS_BITS-1:0]
13157wcntrreg[WCNT_BITS-1:0]
reg [3:0] 13112dout_wstb
[WCNT_BITS-1:0] 13104wcnt
init_confirm_i pulse_cross_clock
[0:ADDRESS_NUM-1] 13121fifo1_ramreg[31:0]
13131fifo_fullreg[1<<ADDRESS_BITS-1:0]
13128raddrreg[ADDRESS_BITS:0]
13158next_wcntrwire[WCNT_BITS-1:0]
13134fifo_full2wire[1<<ADDRESS_BITS-1:0]
13119ADDRESS_NUM(1<<ADDRESS_BITS
13130fifo_do_prevreg[63:16]
13129waddrreg[ADDRESS_BITS+1:0]