source: ReferenceDesigns/w3_802.11/sysgen/wlan_phy_rx_pmd/blackboxes/vb_decoder_rest.v

Last change on this file was 6299, checked in by murphpo, 6 years ago

Added pipeline reg in decoder
Removed ILA in Rx PHY (easy to replace - needed ILA elsewhere)

File size: 84.3 KB
Line 
1// This file is copyright 2013 by Rice University and was ported from the
2//  original WARP OFDM Reference Design. It is distributed under the WARP license:
3//  http://warpproject.org/license
4
5
6//**************************************************************
7// File:    unpack_m2n.v
8// Author:  Yang Sun (ysun@rice.edu)
9// Birth:   $ 1/15/07
10// Des:     unpack from M bit to N bit, M > N
11// History: $ 1/15/07, Init coding
12//          $ 1/21/07, K = 7
13//          $ 3/23, Fixed a naming problem for sysgen
14//                  Can not use VHDL reserved key world
15//          $ 12/1/07: Updated
16//**************************************************************
17
18module unpack_m2n (
19        clk     ,   // I, clock
20        nrst    ,   // I, n reset
21        start   ,   // I, start pulse
22        din     ,   // I, data input
23        vin     ,   // I, valid input
24        dout    ,   // O, data output
25        vout    ,   // O, valid output
26        remain  ,   // I, remain
27        last    ,   // I, last data
28        done    ,   // O, done
29        early_trace
30        ) ;
31
32parameter               BITM = 48 ;
33parameter               BITM_EARLY = 24 ;
34parameter               BITN = 8 ;
35parameter               LW = 7 ;
36
37input                   clk ;
38input                   nrst ;
39input                   start ;
40input   [BITM-1 :0]     din ;
41input                   vin ;
42input   [LW -1:0]       remain ;
43input                   last ;
44input                   early_trace;
45
46output  [BITN-1 :0]     dout ;
47output                  vout ;
48output                  done ;
49
50//================================================
51//Internal signal
52//================================================
53reg     [BITM + BITN -1 :0]     sreg ;
54wire    [BITM + BITN -1 :0]     sreg_next ;
55reg     [LW -1 : 0]             cnt = 0;
56wire                            rd ;
57wire    [BITN-1 :0]             data ;
58wire    [BITM + BITN -1 :0]     tmp ;
59wire    [BITM + BITN -1 :0]     tmp2 ;
60wire    [LW -1 : 0]             shift ;
61reg                             last_i ;
62reg                             last_byte_s0 ;
63wire                            last_byte ;
64
65//================================================
66// Main RTL code
67//================================================
68assign dout = data ;
69assign vout = rd ;
70
71always @ (posedge clk)
72  if (~nrst)
73    cnt <= 0 ;
74  else if (start)
75    cnt <= 0 ;
76  else if (vin & early_trace)
77  begin
78      cnt <= cnt + BITM_EARLY ;
79  end
80  else if (vin)// & ~early_trace)
81  begin
82    if (~last)
83      cnt <= cnt + BITM ;
84    else
85      cnt <= cnt + remain ;
86  end
87  else if (rd)
88    cnt <= cnt - BITN ;
89   
90assign rd = cnt >= BITN ;
91assign data = sreg [BITM + BITN -1 : BITM] ;
92assign tmp = {{BITM{1'b0}}, din} ;
93assign shift = BITN - cnt ;
94assign tmp2 = (tmp << shift) | sreg ;
95assign sreg_next = vin ? tmp2 : rd ? {sreg[BITM -1 : 0], {BITN{1'b0}}} : sreg ;
96
97always @ (posedge clk)
98  if (~nrst)
99    sreg <= 0 ;
100  else if (start)
101    sreg <= 0 ;
102  else 
103    sreg <= sreg_next ;
104
105always @ (posedge clk)
106  if (~nrst)
107    last_i <= 1'b0 ;
108  else if (start)
109    last_i <= 1'b0 ;
110  else if (vin & last)
111    last_i <= 1'b1 ;
112
113assign last_byte = last_i && cnt < BITN ;
114always @ (posedge clk)
115  last_byte_s0 <= last_byte ;
116
117assign done = ~last_byte_s0 & last_byte ;
118
119endmodule
120
121
122//**************************************************************
123// File:    viterbi_core
124// Author:  Yang Sun (ysun@rice.edu)
125// Birth:   $ 1/14/07
126// Des:     The top level of viterbi decoder
127//          Take 4 bit soft value is [-8 : +7]
128//          K = 3. g0 = 7, g1 = 5
129//          K = 5, g0 (A) = 1 + x + x^2 + x^4, g1 (B) = 1 + x^3 + x^4
130//          K = 7, g0 (A) = 1 + x^2 + x^3 + x^4 + x^5
131//                 g1 (B) = 1 + x + x^2 + x^3 + x^6
132// History: $ 1/14/07, Init coding, K = 3
133//          $ 1/22/07, K = 5
134//          $ 1/26/07, Updated
135//          $ 1/27/07, Change to LLR domain
136//          $ 2/18/07, Supported K = 7
137//          $ 2/23/07, Added pipeline to max_metric
138//          $ 12/1/07, Updated
139//**************************************************************
140//`define ZERO_TERM
141
142module viterbi_core (
143        clk         ,   // I, clock
144        nrst        ,   // I, n reset
145        packet_start,   // I, packet start pulse
146        zero_tail   ,   // I, the code is zero terminated
147        dv_in       ,   // I, data valid input
148        llr0        ,   // I, LLR 2nd
149        llr1        ,   // I, LLR 1st
150        packet_end  ,   // I, packet end pulse
151        dv_out      ,   // O, data valid out
152        dout        ,   // O, data out
153        done        ,   // O, done pulse
154        remain,          // O, remain data cnt
155        early_trace1,
156        early_trace2
157        ) ;
158
159input early_trace1;
160input early_trace2;
161
162parameter           SW = 4 ;        // soft input precision
163parameter           M = 7 ;         // metric width
164
165parameter           R = 48 ;        // reliable trace
166parameter           C = 40 ;        // unreliable trace
167parameter           L = 88 ;        // total trace depth
168parameter           LW = 7 ;        // L width
169
170parameter           R_EARLY1 = 24; //Early total trace depth
171parameter           C_EARLY1 = 0;  //Early unreliable trace
172parameter           L_EARLY1 = 24; //Early reliable trace trace
173
174parameter           R_EARLY2 = 48; //Early total trace depth
175parameter           C_EARLY2 = 0;  //Early unreliable trace
176parameter           L_EARLY2 = 48; //Early reliable trace trace
177
178parameter           K = 7 ;         // constraint length
179parameter           N = 64 ;        // number of states = 2^(K-1)
180parameter           TR = 128 ;      // trace buffer
181parameter           TRW = 7 ;       // trace
182
183input               clk ;           // system clock
184input               nrst ;          // active low reset
185input               packet_start ;  // start of packet pulse
186input               zero_tail ;     // 1 = the code is terminated with 0, 0 = no termination
187input               packet_end ;    // end of packet pulse
188input               dv_in ;         // data valid input
189input   [SW -1:0]   llr1 ;          // LLR soft value for bit1, LLR = log(Pr(ci=0/ri)/Pr(ci=1/ri))
190input   [SW -1:0]   llr0 ;          // LLR soft value for bit0, LLR = log(Pr(ci=0/ri)/Pr(ci=1/ri))
191
192output              done ;
193output  [LW -1:0]   remain ;
194output              dv_out ;
195output  [R-1:0]     dout ;
196
197//======================================
198//Internal signal
199//======================================
200wire    [SW:0]      branch_00 ;
201wire    [SW:0]      branch_01 ;
202wire    [SW:0]      branch_10 ;
203wire    [SW:0]      branch_11 ;
204
205wire    [SW:0]      branch_A_0 ;
206wire    [SW:0]      branch_B_0 ;
207wire    [SW:0]      branch_A_1 ;
208wire    [SW:0]      branch_B_1 ;
209wire    [SW:0]      branch_A_2 ;
210wire    [SW:0]      branch_B_2 ;
211wire    [SW:0]      branch_A_3 ;
212wire    [SW:0]      branch_B_3 ;
213wire    [SW:0]      branch_A_4 ;
214wire    [SW:0]      branch_B_4 ;
215wire    [SW:0]      branch_A_5 ;
216wire    [SW:0]      branch_B_5 ;
217wire    [SW:0]      branch_A_6 ;
218wire    [SW:0]      branch_B_6 ;
219wire    [SW:0]      branch_A_7 ;
220wire    [SW:0]      branch_B_7 ;
221wire    [SW:0]      branch_A_8 ;
222wire    [SW:0]      branch_B_8 ;
223wire    [SW:0]      branch_A_9 ;
224wire    [SW:0]      branch_B_9 ;
225wire    [SW:0]      branch_A_10 ;
226wire    [SW:0]      branch_B_10 ;
227wire    [SW:0]      branch_A_11 ;
228wire    [SW:0]      branch_B_11 ;
229wire    [SW:0]      branch_A_12 ;
230wire    [SW:0]      branch_B_12 ;
231wire    [SW:0]      branch_A_13 ;
232wire    [SW:0]      branch_B_13 ;
233wire    [SW:0]      branch_A_14 ;
234wire    [SW:0]      branch_B_14 ;
235wire    [SW:0]      branch_A_15 ;
236wire    [SW:0]      branch_B_15 ;
237wire    [SW:0]      branch_A_16 ;
238wire    [SW:0]      branch_B_16 ;
239wire    [SW:0]      branch_A_17;
240wire    [SW:0]      branch_B_17;
241wire    [SW:0]      branch_A_18;
242wire    [SW:0]      branch_B_18;
243wire    [SW:0]      branch_A_19;
244wire    [SW:0]      branch_B_19;
245wire    [SW:0]      branch_A_20;
246wire    [SW:0]      branch_B_20;
247wire    [SW:0]      branch_A_21;
248wire    [SW:0]      branch_B_21;
249wire    [SW:0]      branch_A_22;
250wire    [SW:0]      branch_B_22;
251wire    [SW:0]      branch_A_23;
252wire    [SW:0]      branch_B_23;
253wire    [SW:0]      branch_A_24;
254wire    [SW:0]      branch_B_24;
255wire    [SW:0]      branch_A_25;
256wire    [SW:0]      branch_B_25;
257wire    [SW:0]      branch_A_26 ;
258wire    [SW:0]      branch_B_26 ;
259wire    [SW:0]      branch_A_27 ;
260wire    [SW:0]      branch_B_27 ;
261wire    [SW:0]      branch_A_28 ;
262wire    [SW:0]      branch_B_28 ;
263wire    [SW:0]      branch_A_29 ;
264wire    [SW:0]      branch_B_29 ;
265wire    [SW:0]      branch_A_30 ;
266wire    [SW:0]      branch_B_30 ;
267wire    [SW:0]      branch_A_31 ;
268wire    [SW:0]      branch_B_31 ;
269wire    [SW:0]      branch_A_32;
270wire    [SW:0]      branch_B_32;
271wire    [SW:0]      branch_A_33;
272wire    [SW:0]      branch_B_33;
273wire    [SW:0]      branch_A_34;
274wire    [SW:0]      branch_B_34;
275wire    [SW:0]      branch_A_35;
276wire    [SW:0]      branch_B_35;
277wire    [SW:0]      branch_A_36;
278wire    [SW:0]      branch_B_36;
279wire    [SW:0]      branch_A_37;
280wire    [SW:0]      branch_B_37;
281wire    [SW:0]      branch_A_38;
282wire    [SW:0]      branch_B_38;
283wire    [SW:0]      branch_A_39;
284wire    [SW:0]      branch_B_39;
285wire    [SW:0]      branch_A_40;
286wire    [SW:0]      branch_B_40;
287wire    [SW:0]      branch_A_41;
288wire    [SW:0]      branch_B_41;
289wire    [SW:0]      branch_A_42 ;
290wire    [SW:0]      branch_B_42 ;
291wire    [SW:0]      branch_A_43 ;
292wire    [SW:0]      branch_B_43 ;
293wire    [SW:0]      branch_A_44 ;
294wire    [SW:0]      branch_B_44 ;
295wire    [SW:0]      branch_A_45 ;
296wire    [SW:0]      branch_B_45 ;
297wire    [SW:0]      branch_A_46 ;
298wire    [SW:0]      branch_B_46 ;
299wire    [SW:0]      branch_A_47 ;
300wire    [SW:0]      branch_B_47 ;
301wire    [SW:0]      branch_A_48;
302wire    [SW:0]      branch_B_48;
303wire    [SW:0]      branch_A_49;
304wire    [SW:0]      branch_B_49;
305wire    [SW:0]      branch_A_50;
306wire    [SW:0]      branch_B_50;
307wire    [SW:0]      branch_A_51;
308wire    [SW:0]      branch_B_51;
309wire    [SW:0]      branch_A_52;
310wire    [SW:0]      branch_B_52;
311wire    [SW:0]      branch_A_53;
312wire    [SW:0]      branch_B_53;
313wire    [SW:0]      branch_A_54;
314wire    [SW:0]      branch_B_54;
315wire    [SW:0]      branch_A_55;
316wire    [SW:0]      branch_B_55;
317wire    [SW:0]      branch_A_56;
318wire    [SW:0]      branch_B_56;
319wire    [SW:0]      branch_A_57;
320wire    [SW:0]      branch_B_57;
321wire    [SW:0]      branch_A_58 ;
322wire    [SW:0]      branch_B_58 ;
323wire    [SW:0]      branch_A_59 ;
324wire    [SW:0]      branch_B_59 ;
325wire    [SW:0]      branch_A_60 ;
326wire    [SW:0]      branch_B_60 ;
327wire    [SW:0]      branch_A_61 ;
328wire    [SW:0]      branch_B_61 ;
329wire    [SW:0]      branch_A_62 ;
330wire    [SW:0]      branch_B_62 ;
331wire    [SW:0]      branch_A_63 ;
332wire    [SW:0]      branch_B_63 ;
333
334reg     [M -1:0]    metric_0 ;
335reg     [M -1:0]    metric_1 ;
336reg     [M -1:0]    metric_2 ;
337reg     [M -1:0]    metric_3 ;
338reg     [M -1:0]    metric_4 ;
339reg     [M -1:0]    metric_5 ;
340reg     [M -1:0]    metric_6 ;
341reg     [M -1:0]    metric_7 ;
342reg     [M -1:0]    metric_8 ;
343reg     [M -1:0]    metric_9 ;
344reg     [M -1:0]    metric_10 ;
345reg     [M -1:0]    metric_11 ;
346reg     [M -1:0]    metric_12 ;
347reg     [M -1:0]    metric_13 ;
348reg     [M -1:0]    metric_14 ;
349reg     [M -1:0]    metric_15 ;
350reg     [M -1:0]    metric_16;
351reg     [M -1:0]    metric_17;
352reg     [M -1:0]    metric_18;
353reg     [M -1:0]    metric_19;
354reg     [M -1:0]    metric_20;
355reg     [M -1:0]    metric_21;
356reg     [M -1:0]    metric_22;
357reg     [M -1:0]    metric_23;
358reg     [M -1:0]    metric_24;
359reg     [M -1:0]    metric_25;
360reg     [M -1:0]    metric_26 ;
361reg     [M -1:0]    metric_27 ;
362reg     [M -1:0]    metric_28 ;
363reg     [M -1:0]    metric_29 ;
364reg     [M -1:0]    metric_30 ;
365reg     [M -1:0]    metric_31 ;
366reg     [M -1:0]    metric_32;
367reg     [M -1:0]    metric_33;
368reg     [M -1:0]    metric_34;
369reg     [M -1:0]    metric_35;
370reg     [M -1:0]    metric_36;
371reg     [M -1:0]    metric_37;
372reg     [M -1:0]    metric_38;
373reg     [M -1:0]    metric_39;
374reg     [M -1:0]    metric_40;
375reg     [M -1:0]    metric_41;
376reg     [M -1:0]    metric_42 ;
377reg     [M -1:0]    metric_43 ;
378reg     [M -1:0]    metric_44 ;
379reg     [M -1:0]    metric_45 ;
380reg     [M -1:0]    metric_46 ;
381reg     [M -1:0]    metric_47 ;
382reg     [M -1:0]    metric_48;
383reg     [M -1:0]    metric_49;
384reg     [M -1:0]    metric_50;
385reg     [M -1:0]    metric_51;
386reg     [M -1:0]    metric_52;
387reg     [M -1:0]    metric_53;
388reg     [M -1:0]    metric_54;
389reg     [M -1:0]    metric_55;
390reg     [M -1:0]    metric_56;
391reg     [M -1:0]    metric_57;
392reg     [M -1:0]    metric_58 ;
393reg     [M -1:0]    metric_59 ;
394reg     [M -1:0]    metric_60 ;
395reg     [M -1:0]    metric_61 ;
396reg     [M -1:0]    metric_62 ;
397reg     [M -1:0]    metric_63 ;
398
399wire    [M -1:0]    metric_next_0 ;
400wire    [M -1:0]    metric_next_1 ;
401wire    [M -1:0]    metric_next_2 ;
402wire    [M -1:0]    metric_next_3 ;
403wire    [M -1:0]    metric_next_4 ;
404wire    [M -1:0]    metric_next_5 ;
405wire    [M -1:0]    metric_next_6 ;
406wire    [M -1:0]    metric_next_7 ;
407wire    [M -1:0]    metric_next_8 ;
408wire    [M -1:0]    metric_next_9 ;
409wire    [M -1:0]    metric_next_10 ;
410wire    [M -1:0]    metric_next_11 ;
411wire    [M -1:0]    metric_next_12 ;
412wire    [M -1:0]    metric_next_13 ;
413wire    [M -1:0]    metric_next_14 ;
414wire    [M -1:0]    metric_next_15 ;
415wire    [M -1:0]    metric_next_16;
416wire    [M -1:0]    metric_next_17;
417wire    [M -1:0]    metric_next_18;
418wire    [M -1:0]    metric_next_19;
419wire    [M -1:0]    metric_next_20;
420wire    [M -1:0]    metric_next_21;
421wire    [M -1:0]    metric_next_22;
422wire    [M -1:0]    metric_next_23;
423wire    [M -1:0]    metric_next_24;
424wire    [M -1:0]    metric_next_25;
425wire    [M -1:0]    metric_next_26 ;
426wire    [M -1:0]    metric_next_27 ;
427wire    [M -1:0]    metric_next_28 ;
428wire    [M -1:0]    metric_next_29 ;
429wire    [M -1:0]    metric_next_30 ;
430wire    [M -1:0]    metric_next_31 ;
431wire    [M -1:0]    metric_next_32;
432wire    [M -1:0]    metric_next_33;
433wire    [M -1:0]    metric_next_34;
434wire    [M -1:0]    metric_next_35;
435wire    [M -1:0]    metric_next_36;
436wire    [M -1:0]    metric_next_37;
437wire    [M -1:0]    metric_next_38;
438wire    [M -1:0]    metric_next_39;
439wire    [M -1:0]    metric_next_40;
440wire    [M -1:0]    metric_next_41;
441wire    [M -1:0]    metric_next_42 ;
442wire    [M -1:0]    metric_next_43 ;
443wire    [M -1:0]    metric_next_44 ;
444wire    [M -1:0]    metric_next_45 ;
445wire    [M -1:0]    metric_next_46 ;
446wire    [M -1:0]    metric_next_47 ;
447wire    [M -1:0]    metric_next_48;
448wire    [M -1:0]    metric_next_49;
449wire    [M -1:0]    metric_next_50;
450wire    [M -1:0]    metric_next_51;
451wire    [M -1:0]    metric_next_52;
452wire    [M -1:0]    metric_next_53;
453wire    [M -1:0]    metric_next_54;
454wire    [M -1:0]    metric_next_55;
455wire    [M -1:0]    metric_next_56;
456wire    [M -1:0]    metric_next_57;
457wire    [M -1:0]    metric_next_58 ;
458wire    [M -1:0]    metric_next_59 ;
459wire    [M -1:0]    metric_next_60 ;
460wire    [M -1:0]    metric_next_61 ;
461wire    [M -1:0]    metric_next_62 ;
462wire    [M -1:0]    metric_next_63 ;
463
464wire    [M -1:0]    metric_A_0 ;
465wire    [M -1:0]    metric_B_0 ;
466wire    [M -1:0]    metric_A_1 ;
467wire    [M -1:0]    metric_B_1 ;
468wire    [M -1:0]    metric_A_2 ;
469wire    [M -1:0]    metric_B_2 ;
470wire    [M -1:0]    metric_A_3 ;
471wire    [M -1:0]    metric_B_3 ;
472wire    [M -1:0]    metric_A_4 ;
473wire    [M -1:0]    metric_B_4 ;
474wire    [M -1:0]    metric_A_5 ;
475wire    [M -1:0]    metric_B_5 ;
476wire    [M -1:0]    metric_A_6 ;
477wire    [M -1:0]    metric_B_6 ;
478wire    [M -1:0]    metric_A_7 ;
479wire    [M -1:0]    metric_B_7 ;
480wire    [M -1:0]    metric_A_8 ;
481wire    [M -1:0]    metric_B_8 ;
482wire    [M -1:0]    metric_A_9 ;
483wire    [M -1:0]    metric_B_9 ;
484wire    [M -1:0]    metric_A_10 ;
485wire    [M -1:0]    metric_B_10 ;
486wire    [M -1:0]    metric_A_11 ;
487wire    [M -1:0]    metric_B_11 ;
488wire    [M -1:0]    metric_A_12 ;
489wire    [M -1:0]    metric_B_12 ;
490wire    [M -1:0]    metric_A_13 ;
491wire    [M -1:0]    metric_B_13 ;
492wire    [M -1:0]    metric_A_14 ;
493wire    [M -1:0]    metric_B_14 ;
494wire    [M -1:0]    metric_A_15 ;
495wire    [M -1:0]    metric_B_15 ;
496wire    [M -1:0]    metric_A_16;
497wire    [M -1:0]    metric_B_16;
498wire    [M -1:0]    metric_A_17;
499wire    [M -1:0]    metric_B_17;
500wire    [M -1:0]    metric_A_18;
501wire    [M -1:0]    metric_B_18;
502wire    [M -1:0]    metric_A_19;
503wire    [M -1:0]    metric_B_19;
504wire    [M -1:0]    metric_A_20;
505wire    [M -1:0]    metric_B_20;
506wire    [M -1:0]    metric_A_21;
507wire    [M -1:0]    metric_B_21;
508wire    [M -1:0]    metric_A_22;
509wire    [M -1:0]    metric_B_22;
510wire    [M -1:0]    metric_A_23;
511wire    [M -1:0]    metric_B_23;
512wire    [M -1:0]    metric_A_24;
513wire    [M -1:0]    metric_B_24;
514wire    [M -1:0]    metric_A_25;
515wire    [M -1:0]    metric_B_25;
516wire    [M -1:0]    metric_A_26 ;
517wire    [M -1:0]    metric_B_26 ;
518wire    [M -1:0]    metric_A_27 ;
519wire    [M -1:0]    metric_B_27 ;
520wire    [M -1:0]    metric_A_28 ;
521wire    [M -1:0]    metric_B_28 ;
522wire    [M -1:0]    metric_A_29 ;
523wire    [M -1:0]    metric_B_29 ;
524wire    [M -1:0]    metric_A_30 ;
525wire    [M -1:0]    metric_B_30 ;
526wire    [M -1:0]    metric_A_31 ;
527wire    [M -1:0]    metric_B_31 ;
528wire    [M -1:0]    metric_A_32;
529wire    [M -1:0]    metric_B_32;
530wire    [M -1:0]    metric_A_33;
531wire    [M -1:0]    metric_B_33;
532wire    [M -1:0]    metric_A_34;
533wire    [M -1:0]    metric_B_34;
534wire    [M -1:0]    metric_A_35;
535wire    [M -1:0]    metric_B_35;
536wire    [M -1:0]    metric_A_36;
537wire    [M -1:0]    metric_B_36;
538wire    [M -1:0]    metric_A_37;
539wire    [M -1:0]    metric_B_37;
540wire    [M -1:0]    metric_A_38;
541wire    [M -1:0]    metric_B_38;
542wire    [M -1:0]    metric_A_39;
543wire    [M -1:0]    metric_B_39;
544wire    [M -1:0]    metric_A_40;
545wire    [M -1:0]    metric_B_40;
546wire    [M -1:0]    metric_A_41;
547wire    [M -1:0]    metric_B_41;
548wire    [M -1:0]    metric_A_42 ;
549wire    [M -1:0]    metric_B_42 ;
550wire    [M -1:0]    metric_A_43 ;
551wire    [M -1:0]    metric_B_43 ;
552wire    [M -1:0]    metric_A_44 ;
553wire    [M -1:0]    metric_B_44 ;
554wire    [M -1:0]    metric_A_45 ;
555wire    [M -1:0]    metric_B_45 ;
556wire    [M -1:0]    metric_A_46 ;
557wire    [M -1:0]    metric_B_46 ;
558wire    [M -1:0]    metric_A_47 ;
559wire    [M -1:0]    metric_B_47 ;
560wire    [M -1:0]    metric_A_48;
561wire    [M -1:0]    metric_B_48;
562wire    [M -1:0]    metric_A_49;
563wire    [M -1:0]    metric_B_49;
564wire    [M -1:0]    metric_A_50;
565wire    [M -1:0]    metric_B_50;
566wire    [M -1:0]    metric_A_51;
567wire    [M -1:0]    metric_B_51;
568wire    [M -1:0]    metric_A_52;
569wire    [M -1:0]    metric_B_52;
570wire    [M -1:0]    metric_A_53;
571wire    [M -1:0]    metric_B_53;
572wire    [M -1:0]    metric_A_54;
573wire    [M -1:0]    metric_B_54;
574wire    [M -1:0]    metric_A_55;
575wire    [M -1:0]    metric_B_55;
576wire    [M -1:0]    metric_A_56;
577wire    [M -1:0]    metric_B_56;
578wire    [M -1:0]    metric_A_57;
579wire    [M -1:0]    metric_B_57;
580wire    [M -1:0]    metric_A_58 ;
581wire    [M -1:0]    metric_B_58 ;
582wire    [M -1:0]    metric_A_59 ;
583wire    [M -1:0]    metric_B_59 ;
584wire    [M -1:0]    metric_A_60 ;
585wire    [M -1:0]    metric_B_60 ;
586wire    [M -1:0]    metric_A_61 ;
587wire    [M -1:0]    metric_B_61 ;
588wire    [M -1:0]    metric_A_62 ;
589wire    [M -1:0]    metric_B_62 ;
590wire    [M -1:0]    metric_A_63 ;
591wire    [M -1:0]    metric_B_63 ;
592                             
593// 64 state tran             
594reg     [0:0]       tran_state_0  [TR -1:0] ;
595reg     [0:0]       tran_state_1  [TR -1:0] ;
596reg     [0:0]       tran_state_2  [TR -1:0] ;
597reg     [0:0]       tran_state_3  [TR -1:0] ;
598reg     [0:0]       tran_state_4  [TR -1:0] ;
599reg     [0:0]       tran_state_5  [TR -1:0] ;
600reg     [0:0]       tran_state_6  [TR -1:0] ;
601reg     [0:0]       tran_state_7  [TR -1:0] ;
602reg     [0:0]       tran_state_8  [TR -1:0] ;
603reg     [0:0]       tran_state_9  [TR -1:0] ;
604reg     [0:0]       tran_state_10 [TR -1:0] ;
605reg     [0:0]       tran_state_11 [TR -1:0] ;
606reg     [0:0]       tran_state_12 [TR -1:0] ;
607reg     [0:0]       tran_state_13 [TR -1:0] ;
608reg     [0:0]       tran_state_14 [TR -1:0] ;
609reg     [0:0]       tran_state_15 [TR -1:0] ;
610reg     [0:0]       tran_state_16 [TR -1:0] ;
611reg     [0:0]       tran_state_17 [TR -1:0] ;
612reg     [0:0]       tran_state_18 [TR -1:0] ;
613reg     [0:0]       tran_state_19 [TR -1:0] ;
614reg     [0:0]       tran_state_20 [TR -1:0] ;
615reg     [0:0]       tran_state_21 [TR -1:0] ;
616reg     [0:0]       tran_state_22 [TR -1:0] ;
617reg     [0:0]       tran_state_23 [TR -1:0] ;
618reg     [0:0]       tran_state_24 [TR -1:0] ;
619reg     [0:0]       tran_state_25 [TR -1:0] ;
620reg     [0:0]       tran_state_26 [TR -1:0] ;
621reg     [0:0]       tran_state_27 [TR -1:0] ;
622reg     [0:0]       tran_state_28 [TR -1:0] ;
623reg     [0:0]       tran_state_29 [TR -1:0] ;
624reg     [0:0]       tran_state_30 [TR -1:0] ;
625reg     [0:0]       tran_state_31 [TR -1:0] ;
626reg     [0:0]       tran_state_32 [TR -1:0] ;
627reg     [0:0]       tran_state_33 [TR -1:0] ;
628reg     [0:0]       tran_state_34 [TR -1:0] ;
629reg     [0:0]       tran_state_35 [TR -1:0] ;
630reg     [0:0]       tran_state_36 [TR -1:0] ;
631reg     [0:0]       tran_state_37 [TR -1:0] ;
632reg     [0:0]       tran_state_38 [TR -1:0] ;
633reg     [0:0]       tran_state_39 [TR -1:0] ;
634reg     [0:0]       tran_state_40 [TR -1:0] ;
635reg     [0:0]       tran_state_41 [TR -1:0] ;
636reg     [0:0]       tran_state_42 [TR -1:0] ;
637reg     [0:0]       tran_state_43 [TR -1:0] ;
638reg     [0:0]       tran_state_44 [TR -1:0] ;
639reg     [0:0]       tran_state_45 [TR -1:0] ;
640reg     [0:0]       tran_state_46 [TR -1:0] ;
641reg     [0:0]       tran_state_47 [TR -1:0] ;
642reg     [0:0]       tran_state_48 [TR -1:0] ;
643reg     [0:0]       tran_state_49 [TR -1:0] ;
644reg     [0:0]       tran_state_50 [TR -1:0] ;
645reg     [0:0]       tran_state_51 [TR -1:0] ;
646reg     [0:0]       tran_state_52 [TR -1:0] ;
647reg     [0:0]       tran_state_53 [TR -1:0] ;
648reg     [0:0]       tran_state_54 [TR -1:0] ;
649reg     [0:0]       tran_state_55 [TR -1:0] ;
650reg     [0:0]       tran_state_56 [TR -1:0] ;
651reg     [0:0]       tran_state_57 [TR -1:0] ;
652reg     [0:0]       tran_state_58 [TR -1:0] ;
653reg     [0:0]       tran_state_59 [TR -1:0] ;
654reg     [0:0]       tran_state_60 [TR -1:0] ;
655reg     [0:0]       tran_state_61 [TR -1:0] ;
656reg     [0:0]       tran_state_62 [TR -1:0] ;
657reg     [0:0]       tran_state_63 [TR -1:0] ;
658                             
659reg     [TRW -1:0]  wptr ;   
660reg     [TRW -1:0]  last_wptr ;
661                             
662wire    [M -1:0]    diff_0 ; 
663wire    [M -1:0]    diff_1 ; 
664wire    [M -1:0]    diff_2 ; 
665wire    [M -1:0]    diff_3 ; 
666wire    [M -1:0]    diff_4 ; 
667wire    [M -1:0]    diff_5 ; 
668wire    [M -1:0]    diff_6 ; 
669wire    [M -1:0]    diff_7 ; 
670wire    [M -1:0]    diff_8 ; 
671wire    [M -1:0]    diff_9 ;
672wire    [M -1:0]    diff_10;
673wire    [M -1:0]    diff_11;
674wire    [M -1:0]    diff_12;
675wire    [M -1:0]    diff_13;
676wire    [M -1:0]    diff_14;
677wire    [M -1:0]    diff_15;
678wire    [M -1:0]    diff_16; 
679wire    [M -1:0]    diff_17; 
680wire    [M -1:0]    diff_18; 
681wire    [M -1:0]    diff_19; 
682wire    [M -1:0]    diff_20; 
683wire    [M -1:0]    diff_21; 
684wire    [M -1:0]    diff_22; 
685wire    [M -1:0]    diff_23; 
686wire    [M -1:0]    diff_24; 
687wire    [M -1:0]    diff_25;
688wire    [M -1:0]    diff_26;
689wire    [M -1:0]    diff_27;
690wire    [M -1:0]    diff_28;
691wire    [M -1:0]    diff_29;
692wire    [M -1:0]    diff_30;
693wire    [M -1:0]    diff_31;
694wire    [M -1:0]    diff_32; 
695wire    [M -1:0]    diff_33; 
696wire    [M -1:0]    diff_34; 
697wire    [M -1:0]    diff_35; 
698wire    [M -1:0]    diff_36; 
699wire    [M -1:0]    diff_37; 
700wire    [M -1:0]    diff_38; 
701wire    [M -1:0]    diff_39; 
702wire    [M -1:0]    diff_40; 
703wire    [M -1:0]    diff_41;
704wire    [M -1:0]    diff_42;
705wire    [M -1:0]    diff_43;
706wire    [M -1:0]    diff_44;
707wire    [M -1:0]    diff_45;
708wire    [M -1:0]    diff_46;
709wire    [M -1:0]    diff_47;
710wire    [M -1:0]    diff_48; 
711wire    [M -1:0]    diff_49; 
712wire    [M -1:0]    diff_50; 
713wire    [M -1:0]    diff_51; 
714wire    [M -1:0]    diff_52; 
715wire    [M -1:0]    diff_53; 
716wire    [M -1:0]    diff_54; 
717wire    [M -1:0]    diff_55; 
718wire    [M -1:0]    diff_56; 
719wire    [M -1:0]    diff_57;
720wire    [M -1:0]    diff_58;
721wire    [M -1:0]    diff_59;
722wire    [M -1:0]    diff_60;
723wire    [M -1:0]    diff_61;
724wire    [M -1:0]    diff_62;
725wire    [M -1:0]    diff_63;
726
727reg                 nd ;
728reg     [LW -1:0]   cnt ;
729reg                 trace ;
730reg                 trace_en ;
731
732reg                 early_trace1_en;
733reg                 early_trace2_en;
734
735wire                trace_done ;
736reg                 trace_done_s0 ;
737wire                trace_done_pos ;
738reg     [TRW -1:0]  trace_cnt ;
739reg     [L-1:0]     res ;
740wire    [L-1:0]     res_shift ;
741wire    [K-2: 0]    init_state_i ;
742reg     [K-2: 0]    trace_state ;
743
744wire    [K-2: 0]    cur_state0 ;
745wire    [K-2: 0]    cur_state1 ;
746wire    [K-2: 0]    next_state ;
747reg     [TRW -1:0]  trace_start_wptr ;
748wire    [TRW -1:0]  trace_start_pos ;
749wire    [TRW -1:0]  trace_start_pos0 ;
750wire    [TRW -1:0]  trace_start_pos1 ;
751reg                 last_trace ;
752reg                 last_trace_s0 ;
753wire                trace2 ;
754reg                 trace2_s1 ;
755reg                 trace2_s2 ;
756reg                 trace_pos ;
757wire                trace_pos_i ;
758reg     [LW -1:0]   last_trace_num ;
759reg                 flush_en ;
760wire                flush ;
761reg                 done_i ;
762
763wire    [K-2: 0]    state_0 ;
764wire    [K-2: 0]    state_1 ;
765wire    [K-2: 0]    state_2 ;
766wire    [K-2: 0]    state_3 ;
767wire    [K-2: 0]    state_4 ;
768wire    [K-2: 0]    state_5 ;
769wire    [K-2: 0]    state_6 ;
770wire    [K-2: 0]    state_7 ;
771wire    [K-2: 0]    state_8 ;
772wire    [K-2: 0]    state_9 ;
773wire    [K-2: 0]    state_10 ;
774wire    [K-2: 0]    state_11 ;
775wire    [K-2: 0]    state_12 ;
776wire    [K-2: 0]    state_13 ;
777wire    [K-2: 0]    state_14 ;
778wire    [K-2: 0]    state_15 ;
779
780wire    [K-2: 0]    state_s1_0 ;
781wire    [K-2: 0]    state_s1_1 ;
782wire    [K-2: 0]    state_s1_2 ;
783wire    [K-2: 0]    state_s1_3 ;
784
785wire    [K-2: 0]    state_s2_0 ;
786
787wire    [M-1: 0]    max_0  ;
788wire    [M-1: 0]    max_1  ;
789wire    [M-1: 0]    max_2  ;
790wire    [M-1: 0]    max_3  ;
791wire    [M-1: 0]    max_4  ;
792wire    [M-1: 0]    max_5  ;
793wire    [M-1: 0]    max_6  ;
794wire    [M-1: 0]    max_7  ;
795wire    [M-1: 0]    max_8  ;
796wire    [M-1: 0]    max_9  ;
797wire    [M-1: 0]    max_10 ;
798wire    [M-1: 0]    max_11 ;
799wire    [M-1: 0]    max_12 ;
800wire    [M-1: 0]    max_13 ;
801wire    [M-1: 0]    max_14 ;
802wire    [M-1: 0]    max_15 ;
803
804wire    [M-1: 0]    max_s1_0 ;
805wire    [M-1: 0]    max_s1_1 ;
806wire    [M-1: 0]    max_s1_2 ;
807wire    [M-1: 0]    max_s1_3 ;
808
809//reg     [M-1: 0]    max_s1_0_s0 ;
810//reg     [M-1: 0]    max_s1_1_s0 ;
811//reg     [M-1: 0]    max_s1_2_s0 ;
812//reg     [M-1: 0]    max_s1_3_s0 ;
813
814//wire    [M-1: 0]    max_s2_0 ;
815
816wire    [N -1:0]    tran_all_0 ;
817wire    [N -1:0]    tran_all_1 ;
818
819reg     [6:0]       flush_cnt ;
820wire    [LW -1:0]   rem_i ;
821reg     [LW -1:0]   last_cnt ;
822wire    [LW -1:0]   last_cnt_next ;
823reg                 last_trace_d0 ;
824reg                 last_trace_d1 ;
825reg                 last_trace_d2 ;
826reg                 last_trace_d3 ;
827reg                 last_trace_d4 ;
828reg                 last_trace_d5 ;
829reg                 one_more_out ;
830reg                 in_dec ;
831wire                dv_in_gate ;
832reg                 trace_pos_s0 ; 
833
834//======================================
835// Main body of code
836//======================================
837assign dv_out = trace_done_pos | one_more_out ;
838assign res_shift = res << last_trace_num ;
839assign dout = res_shift [L -1:C] ;
840assign remain = last_trace ? rem_i : 0 ;
841assign done = dv_out & done_i ;
842assign rem_i = ~last_cnt_next[LW-1] ? 0 : last_cnt ;
843
844//assign dv_in_gate = dv_in & in_dec ;
845assign dv_in_gate = dv_in & in_dec & (~packet_end) ;
846
847always @ (posedge clk)
848  if (~nrst)
849    in_dec <= 1'b0 ;
850  else if (packet_start)
851    in_dec <= 1'b1 ;
852  else if (packet_end)
853    in_dec <= 1'b0 ;
854
855
856//{coe_0 coe_1}, generated from C model gen_table
857//0 0;
858//0 1;
859//1 0;
860//1 1;
861//1 0;
862//1 1;
863//0 0;
864//0 1;
865
866assign branch_00 = {llr1[SW -1], llr1} + {llr0[SW -1], llr0} ;  //LLR(bit1) + LLR(bit0)
867assign branch_01 = {llr1[SW -1], llr1} ;                        //LLR(bit1)
868assign branch_10 = {llr0[SW -1], llr0} ;                        //LLR(bit0)
869assign branch_11 = 0  ;                                         //0
870
871assign branch_A_0 = branch_00 ;
872assign branch_B_0 = branch_11 ;
873assign branch_A_1 = branch_10 ;
874assign branch_B_1 = branch_01 ;
875assign branch_A_2 = branch_00 ;
876assign branch_B_2 = branch_11 ;
877assign branch_A_3 = branch_10 ;
878assign branch_B_3 = branch_01 ;
879assign branch_A_4 = branch_11 ;
880assign branch_B_4 = branch_00 ;
881assign branch_A_5 = branch_01 ;
882assign branch_B_5 = branch_10 ;
883assign branch_A_6 = branch_11 ;
884assign branch_B_6 = branch_00 ;
885assign branch_A_7 = branch_01 ;
886assign branch_B_7 = branch_10 ;
887assign branch_A_8 = branch_11 ;
888assign branch_B_8 = branch_00 ;
889assign branch_A_9 = branch_01 ;
890assign branch_B_9 = branch_10 ;
891assign branch_A_10 = branch_11 ;
892assign branch_B_10 = branch_00 ;
893assign branch_A_11 = branch_01 ;
894assign branch_B_11 = branch_10 ;
895assign branch_A_12 = branch_00 ;
896assign branch_B_12 = branch_11 ;
897assign branch_A_13 = branch_10 ;
898assign branch_B_13 = branch_01 ;
899assign branch_A_14 = branch_00 ;
900assign branch_B_14 = branch_11 ;
901assign branch_A_15 = branch_10 ;
902assign branch_B_15 = branch_01 ;
903assign branch_A_16 = branch_01 ;
904assign branch_B_16 = branch_10 ;
905assign branch_A_17 = branch_11 ;
906assign branch_B_17 = branch_00 ;
907assign branch_A_18 = branch_01 ;
908assign branch_B_18 = branch_10 ;
909assign branch_A_19 = branch_11 ;
910assign branch_B_19 = branch_00 ;
911assign branch_A_20 = branch_10 ;
912assign branch_B_20 = branch_01 ;
913assign branch_A_21 = branch_00 ;
914assign branch_B_21 = branch_11 ;
915assign branch_A_22 = branch_10 ;
916assign branch_B_22 = branch_01 ;
917assign branch_A_23 = branch_00 ;
918assign branch_B_23 = branch_11 ;
919assign branch_A_24 = branch_10 ;
920assign branch_B_24 = branch_01 ;
921assign branch_A_25 = branch_00 ;
922assign branch_B_25 = branch_11 ;
923assign branch_A_26 = branch_10 ;
924assign branch_B_26 = branch_01 ;
925assign branch_A_27 = branch_00 ;
926assign branch_B_27 = branch_11 ;
927assign branch_A_28 = branch_01 ;
928assign branch_B_28 = branch_10 ;
929assign branch_A_29 = branch_11 ;
930assign branch_B_29 = branch_00 ;
931assign branch_A_30 = branch_01 ;
932assign branch_B_30 = branch_10 ;
933assign branch_A_31 = branch_11 ;
934assign branch_B_31 = branch_00 ;
935
936assign branch_A_32 = branch_B_0 ;
937assign branch_B_32 = branch_A_0 ;
938assign branch_A_33 = branch_B_1 ;
939assign branch_B_33 = branch_A_1 ;
940assign branch_A_34 = branch_B_2 ;
941assign branch_B_34 = branch_A_2 ;
942assign branch_A_35 = branch_B_3 ;
943assign branch_B_35 = branch_A_3 ;
944assign branch_A_36 = branch_B_4 ;
945assign branch_B_36 = branch_A_4 ;
946assign branch_A_37 = branch_B_5 ;
947assign branch_B_37 = branch_A_5 ;
948assign branch_A_38 = branch_B_6 ;
949assign branch_B_38 = branch_A_6 ;
950assign branch_A_39 = branch_B_7 ;
951assign branch_B_39 = branch_A_7 ;
952assign branch_A_40 = branch_B_8 ;
953assign branch_B_40 = branch_A_8 ;
954assign branch_A_41 = branch_B_9 ;
955assign branch_B_41 = branch_A_9 ;
956assign branch_A_42 = branch_B_10 ;
957assign branch_B_42 = branch_A_10 ;
958assign branch_A_43 = branch_B_11 ;
959assign branch_B_43 = branch_A_11 ;
960assign branch_A_44 = branch_B_12 ;
961assign branch_B_44 = branch_A_12 ;
962assign branch_A_45 = branch_B_13 ;
963assign branch_B_45 = branch_A_13 ;
964assign branch_A_46 = branch_B_14 ;
965assign branch_B_46 = branch_A_14 ;
966assign branch_A_47 = branch_B_15 ;
967assign branch_B_47 = branch_A_15 ;
968assign branch_A_48 = branch_B_16 ;
969assign branch_B_48 = branch_A_16 ;
970assign branch_A_49 = branch_B_17 ;
971assign branch_B_49 = branch_A_17 ;
972assign branch_A_50 = branch_B_18 ;
973assign branch_B_50 = branch_A_18 ;
974assign branch_A_51 = branch_B_19 ;
975assign branch_B_51 = branch_A_19 ;
976assign branch_A_52 = branch_B_20 ;
977assign branch_B_52 = branch_A_20 ;
978assign branch_A_53 = branch_B_21 ;
979assign branch_B_53 = branch_A_21 ;
980assign branch_A_54 = branch_B_22 ;
981assign branch_B_54 = branch_A_22 ;
982assign branch_A_55 = branch_B_23 ;
983assign branch_B_55 = branch_A_23 ;
984assign branch_A_56 = branch_B_24 ;
985assign branch_B_56 = branch_A_24 ;
986assign branch_A_57 = branch_B_25 ;
987assign branch_B_57 = branch_A_25 ;
988assign branch_A_58 = branch_B_26 ;
989assign branch_B_58 = branch_A_26 ;
990assign branch_A_59 = branch_B_27 ;
991assign branch_B_59 = branch_A_27 ;
992assign branch_A_60 = branch_B_28 ;
993assign branch_B_60 = branch_A_28 ;
994assign branch_A_61 = branch_B_29 ;
995assign branch_B_61 = branch_A_29 ;
996assign branch_A_62 = branch_B_30 ;
997assign branch_B_62 = branch_A_30 ;
998assign branch_A_63 = branch_B_31 ;
999assign branch_B_63 = branch_A_31 ;
1000
1001assign metric_A_0 = metric_0 + {{(M -SW -1){branch_A_0[SW]}}, branch_A_0} ;
1002assign metric_B_0 = metric_1 + {{(M -SW -1){branch_B_0[SW]}}, branch_B_0} ;
1003assign metric_A_1 = metric_2 + {{(M -SW -1){branch_A_1[SW]}}, branch_A_1} ;
1004assign metric_B_1 = metric_3 + {{(M -SW -1){branch_B_1[SW]}}, branch_B_1} ;
1005assign metric_A_2 = metric_4 + {{(M -SW -1){branch_A_2[SW]}}, branch_A_2} ;
1006assign metric_B_2 = metric_5 + {{(M -SW -1){branch_B_2[SW]}}, branch_B_2} ;
1007assign metric_A_3 = metric_6 + {{(M -SW -1){branch_A_3[SW]}}, branch_A_3} ;
1008assign metric_B_3 = metric_7 + {{(M -SW -1){branch_B_3[SW]}}, branch_B_3} ;
1009assign metric_A_4 = metric_8 + {{(M -SW -1){branch_A_4[SW]}}, branch_A_4} ;
1010assign metric_B_4 = metric_9 + {{(M -SW -1){branch_B_4[SW]}}, branch_B_4} ;
1011assign metric_A_5 = metric_10 + {{(M -SW -1){branch_A_5[SW]}}, branch_A_5} ;
1012assign metric_B_5 = metric_11 + {{(M -SW -1){branch_B_5[SW]}}, branch_B_5} ;
1013assign metric_A_6 = metric_12 + {{(M -SW -1){branch_A_6[SW]}}, branch_A_6} ;
1014assign metric_B_6 = metric_13 + {{(M -SW -1){branch_B_6[SW]}}, branch_B_6} ;
1015assign metric_A_7 = metric_14 + {{(M -SW -1){branch_A_7[SW]}}, branch_A_7} ;
1016assign metric_B_7 = metric_15 + {{(M -SW -1){branch_B_7[SW]}}, branch_B_7} ;
1017assign metric_A_8 = metric_16 + {{(M -SW -1){branch_A_8[SW]}}, branch_A_8} ;
1018assign metric_B_8 = metric_17 + {{(M -SW -1){branch_B_8[SW]}}, branch_B_8} ;
1019assign metric_A_9 = metric_18 + {{(M -SW -1){branch_A_9[SW]}}, branch_A_9} ;
1020assign metric_B_9 = metric_19 + {{(M -SW -1){branch_B_9[SW]}}, branch_B_9} ;
1021assign metric_A_10 = metric_20 + {{(M -SW -1){branch_A_10[SW]}}, branch_A_10} ;
1022assign metric_B_10 = metric_21 + {{(M -SW -1){branch_B_10[SW]}}, branch_B_10} ;
1023assign metric_A_11 = metric_22 + {{(M -SW -1){branch_A_11[SW]}}, branch_A_11} ;
1024assign metric_B_11 = metric_23 + {{(M -SW -1){branch_B_11[SW]}}, branch_B_11} ;
1025assign metric_A_12 = metric_24 + {{(M -SW -1){branch_A_12[SW]}}, branch_A_12} ;
1026assign metric_B_12 = metric_25 + {{(M -SW -1){branch_B_12[SW]}}, branch_B_12} ;
1027assign metric_A_13 = metric_26 + {{(M -SW -1){branch_A_13[SW]}}, branch_A_13} ;
1028assign metric_B_13 = metric_27 + {{(M -SW -1){branch_B_13[SW]}}, branch_B_13} ;
1029assign metric_A_14 = metric_28 + {{(M -SW -1){branch_A_14[SW]}}, branch_A_14} ;
1030assign metric_B_14 = metric_29 + {{(M -SW -1){branch_B_14[SW]}}, branch_B_14} ;
1031assign metric_A_15 = metric_30 + {{(M -SW -1){branch_A_15[SW]}}, branch_A_15} ;
1032assign metric_B_15 = metric_31 + {{(M -SW -1){branch_B_15[SW]}}, branch_B_15} ;
1033assign metric_A_16 = metric_32 + {{(M -SW -1){branch_A_16[SW]}}, branch_A_16} ;
1034assign metric_B_16 = metric_33 + {{(M -SW -1){branch_B_16[SW]}}, branch_B_16} ;
1035assign metric_A_17 = metric_34 + {{(M -SW -1){branch_A_17[SW]}}, branch_A_17} ;
1036assign metric_B_17 = metric_35 + {{(M -SW -1){branch_B_17[SW]}}, branch_B_17} ;
1037assign metric_A_18 = metric_36 + {{(M -SW -1){branch_A_18[SW]}}, branch_A_18} ;
1038assign metric_B_18 = metric_37 + {{(M -SW -1){branch_B_18[SW]}}, branch_B_18} ;
1039assign metric_A_19 = metric_38 + {{(M -SW -1){branch_A_19[SW]}}, branch_A_19} ;
1040assign metric_B_19 = metric_39 + {{(M -SW -1){branch_B_19[SW]}}, branch_B_19} ;
1041assign metric_A_20 = metric_40 + {{(M -SW -1){branch_A_20[SW]}}, branch_A_20} ;
1042assign metric_B_20 = metric_41 + {{(M -SW -1){branch_B_20[SW]}}, branch_B_20} ;
1043assign metric_A_21 = metric_42 + {{(M -SW -1){branch_A_21[SW]}}, branch_A_21} ;
1044assign metric_B_21 = metric_43 + {{(M -SW -1){branch_B_21[SW]}}, branch_B_21} ;
1045assign metric_A_22 = metric_44 + {{(M -SW -1){branch_A_22[SW]}}, branch_A_22} ;
1046assign metric_B_22 = metric_45 + {{(M -SW -1){branch_B_22[SW]}}, branch_B_22} ;
1047assign metric_A_23 = metric_46 + {{(M -SW -1){branch_A_23[SW]}}, branch_A_23} ;
1048assign metric_B_23 = metric_47 + {{(M -SW -1){branch_B_23[SW]}}, branch_B_23} ;
1049assign metric_A_24 = metric_48 + {{(M -SW -1){branch_A_24[SW]}}, branch_A_24} ;
1050assign metric_B_24 = metric_49 + {{(M -SW -1){branch_B_24[SW]}}, branch_B_24} ;
1051assign metric_A_25 = metric_50 + {{(M -SW -1){branch_A_25[SW]}}, branch_A_25} ;
1052assign metric_B_25 = metric_51 + {{(M -SW -1){branch_B_25[SW]}}, branch_B_25} ;
1053assign metric_A_26 = metric_52 + {{(M -SW -1){branch_A_26[SW]}}, branch_A_26} ;
1054assign metric_B_26 = metric_53 + {{(M -SW -1){branch_B_26[SW]}}, branch_B_26} ;
1055assign metric_A_27 = metric_54 + {{(M -SW -1){branch_A_27[SW]}}, branch_A_27} ;
1056assign metric_B_27 = metric_55 + {{(M -SW -1){branch_B_27[SW]}}, branch_B_27} ;
1057assign metric_A_28 = metric_56 + {{(M -SW -1){branch_A_28[SW]}}, branch_A_28} ;
1058assign metric_B_28 = metric_57 + {{(M -SW -1){branch_B_28[SW]}}, branch_B_28} ;
1059assign metric_A_29 = metric_58 + {{(M -SW -1){branch_A_29[SW]}}, branch_A_29} ;
1060assign metric_B_29 = metric_59 + {{(M -SW -1){branch_B_29[SW]}}, branch_B_29} ;
1061assign metric_A_30 = metric_60 + {{(M -SW -1){branch_A_30[SW]}}, branch_A_30} ;
1062assign metric_B_30 = metric_61 + {{(M -SW -1){branch_B_30[SW]}}, branch_B_30} ;
1063assign metric_A_31 = metric_62 + {{(M -SW -1){branch_A_31[SW]}}, branch_A_31} ;
1064assign metric_B_31 = metric_63 + {{(M -SW -1){branch_B_31[SW]}}, branch_B_31} ;
1065assign metric_A_32 = metric_0 + {{(M -SW -1){branch_A_32[SW]}}, branch_A_32} ;
1066assign metric_B_32 = metric_1 + {{(M -SW -1){branch_B_32[SW]}}, branch_B_32} ;
1067assign metric_A_33 = metric_2 + {{(M -SW -1){branch_A_33[SW]}}, branch_A_33} ;
1068assign metric_B_33 = metric_3 + {{(M -SW -1){branch_B_33[SW]}}, branch_B_33} ;
1069assign metric_A_34 = metric_4 + {{(M -SW -1){branch_A_34[SW]}}, branch_A_34} ;
1070assign metric_B_34 = metric_5 + {{(M -SW -1){branch_B_34[SW]}}, branch_B_34} ;
1071assign metric_A_35 = metric_6 + {{(M -SW -1){branch_A_35[SW]}}, branch_A_35} ;
1072assign metric_B_35 = metric_7 + {{(M -SW -1){branch_B_35[SW]}}, branch_B_35} ;
1073assign metric_A_36 = metric_8 + {{(M -SW -1){branch_A_36[SW]}}, branch_A_36} ;
1074assign metric_B_36 = metric_9 + {{(M -SW -1){branch_B_36[SW]}}, branch_B_36} ;
1075assign metric_A_37 = metric_10 + {{(M -SW -1){branch_A_37[SW]}}, branch_A_37} ;
1076assign metric_B_37 = metric_11 + {{(M -SW -1){branch_B_37[SW]}}, branch_B_37} ;
1077assign metric_A_38 = metric_12 + {{(M -SW -1){branch_A_38[SW]}}, branch_A_38} ;
1078assign metric_B_38 = metric_13 + {{(M -SW -1){branch_B_38[SW]}}, branch_B_38} ;
1079assign metric_A_39 = metric_14 + {{(M -SW -1){branch_A_39[SW]}}, branch_A_39} ;
1080assign metric_B_39 = metric_15 + {{(M -SW -1){branch_B_39[SW]}}, branch_B_39} ;
1081assign metric_A_40 = metric_16 + {{(M -SW -1){branch_A_40[SW]}}, branch_A_40} ;
1082assign metric_B_40 = metric_17 + {{(M -SW -1){branch_B_40[SW]}}, branch_B_40} ;
1083assign metric_A_41 = metric_18 + {{(M -SW -1){branch_A_41[SW]}}, branch_A_41} ;
1084assign metric_B_41 = metric_19 + {{(M -SW -1){branch_B_41[SW]}}, branch_B_41} ;
1085assign metric_A_42 = metric_20 + {{(M -SW -1){branch_A_42[SW]}}, branch_A_42} ;
1086assign metric_B_42 = metric_21 + {{(M -SW -1){branch_B_42[SW]}}, branch_B_42} ;
1087assign metric_A_43 = metric_22 + {{(M -SW -1){branch_A_43[SW]}}, branch_A_43} ;
1088assign metric_B_43 = metric_23 + {{(M -SW -1){branch_B_43[SW]}}, branch_B_43} ;
1089assign metric_A_44 = metric_24 + {{(M -SW -1){branch_A_44[SW]}}, branch_A_44} ;
1090assign metric_B_44 = metric_25 + {{(M -SW -1){branch_B_44[SW]}}, branch_B_44} ;
1091assign metric_A_45 = metric_26 + {{(M -SW -1){branch_A_45[SW]}}, branch_A_45} ;
1092assign metric_B_45 = metric_27 + {{(M -SW -1){branch_B_45[SW]}}, branch_B_45} ;
1093assign metric_A_46 = metric_28 + {{(M -SW -1){branch_A_46[SW]}}, branch_A_46} ;
1094assign metric_B_46 = metric_29 + {{(M -SW -1){branch_B_46[SW]}}, branch_B_46} ;
1095assign metric_A_47 = metric_30 + {{(M -SW -1){branch_A_47[SW]}}, branch_A_47} ;
1096assign metric_B_47 = metric_31 + {{(M -SW -1){branch_B_47[SW]}}, branch_B_47} ;
1097assign metric_A_48 = metric_32 + {{(M -SW -1){branch_A_48[SW]}}, branch_A_48} ;
1098assign metric_B_48 = metric_33 + {{(M -SW -1){branch_B_48[SW]}}, branch_B_48} ;
1099assign metric_A_49 = metric_34 + {{(M -SW -1){branch_A_49[SW]}}, branch_A_49} ;
1100assign metric_B_49 = metric_35 + {{(M -SW -1){branch_B_49[SW]}}, branch_B_49} ;
1101assign metric_A_50 = metric_36 + {{(M -SW -1){branch_A_50[SW]}}, branch_A_50} ;
1102assign metric_B_50 = metric_37 + {{(M -SW -1){branch_B_50[SW]}}, branch_B_50} ;
1103assign metric_A_51 = metric_38 + {{(M -SW -1){branch_A_51[SW]}}, branch_A_51} ;
1104assign metric_B_51 = metric_39 + {{(M -SW -1){branch_B_51[SW]}}, branch_B_51} ;
1105assign metric_A_52 = metric_40 + {{(M -SW -1){branch_A_52[SW]}}, branch_A_52} ;
1106assign metric_B_52 = metric_41 + {{(M -SW -1){branch_B_52[SW]}}, branch_B_52} ;
1107assign metric_A_53 = metric_42 + {{(M -SW -1){branch_A_53[SW]}}, branch_A_53} ;
1108assign metric_B_53 = metric_43 + {{(M -SW -1){branch_B_53[SW]}}, branch_B_53} ;
1109assign metric_A_54 = metric_44 + {{(M -SW -1){branch_A_54[SW]}}, branch_A_54} ;
1110assign metric_B_54 = metric_45 + {{(M -SW -1){branch_B_54[SW]}}, branch_B_54} ;
1111assign metric_A_55 = metric_46 + {{(M -SW -1){branch_A_55[SW]}}, branch_A_55} ;
1112assign metric_B_55 = metric_47 + {{(M -SW -1){branch_B_55[SW]}}, branch_B_55} ;
1113assign metric_A_56 = metric_48 + {{(M -SW -1){branch_A_56[SW]}}, branch_A_56} ;
1114assign metric_B_56 = metric_49 + {{(M -SW -1){branch_B_56[SW]}}, branch_B_56} ;
1115assign metric_A_57 = metric_50 + {{(M -SW -1){branch_A_57[SW]}}, branch_A_57} ;
1116assign metric_B_57 = metric_51 + {{(M -SW -1){branch_B_57[SW]}}, branch_B_57} ;
1117assign metric_A_58 = metric_52 + {{(M -SW -1){branch_A_58[SW]}}, branch_A_58} ;
1118assign metric_B_58 = metric_53 + {{(M -SW -1){branch_B_58[SW]}}, branch_B_58} ;
1119assign metric_A_59 = metric_54 + {{(M -SW -1){branch_A_59[SW]}}, branch_A_59} ;
1120assign metric_B_59 = metric_55 + {{(M -SW -1){branch_B_59[SW]}}, branch_B_59} ;
1121assign metric_A_60 = metric_56 + {{(M -SW -1){branch_A_60[SW]}}, branch_A_60} ;
1122assign metric_B_60 = metric_57 + {{(M -SW -1){branch_B_60[SW]}}, branch_B_60} ;
1123assign metric_A_61 = metric_58 + {{(M -SW -1){branch_A_61[SW]}}, branch_A_61} ;
1124assign metric_B_61 = metric_59 + {{(M -SW -1){branch_B_61[SW]}}, branch_B_61} ;
1125assign metric_A_62 = metric_60 + {{(M -SW -1){branch_A_62[SW]}}, branch_A_62} ;
1126assign metric_B_62 = metric_61 + {{(M -SW -1){branch_B_62[SW]}}, branch_B_62} ;
1127assign metric_A_63 = metric_62 + {{(M -SW -1){branch_A_63[SW]}}, branch_A_63} ;
1128assign metric_B_63 = metric_63 + {{(M -SW -1){branch_B_63[SW]}}, branch_B_63} ;
1129
1130assign diff_0 = metric_A_0 - metric_B_0 ;
1131assign diff_1 = metric_A_1 - metric_B_1 ;
1132assign diff_2 = metric_A_2 - metric_B_2 ;
1133assign diff_3 = metric_A_3 - metric_B_3 ;
1134assign diff_4 = metric_A_4 - metric_B_4 ;
1135assign diff_5 = metric_A_5 - metric_B_5 ;
1136assign diff_6 = metric_A_6 - metric_B_6 ;
1137assign diff_7 = metric_A_7 - metric_B_7 ;
1138assign diff_8 = metric_A_8 - metric_B_8 ;
1139assign diff_9 = metric_A_9 - metric_B_9 ;
1140assign diff_10 = metric_A_10 - metric_B_10 ;
1141assign diff_11 = metric_A_11 - metric_B_11 ;
1142assign diff_12 = metric_A_12 - metric_B_12 ;
1143assign diff_13 = metric_A_13 - metric_B_13 ;
1144assign diff_14 = metric_A_14 - metric_B_14 ;
1145assign diff_15 = metric_A_15 - metric_B_15 ;
1146assign diff_16 = metric_A_16 - metric_B_16 ;
1147assign diff_17 = metric_A_17 - metric_B_17 ;
1148assign diff_18 = metric_A_18 - metric_B_18 ;
1149assign diff_19 = metric_A_19 - metric_B_19 ;
1150assign diff_20 = metric_A_20 - metric_B_20 ;
1151assign diff_21 = metric_A_21 - metric_B_21 ;
1152assign diff_22 = metric_A_22 - metric_B_22 ;
1153assign diff_23 = metric_A_23 - metric_B_23 ;
1154assign diff_24 = metric_A_24 - metric_B_24 ;
1155assign diff_25 = metric_A_25 - metric_B_25 ;
1156assign diff_26 = metric_A_26 - metric_B_26 ;
1157assign diff_27 = metric_A_27 - metric_B_27 ;
1158assign diff_28 = metric_A_28 - metric_B_28 ;
1159assign diff_29 = metric_A_29 - metric_B_29 ;
1160assign diff_30 = metric_A_30 - metric_B_30 ;
1161assign diff_31 = metric_A_31 - metric_B_31 ;
1162assign diff_32 = metric_A_32 - metric_B_32 ;
1163assign diff_33 = metric_A_33 - metric_B_33 ;
1164assign diff_34 = metric_A_34 - metric_B_34 ;
1165assign diff_35 = metric_A_35 - metric_B_35 ;
1166assign diff_36 = metric_A_36 - metric_B_36 ;
1167assign diff_37 = metric_A_37 - metric_B_37 ;
1168assign diff_38 = metric_A_38 - metric_B_38 ;
1169assign diff_39 = metric_A_39 - metric_B_39 ;
1170assign diff_40 = metric_A_40 - metric_B_40 ;
1171assign diff_41 = metric_A_41 - metric_B_41 ;
1172assign diff_42 = metric_A_42 - metric_B_42 ;
1173assign diff_43 = metric_A_43 - metric_B_43 ;
1174assign diff_44 = metric_A_44 - metric_B_44 ;
1175assign diff_45 = metric_A_45 - metric_B_45 ;
1176assign diff_46 = metric_A_46 - metric_B_46 ;
1177assign diff_47 = metric_A_47 - metric_B_47 ;
1178assign diff_48 = metric_A_48 - metric_B_48 ;
1179assign diff_49 = metric_A_49 - metric_B_49 ;
1180assign diff_50 = metric_A_50 - metric_B_50 ;
1181assign diff_51 = metric_A_51 - metric_B_51 ;
1182assign diff_52 = metric_A_52 - metric_B_52 ;
1183assign diff_53 = metric_A_53 - metric_B_53 ;
1184assign diff_54 = metric_A_54 - metric_B_54 ;
1185assign diff_55 = metric_A_55 - metric_B_55 ;
1186assign diff_56 = metric_A_56 - metric_B_56 ;
1187assign diff_57 = metric_A_57 - metric_B_57 ;
1188assign diff_58 = metric_A_58 - metric_B_58 ;
1189assign diff_59 = metric_A_59 - metric_B_59 ;
1190assign diff_60 = metric_A_60 - metric_B_60 ;
1191assign diff_61 = metric_A_61 - metric_B_61 ;
1192assign diff_62 = metric_A_62 - metric_B_62 ;
1193assign diff_63 = metric_A_63 - metric_B_63 ;
1194
1195assign metric_next_0 = diff_0 [M -1] ? metric_B_0 : metric_A_0 ;
1196assign metric_next_1 = diff_1 [M -1] ? metric_B_1 : metric_A_1 ;
1197assign metric_next_2 = diff_2 [M -1] ? metric_B_2 : metric_A_2 ;
1198assign metric_next_3 = diff_3 [M -1] ? metric_B_3 : metric_A_3 ;
1199assign metric_next_4 = diff_4 [M -1] ? metric_B_4 : metric_A_4 ;
1200assign metric_next_5 = diff_5 [M -1] ? metric_B_5 : metric_A_5 ;
1201assign metric_next_6 = diff_6 [M -1] ? metric_B_6 : metric_A_6 ;
1202assign metric_next_7 = diff_7 [M -1] ? metric_B_7 : metric_A_7 ;
1203assign metric_next_8 = diff_8 [M -1] ? metric_B_8 : metric_A_8 ;
1204assign metric_next_9 = diff_9 [M -1] ? metric_B_9 : metric_A_9 ;
1205assign metric_next_10 = diff_10 [M -1] ? metric_B_10 : metric_A_10 ;
1206assign metric_next_11 = diff_11 [M -1] ? metric_B_11 : metric_A_11 ;
1207assign metric_next_12 = diff_12 [M -1] ? metric_B_12 : metric_A_12 ;
1208assign metric_next_13 = diff_13 [M -1] ? metric_B_13 : metric_A_13 ;
1209assign metric_next_14 = diff_14 [M -1] ? metric_B_14 : metric_A_14 ;
1210assign metric_next_15 = diff_15 [M -1] ? metric_B_15 : metric_A_15 ;
1211assign metric_next_16 = diff_16 [M -1] ? metric_B_16 : metric_A_16 ;
1212assign metric_next_17 = diff_17 [M -1] ? metric_B_17 : metric_A_17 ;
1213assign metric_next_18 = diff_18 [M -1] ? metric_B_18 : metric_A_18 ;
1214assign metric_next_19 = diff_19 [M -1] ? metric_B_19 : metric_A_19 ;
1215assign metric_next_20 = diff_20 [M -1] ? metric_B_20 : metric_A_20 ;
1216assign metric_next_21 = diff_21 [M -1] ? metric_B_21 : metric_A_21 ;
1217assign metric_next_22 = diff_22 [M -1] ? metric_B_22 : metric_A_22 ;
1218assign metric_next_23 = diff_23 [M -1] ? metric_B_23 : metric_A_23 ;
1219assign metric_next_24 = diff_24 [M -1] ? metric_B_24 : metric_A_24 ;
1220assign metric_next_25 = diff_25 [M -1] ? metric_B_25 : metric_A_25 ;
1221assign metric_next_26 = diff_26 [M -1] ? metric_B_26 : metric_A_26 ;
1222assign metric_next_27 = diff_27 [M -1] ? metric_B_27 : metric_A_27 ;
1223assign metric_next_28 = diff_28 [M -1] ? metric_B_28 : metric_A_28 ;
1224assign metric_next_29 = diff_29 [M -1] ? metric_B_29 : metric_A_29 ;
1225assign metric_next_30 = diff_30 [M -1] ? metric_B_30 : metric_A_30 ;
1226assign metric_next_31 = diff_31 [M -1] ? metric_B_31 : metric_A_31 ;
1227assign metric_next_32 = diff_32 [M -1] ? metric_B_32 : metric_A_32 ;
1228assign metric_next_33 = diff_33 [M -1] ? metric_B_33 : metric_A_33 ;
1229assign metric_next_34 = diff_34 [M -1] ? metric_B_34 : metric_A_34 ;
1230assign metric_next_35 = diff_35 [M -1] ? metric_B_35 : metric_A_35 ;
1231assign metric_next_36 = diff_36 [M -1] ? metric_B_36 : metric_A_36 ;
1232assign metric_next_37 = diff_37 [M -1] ? metric_B_37 : metric_A_37 ;
1233assign metric_next_38 = diff_38 [M -1] ? metric_B_38 : metric_A_38 ;
1234assign metric_next_39 = diff_39 [M -1] ? metric_B_39 : metric_A_39 ;
1235assign metric_next_40 = diff_40 [M -1] ? metric_B_40 : metric_A_40 ;
1236assign metric_next_41 = diff_41 [M -1] ? metric_B_41 : metric_A_41 ;
1237assign metric_next_42 = diff_42 [M -1] ? metric_B_42 : metric_A_42 ;
1238assign metric_next_43 = diff_43 [M -1] ? metric_B_43 : metric_A_43 ;
1239assign metric_next_44 = diff_44 [M -1] ? metric_B_44 : metric_A_44 ;
1240assign metric_next_45 = diff_45 [M -1] ? metric_B_45 : metric_A_45 ;
1241assign metric_next_46 = diff_46 [M -1] ? metric_B_46 : metric_A_46 ;
1242assign metric_next_47 = diff_47 [M -1] ? metric_B_47 : metric_A_47 ;
1243assign metric_next_48 = diff_48 [M -1] ? metric_B_48 : metric_A_48 ;
1244assign metric_next_49 = diff_49 [M -1] ? metric_B_49 : metric_A_49 ;
1245assign metric_next_50 = diff_50 [M -1] ? metric_B_50 : metric_A_50 ;
1246assign metric_next_51 = diff_51 [M -1] ? metric_B_51 : metric_A_51 ;
1247assign metric_next_52 = diff_52 [M -1] ? metric_B_52 : metric_A_52 ;
1248assign metric_next_53 = diff_53 [M -1] ? metric_B_53 : metric_A_53 ;
1249assign metric_next_54 = diff_54 [M -1] ? metric_B_54 : metric_A_54 ;
1250assign metric_next_55 = diff_55 [M -1] ? metric_B_55 : metric_A_55 ;
1251assign metric_next_56 = diff_56 [M -1] ? metric_B_56 : metric_A_56 ;
1252assign metric_next_57 = diff_57 [M -1] ? metric_B_57 : metric_A_57 ;
1253assign metric_next_58 = diff_58 [M -1] ? metric_B_58 : metric_A_58 ;
1254assign metric_next_59 = diff_59 [M -1] ? metric_B_59 : metric_A_59 ;
1255assign metric_next_60 = diff_60 [M -1] ? metric_B_60 : metric_A_60 ;
1256assign metric_next_61 = diff_61 [M -1] ? metric_B_61 : metric_A_61 ;
1257assign metric_next_62 = diff_62 [M -1] ? metric_B_62 : metric_A_62 ;
1258assign metric_next_63 = diff_63 [M -1] ? metric_B_63 : metric_A_63 ;
1259
1260always @ (posedge clk)
1261  if (~nrst)
1262  begin
1263    metric_0  <= 10 ;
1264    metric_1  <= 0 ;
1265    metric_2  <= 0 ;
1266    metric_3  <= 0 ;
1267    metric_4  <= 0 ;
1268    metric_5  <= 0 ;
1269    metric_6  <= 0 ;
1270    metric_7  <= 0 ;
1271    metric_8  <= 0 ;
1272    metric_9  <= 0 ;
1273    metric_10 <= 0 ;
1274    metric_11 <= 0 ;
1275    metric_12 <= 0 ;
1276    metric_13 <= 0 ;
1277    metric_14 <= 0 ;
1278    metric_15 <= 0 ;
1279    metric_16 <= 0 ; 
1280    metric_17 <= 0 ; 
1281    metric_18 <= 0 ; 
1282    metric_19 <= 0 ; 
1283    metric_20 <= 0 ; 
1284    metric_21 <= 0 ; 
1285    metric_22 <= 0 ; 
1286    metric_23 <= 0 ; 
1287    metric_24 <= 0 ; 
1288    metric_25 <= 0 ; 
1289    metric_26 <= 0 ; 
1290    metric_27 <= 0 ; 
1291    metric_28 <= 0 ; 
1292    metric_29 <= 0 ; 
1293    metric_30 <= 0 ; 
1294    metric_31 <= 0 ; 
1295    metric_32 <= 0 ; 
1296    metric_33 <= 0 ; 
1297    metric_34 <= 0 ; 
1298    metric_35 <= 0 ; 
1299    metric_36 <= 0 ; 
1300    metric_37 <= 0 ; 
1301    metric_38 <= 0 ; 
1302    metric_39 <= 0 ; 
1303    metric_40 <= 0 ; 
1304    metric_41 <= 0 ; 
1305    metric_42 <= 0 ; 
1306    metric_43 <= 0 ; 
1307    metric_44 <= 0 ; 
1308    metric_45 <= 0 ; 
1309    metric_46 <= 0 ; 
1310    metric_47 <= 0 ; 
1311    metric_48 <= 0 ; 
1312    metric_49 <= 0 ; 
1313    metric_50 <= 0 ; 
1314    metric_51 <= 0 ; 
1315    metric_52 <= 0 ; 
1316    metric_53 <= 0 ; 
1317    metric_54 <= 0 ; 
1318    metric_55 <= 0 ; 
1319    metric_56 <= 0 ; 
1320    metric_57 <= 0 ; 
1321    metric_58 <= 0 ; 
1322    metric_59 <= 0 ; 
1323    metric_60 <= 0 ; 
1324    metric_61 <= 0 ; 
1325    metric_62 <= 0 ; 
1326    metric_63 <= 0 ; 
1327  end
1328  else if (packet_start)
1329  begin
1330    metric_0  <= 10 ;
1331    metric_1  <= 0 ;
1332    metric_2  <= 0 ;
1333    metric_3  <= 0 ;
1334    metric_4  <= 0 ;
1335    metric_5  <= 0 ;   
1336    metric_6  <= 0 ;
1337    metric_7  <= 0 ;
1338    metric_8  <= 0 ;
1339    metric_9  <= 0 ;
1340    metric_10 <= 0 ;
1341    metric_11 <= 0 ;   
1342    metric_12 <= 0 ;
1343    metric_13 <= 0 ;
1344    metric_14 <= 0 ;
1345    metric_15 <= 0 ;
1346    metric_16 <= 0 ; 
1347    metric_17 <= 0 ; 
1348    metric_18 <= 0 ; 
1349    metric_19 <= 0 ; 
1350    metric_20 <= 0 ; 
1351    metric_21 <= 0 ; 
1352    metric_22 <= 0 ; 
1353    metric_23 <= 0 ; 
1354    metric_24 <= 0 ; 
1355    metric_25 <= 0 ; 
1356    metric_26 <= 0 ; 
1357    metric_27 <= 0 ; 
1358    metric_28 <= 0 ; 
1359    metric_29 <= 0 ; 
1360    metric_30 <= 0 ; 
1361    metric_31 <= 0 ; 
1362    metric_32 <= 0 ; 
1363    metric_33 <= 0 ; 
1364    metric_34 <= 0 ; 
1365    metric_35 <= 0 ; 
1366    metric_36 <= 0 ; 
1367    metric_37 <= 0 ; 
1368    metric_38 <= 0 ; 
1369    metric_39 <= 0 ; 
1370    metric_40 <= 0 ; 
1371    metric_41 <= 0 ; 
1372    metric_42 <= 0 ; 
1373    metric_43 <= 0 ; 
1374    metric_44 <= 0 ; 
1375    metric_45 <= 0 ; 
1376    metric_46 <= 0 ; 
1377    metric_47 <= 0 ; 
1378    metric_48 <= 0 ; 
1379    metric_49 <= 0 ; 
1380    metric_50 <= 0 ; 
1381    metric_51 <= 0 ; 
1382    metric_52 <= 0 ; 
1383    metric_53 <= 0 ; 
1384    metric_54 <= 0 ; 
1385    metric_55 <= 0 ; 
1386    metric_56 <= 0 ; 
1387    metric_57 <= 0 ; 
1388    metric_58 <= 0 ; 
1389    metric_59 <= 0 ; 
1390    metric_60 <= 0 ; 
1391    metric_61 <= 0 ; 
1392    metric_62 <= 0 ; 
1393    metric_63 <= 0 ; 
1394  end
1395  else if (dv_in_gate)
1396  begin
1397    // update metric
1398    metric_0  <= metric_next_0 ;
1399    metric_1  <= metric_next_1 ;
1400    metric_2  <= metric_next_2 ;
1401    metric_3  <= metric_next_3 ;
1402    metric_4  <= metric_next_4 ;
1403    metric_5  <= metric_next_5 ;   
1404    metric_6  <= metric_next_6 ;
1405    metric_7  <= metric_next_7 ;
1406    metric_8  <= metric_next_8 ;
1407    metric_9  <= metric_next_9 ;
1408    metric_10 <= metric_next_10;
1409    metric_11 <= metric_next_11;   
1410    metric_12 <= metric_next_12;
1411    metric_13 <= metric_next_13;
1412    metric_14 <= metric_next_14;
1413    metric_15 <= metric_next_15;
1414    metric_16 <= metric_next_16 ;
1415    metric_17 <= metric_next_17;
1416    metric_18 <= metric_next_18;
1417    metric_19 <= metric_next_19;
1418    metric_20 <= metric_next_20;
1419    metric_21 <= metric_next_21;   
1420    metric_22 <= metric_next_22;
1421    metric_23 <= metric_next_23;
1422    metric_24 <= metric_next_24;
1423    metric_25 <= metric_next_25;
1424    metric_26 <= metric_next_26;
1425    metric_27 <= metric_next_27;   
1426    metric_28 <= metric_next_28;
1427    metric_29 <= metric_next_29;
1428    metric_30 <= metric_next_30;
1429    metric_31 <= metric_next_31;
1430    metric_32 <= metric_next_32 ;
1431    metric_33 <= metric_next_33;
1432    metric_34 <= metric_next_34;
1433    metric_35 <= metric_next_35;
1434    metric_36 <= metric_next_36;
1435    metric_37 <= metric_next_37;   
1436    metric_38 <= metric_next_38;
1437    metric_39 <= metric_next_39;
1438    metric_40 <= metric_next_40;
1439    metric_41 <= metric_next_41;
1440    metric_42 <= metric_next_42;
1441    metric_43 <= metric_next_43;   
1442    metric_44 <= metric_next_44;
1443    metric_45 <= metric_next_45;
1444    metric_46 <= metric_next_46;
1445    metric_47 <= metric_next_47;
1446    metric_48 <= metric_next_48 ;
1447    metric_49 <= metric_next_49;
1448    metric_50 <= metric_next_50;
1449    metric_51 <= metric_next_51;
1450    metric_52 <= metric_next_52;
1451    metric_53 <= metric_next_53;   
1452    metric_54 <= metric_next_54;
1453    metric_55 <= metric_next_55;
1454    metric_56 <= metric_next_56;
1455    metric_57 <= metric_next_57;
1456    metric_58 <= metric_next_58;
1457    metric_59 <= metric_next_59;   
1458    metric_60 <= metric_next_60;
1459    metric_61 <= metric_next_61;
1460    metric_62 <= metric_next_62;
1461    metric_63 <= metric_next_63;
1462  end
1463
1464always @ (posedge clk)
1465  if (~nrst)
1466    wptr <= 0 ;
1467  else if (packet_start)
1468    wptr <= 0 ;
1469  else if (dv_in_gate)
1470      wptr <= wptr + 1 ;
1471
1472always @ (posedge clk)
1473  if (~nrst)
1474    last_wptr <= 1'b0 ;
1475  else if (dv_in_gate)
1476    last_wptr <= wptr ;
1477 
1478always @ (posedge clk)
1479  if(dv_in_gate)
1480  begin
1481    // update transition
1482    tran_state_0  [wptr] <= diff_0  [M -1] ;
1483    tran_state_1  [wptr] <= diff_1  [M -1] ;
1484    tran_state_2  [wptr] <= diff_2  [M -1] ;
1485    tran_state_3  [wptr] <= diff_3  [M -1] ;
1486    tran_state_4  [wptr] <= diff_4  [M -1] ;
1487    tran_state_5  [wptr] <= diff_5  [M -1] ;
1488    tran_state_6  [wptr] <= diff_6  [M -1] ;
1489    tran_state_7  [wptr] <= diff_7  [M -1] ;
1490    tran_state_8  [wptr] <= diff_8  [M -1] ;
1491    tran_state_9  [wptr] <= diff_9  [M -1] ;
1492    tran_state_10 [wptr] <= diff_10 [M -1] ;
1493    tran_state_11 [wptr] <= diff_11 [M -1] ;
1494    tran_state_12 [wptr] <= diff_12 [M -1] ;
1495    tran_state_13 [wptr] <= diff_13 [M -1] ;
1496    tran_state_14 [wptr] <= diff_14 [M -1] ;
1497    tran_state_15 [wptr] <= diff_15 [M -1] ;
1498    tran_state_16 [wptr] <= diff_16 [M -1] ;
1499    tran_state_17 [wptr] <= diff_17 [M -1] ;
1500    tran_state_18 [wptr] <= diff_18 [M -1] ;
1501    tran_state_19 [wptr] <= diff_19 [M -1] ;
1502    tran_state_20 [wptr] <= diff_20 [M -1] ;
1503    tran_state_21 [wptr] <= diff_21 [M -1] ;
1504    tran_state_22 [wptr] <= diff_22 [M -1] ;
1505    tran_state_23 [wptr] <= diff_23 [M -1] ;
1506    tran_state_24 [wptr] <= diff_24 [M -1] ;
1507    tran_state_25 [wptr] <= diff_25 [M -1] ;
1508    tran_state_26 [wptr] <= diff_26 [M -1] ;
1509    tran_state_27 [wptr] <= diff_27 [M -1] ;
1510    tran_state_28 [wptr] <= diff_28 [M -1] ;
1511    tran_state_29 [wptr] <= diff_29 [M -1] ;
1512    tran_state_30 [wptr] <= diff_30 [M -1] ;
1513    tran_state_31 [wptr] <= diff_31 [M -1] ;
1514    tran_state_32 [wptr] <= diff_32 [M -1] ;
1515    tran_state_33 [wptr] <= diff_33 [M -1] ;
1516    tran_state_34 [wptr] <= diff_34 [M -1] ;
1517    tran_state_35 [wptr] <= diff_35 [M -1] ;
1518    tran_state_36 [wptr] <= diff_36 [M -1] ;
1519    tran_state_37 [wptr] <= diff_37 [M -1] ;
1520    tran_state_38 [wptr] <= diff_38 [M -1] ;
1521    tran_state_39 [wptr] <= diff_39 [M -1] ;
1522    tran_state_40 [wptr] <= diff_40 [M -1] ;
1523    tran_state_41 [wptr] <= diff_41 [M -1] ;
1524    tran_state_42 [wptr] <= diff_42 [M -1] ;
1525    tran_state_43 [wptr] <= diff_43 [M -1] ;
1526    tran_state_44 [wptr] <= diff_44 [M -1] ;
1527    tran_state_45 [wptr] <= diff_45 [M -1] ;
1528    tran_state_46 [wptr] <= diff_46 [M -1] ;
1529    tran_state_47 [wptr] <= diff_47 [M -1] ;
1530    tran_state_48 [wptr] <= diff_48 [M -1] ;
1531    tran_state_49 [wptr] <= diff_49 [M -1] ;
1532    tran_state_50 [wptr] <= diff_50 [M -1] ;
1533    tran_state_51 [wptr] <= diff_51 [M -1] ;
1534    tran_state_52 [wptr] <= diff_52 [M -1] ;
1535    tran_state_53 [wptr] <= diff_53 [M -1] ;
1536    tran_state_54 [wptr] <= diff_54 [M -1] ;
1537    tran_state_55 [wptr] <= diff_55 [M -1] ;
1538    tran_state_56 [wptr] <= diff_56 [M -1] ;
1539    tran_state_57 [wptr] <= diff_57 [M -1] ;
1540    tran_state_58 [wptr] <= diff_58 [M -1] ;
1541    tran_state_59 [wptr] <= diff_59 [M -1] ;
1542    tran_state_60 [wptr] <= diff_60 [M -1] ;
1543    tran_state_61 [wptr] <= diff_61 [M -1] ;
1544    tran_state_62 [wptr] <= diff_62 [M -1] ;
1545    tran_state_63 [wptr] <= diff_63 [M -1] ;
1546  end
1547 
1548    reg early_trace1_d0, early_trace2_d0;
1549    wire early_trace1_pos, early_trace2_pos;
1550
1551    always @ (posedge clk)
1552    begin
1553        early_trace1_d0 <= early_trace1;
1554        early_trace2_d0 <= early_trace2;
1555    end
1556
1557    assign early_trace1_pos = (early_trace1 & ~early_trace1_d0);
1558    assign early_trace2_pos = (early_trace2 & ~early_trace2_d0);
1559
1560always @ (posedge clk)
1561  if (~nrst)
1562  begin
1563    early_trace1_en <= 1'b0;
1564    early_trace2_en <= 1'b0;
1565    trace <= 1'b0 ;
1566    cnt <= 0 ;
1567    trace_start_wptr <= 0 ;
1568  end
1569  else if (packet_start)
1570  begin
1571    early_trace1_en <= 1'b0;
1572    early_trace2_en <= 1'b0;
1573    trace <= 1'b0 ;
1574    cnt <= 0 ;
1575  end
1576  else if (dv_in_gate)
1577  begin
1578    if (cnt == L-1)
1579    begin
1580      early_trace1_en <= 1'b0;
1581      early_trace2_en <= 1'b0;
1582      trace <= 1'b1 ;
1583      trace_start_wptr <= wptr ;
1584      cnt <= C ;
1585    end
1586    else if (early_trace1_pos)
1587    begin
1588      early_trace1_en <= 1'b1;
1589      early_trace2_en <= 1'b0;
1590      trace <= 1'b1 ;
1591      trace_start_wptr <= wptr ;
1592      cnt <= C_EARLY1 ;
1593    end
1594    else if (early_trace2_pos)
1595    begin
1596      early_trace1_en <= 1'b0;
1597      early_trace2_en <= 1'b1;
1598      trace <= 1'b1 ;
1599      trace_start_wptr <= wptr ;
1600      cnt <= C_EARLY2 ;
1601    end
1602    else
1603    begin
1604      early_trace1_en <= 1'b0;
1605      early_trace2_en <= 1'b0;
1606      trace <= 1'b0 ;
1607      cnt <= cnt + 1 ;
1608    end
1609  end
1610  else if (trace2)
1611    trace_start_wptr <= last_wptr ;
1612  else
1613    trace <= 1'b0 ;
1614
1615always @ (posedge clk)
1616  if (~nrst)
1617  begin
1618    flush_en <= 1'b0 ;
1619    flush_cnt <= 0 ;
1620  end
1621  else if (packet_end)
1622  begin
1623    flush_en <= 1 ;
1624    flush_cnt <= 0 ;
1625  end
1626  else if (flush_en)
1627  begin
1628    if (flush_cnt == 63)
1629      flush_en <= 1'b0 ;
1630    else
1631      flush_cnt <= flush_cnt + 1 ; 
1632  end
1633
1634assign flush = flush_cnt == 60 ;
1635
1636always @ (posedge clk)
1637  if (~nrst)
1638    done_i <= 1'b0 ;
1639  else if (packet_start)
1640    done_i <= 1'b0 ;
1641  //else if (packet_end && cnt == L-1)
1642  else if (trace2 & last_cnt_next[LW-1])
1643    done_i <= 1'b1 ;
1644  else if (last_trace_d3)
1645    done_i <= 1'b1 ;
1646
1647
1648always @ (posedge clk)
1649  if (~nrst)
1650    last_trace <= 1'b0 ;
1651  else if (packet_start)
1652    last_trace <= 1'b0 ;
1653  else if (flush && trace_done && cnt !=L-1 )
1654    last_trace <= 1'b1 ;
1655
1656always @ (posedge clk)
1657  last_trace_s0 <= last_trace ;
1658
1659assign trace2 = ~last_trace_s0 & last_trace ;
1660assign trace_pos_i = trace | trace2 ;
1661
1662always @ (posedge clk)
1663  if (~nrst)
1664  begin
1665    trace2_s1 <= 1'b0 ;
1666    trace2_s2 <= 1'b0 ;
1667  end
1668  else
1669  begin
1670    trace2_s1 <= trace2 ;
1671    trace2_s2 <= trace2_s1 ;
1672  end
1673
1674
1675always @ (posedge clk)
1676begin
1677  trace_pos_s0 <= trace_pos_i ;
1678  trace_pos <= trace_pos_s0 ;
1679end
1680
1681always @ (posedge clk)
1682  if(~nrst)
1683    last_trace_num <= 0 ;
1684  else
1685  begin
1686    if (packet_start)
1687      last_trace_num <= 0 ;
1688    else if (trace2)
1689      last_trace_num <= L -cnt  ;
1690    else if (last_trace_d0)
1691      last_trace_num <= last_trace_num + R ;
1692  end
1693
1694always @ (posedge clk)
1695begin
1696  last_trace_d0 <= last_trace & trace_done_pos ;
1697  last_trace_d1 <= last_trace_d0 ;
1698  last_trace_d2 <= last_trace_d1 ;
1699  last_trace_d3 <= last_trace_d2 ;
1700  last_trace_d4 <= last_trace_d3 ;
1701  last_trace_d5 <= last_trace_d4 ;
1702end
1703
1704assign last_cnt_next = last_cnt - R ;
1705
1706always @ (posedge clk)
1707  if(~nrst)
1708  begin
1709    one_more_out <= 1'b0 ;
1710    last_cnt <= 0 ;
1711  end
1712  else
1713  begin
1714    if (packet_start)
1715    begin
1716      one_more_out <= 1'b0 ;
1717      last_cnt <= 0 ;
1718    end
1719    else if (flush)
1720      last_cnt <= cnt ;
1721    else if (last_trace_d5)
1722    begin
1723      if (~last_cnt_next[LW-1])
1724      begin
1725        last_cnt <= last_cnt_next ;
1726        one_more_out <= 1'b1 ;
1727      end
1728    end
1729    else
1730      one_more_out <= 1'b0 ;
1731  end
1732
1733always @ (posedge clk)
1734  if (~nrst)
1735    trace_en <= 0 ;
1736  else if (packet_start)
1737    trace_en <= 0 ;
1738  else if (trace_pos)
1739    trace_en <= 1'b1 ;
1740  else if ((trace_cnt == L-2) & (early_trace1_en == 0) & (early_trace2_en == 0))
1741    trace_en <= 1'b0 ;
1742  else if ((trace_cnt == L_EARLY1-2) & (early_trace1_en == 1))
1743    trace_en <= 1'b0 ;
1744  else if ((trace_cnt == L_EARLY2-2) & (early_trace2_en == 1))
1745    trace_en <= 1'b0 ;
1746   
1747always @ (posedge clk)
1748  if (~nrst)
1749    trace_cnt <= 0 ;
1750  else if (trace_pos)
1751    trace_cnt <= 0 ;
1752  else if (trace_en)
1753    trace_cnt <= trace_cnt + 2; 
1754   
1755//assign trace_done = (trace_cnt == L);
1756assign trace_done = early_trace1_en ? (trace_cnt == L_EARLY1) : (early_trace2_en ? (trace_cnt == L_EARLY2) : (trace_cnt == L));
1757
1758always @ (posedge clk)
1759  trace_done_s0 <= trace_done ;
1760assign trace_done_pos = ~trace_done_s0 & trace_done ;
1761
1762//==============================
1763// Get max metric
1764//==============================
1765max_metric #(M, K) max_metric_0 (
1766        .clk    (clk        ),
1767        .a      (metric_0   ), 
1768        .b      (metric_1   ), 
1769        .c      (metric_2   ), 
1770        .d      (metric_3   ), 
1771        .sa     (6'd0       ), 
1772        .sb     (6'd1       ), 
1773        .sc     (6'd2       ), 
1774        .sd     (6'd3       ), 
1775        .state  (state_0    ), 
1776        .max    (max_0      )
1777        ) ;
1778       
1779//==============================
1780// Get max metric
1781//==============================
1782max_metric #(M, K) max_metric_1 (
1783        .clk    (clk        ),
1784        .a      (metric_4   ), 
1785        .b      (metric_5   ), 
1786        .c      (metric_6   ), 
1787        .d      (metric_7   ), 
1788        .sa     (6'd4       ), 
1789        .sb     (6'd5       ), 
1790        .sc     (6'd6       ), 
1791        .sd     (6'd7       ), 
1792        .state  (state_1    ), 
1793        .max    (max_1      )
1794        ) ;
1795
1796//==============================
1797// Get max metric
1798//==============================       
1799max_metric #(M, K) max_metric_2 (
1800        .clk    (clk        ),
1801        .a      (metric_8   ), 
1802        .b      (metric_9   ), 
1803        .c      (metric_10  ), 
1804        .d      (metric_11  ), 
1805        .sa     (6'd8       ), 
1806        .sb     (6'd9       ), 
1807        .sc     (6'd10      ), 
1808        .sd     (6'd11      ), 
1809        .state  (state_2    ), 
1810        .max    (max_2      )
1811        ) ;   
1812
1813//==============================
1814// Get max metric
1815//==============================
1816max_metric #(M, K) max_metric_3 (
1817        .clk    (clk        ),
1818        .a      (metric_12  ), 
1819        .b      (metric_13  ), 
1820        .c      (metric_14  ), 
1821        .d      (metric_15  ), 
1822        .sa     (6'd12      ), 
1823        .sb     (6'd13      ), 
1824        .sc     (6'd14      ), 
1825        .sd     (6'd15      ), 
1826        .state  (state_3    ), 
1827        .max    (max_3      )
1828        ) ;
1829
1830//==============================
1831// Get max metric
1832//==============================
1833max_metric #(M, K) max_metric_4 (
1834        .clk    (clk        ),
1835        .a      (metric_16  ), 
1836        .b      (metric_17  ), 
1837        .c      (metric_18  ), 
1838        .d      (metric_19  ), 
1839        .sa     (6'd16      ), 
1840        .sb     (6'd17      ), 
1841        .sc     (6'd18      ), 
1842        .sd     (6'd19      ), 
1843        .state  (state_4    ), 
1844        .max    (max_4      )
1845        ) ;
1846
1847//==============================
1848// Get max metric
1849//==============================
1850max_metric #(M, K) max_metric_5 (
1851        .clk    (clk        ),
1852        .a      (metric_20  ), 
1853        .b      (metric_21  ), 
1854        .c      (metric_22  ), 
1855        .d      (metric_23  ), 
1856        .sa     (6'd20      ), 
1857        .sb     (6'd21      ), 
1858        .sc     (6'd22      ), 
1859        .sd     (6'd23      ), 
1860        .state  (state_5    ), 
1861        .max    (max_5      )
1862        ) ;
1863
1864//==============================
1865// Get max metric
1866//==============================       
1867max_metric #(M, K) max_metric_6 (
1868        .clk    (clk        ),
1869        .a      (metric_24  ), 
1870        .b      (metric_25  ), 
1871        .c      (metric_26  ), 
1872        .d      (metric_27  ), 
1873        .sa     (6'd24      ), 
1874        .sb     (6'd25      ), 
1875        .sc     (6'd26      ), 
1876        .sd     (6'd27      ), 
1877        .state  (state_6    ), 
1878        .max    (max_6      )
1879        ) ;
1880
1881//==============================
1882// Get max metric
1883//==============================       
1884max_metric #(M, K) max_metric_7 (
1885        .clk    (clk        ),
1886        .a      (metric_28  ), 
1887        .b      (metric_29  ), 
1888        .c      (metric_30  ), 
1889        .d      (metric_31  ), 
1890        .sa     (6'd28      ), 
1891        .sb     (6'd29      ), 
1892        .sc     (6'd30      ), 
1893        .sd     (6'd31      ), 
1894        .state  (state_7    ), 
1895        .max    (max_7      )
1896        ) ;
1897
1898//==============================
1899// Get max metric
1900//==============================       
1901max_metric #(M, K) max_metric_8 (
1902        .clk    (clk        ),
1903        .a      (metric_32  ), 
1904        .b      (metric_33  ), 
1905        .c      (metric_34  ), 
1906        .d      (metric_35  ), 
1907        .sa     (6'd32      ), 
1908        .sb     (6'd33      ), 
1909        .sc     (6'd34      ), 
1910        .sd     (6'd35      ), 
1911        .state  (state_8    ), 
1912        .max    (max_8      )
1913        ) ;
1914
1915//==============================
1916// Get max metric
1917//==============================       
1918max_metric #(M, K) max_metric_9 (
1919        .clk    (clk        ),
1920        .a      (metric_36  ), 
1921        .b      (metric_37  ), 
1922        .c      (metric_38  ), 
1923        .d      (metric_39  ), 
1924        .sa     (6'd36      ), 
1925        .sb     (6'd37      ), 
1926        .sc     (6'd38      ), 
1927        .sd     (6'd39      ), 
1928        .state  (state_9    ), 
1929        .max    (max_9      )
1930        ) ;
1931
1932//==============================
1933// Get max metric
1934//==============================       
1935max_metric #(M, K) max_metric_10 (
1936        .clk    (clk        ),
1937        .a      (metric_40  ), 
1938        .b      (metric_41  ), 
1939        .c      (metric_42  ), 
1940        .d      (metric_43  ), 
1941        .sa     (6'd40      ), 
1942        .sb     (6'd41      ), 
1943        .sc     (6'd42      ), 
1944        .sd     (6'd43      ), 
1945        .state  (state_10   ), 
1946        .max    (max_10     )
1947        ) ;
1948
1949//==============================
1950// Get max metric
1951//==============================       
1952max_metric #(M, K) max_metric_11 (
1953        .clk    (clk        ),
1954        .a      (metric_44  ), 
1955        .b      (metric_45  ), 
1956        .c      (metric_46  ), 
1957        .d      (metric_47  ), 
1958        .sa     (6'd44      ), 
1959        .sb     (6'd45      ), 
1960        .sc     (6'd46      ), 
1961        .sd     (6'd47      ), 
1962        .state  (state_11   ), 
1963        .max    (max_11     )
1964        ) ;
1965
1966//==============================
1967// Get max metric
1968//==============================
1969max_metric #(M, K) max_metric_12 (
1970        .clk    (clk        ),
1971        .a      (metric_48  ), 
1972        .b      (metric_49  ), 
1973        .c      (metric_50  ), 
1974        .d      (metric_51  ), 
1975        .sa     (6'd48      ), 
1976        .sb     (6'd49      ), 
1977        .sc     (6'd50      ), 
1978        .sd     (6'd51      ), 
1979        .state  (state_12   ), 
1980        .max    (max_12     )
1981        ) ;
1982
1983//==============================
1984// Get max metric
1985//==============================       
1986max_metric #(M, K) max_metric_13 (
1987        .clk    (clk        ),
1988        .a      (metric_52  ), 
1989        .b      (metric_53  ), 
1990        .c      (metric_54  ), 
1991        .d      (metric_55  ), 
1992        .sa     (6'd52      ), 
1993        .sb     (6'd53      ), 
1994        .sc     (6'd54      ), 
1995        .sd     (6'd55      ), 
1996        .state  (state_13   ), 
1997        .max    (max_13     )
1998        ) ;
1999
2000//==============================
2001// Get max metric
2002//==============================       
2003max_metric #(M, K) max_metric_14 (
2004        .clk    (clk        ),
2005        .a      (metric_56  ), 
2006        .b      (metric_57  ), 
2007        .c      (metric_58  ), 
2008        .d      (metric_59  ), 
2009        .sa     (6'd56      ), 
2010        .sb     (6'd57      ), 
2011        .sc     (6'd58      ), 
2012        .sd     (6'd59      ), 
2013        .state  (state_14   ), 
2014        .max    (max_14     )
2015        ) ;       
2016
2017//==============================
2018// Get max metric
2019//==============================
2020max_metric #(M, K) max_metric_15 (
2021        .clk    (clk        ),
2022        .a      (metric_60  ), 
2023        .b      (metric_61  ), 
2024        .c      (metric_62  ), 
2025        .d      (metric_63  ), 
2026        .sa     (6'd60      ), 
2027        .sb     (6'd61      ), 
2028        .sc     (6'd62      ), 
2029        .sd     (6'd63      ), 
2030        .state  (state_15    ), 
2031        .max    (max_15      )
2032        ) ;
2033       
2034//==============================
2035// Get max metric
2036//==============================
2037max_metric #(M, K) max_metric_s1_0 (
2038        .clk    (clk        ),
2039        .a      (max_0      ), 
2040        .b      (max_1      ), 
2041        .c      (max_2      ), 
2042        .d      (max_3      ), 
2043        .sa     (state_0    ), 
2044        .sb     (state_1    ), 
2045        .sc     (state_2    ), 
2046        .sd     (state_3    ), 
2047        .state  (state_s1_0 ), 
2048        .max    (max_s1_0   )
2049        ) ;
2050
2051//==============================
2052// Get max metric
2053//==============================       
2054max_metric #(M, K) max_metric_s1_1 (
2055        .clk    (clk        ),
2056        .a      (max_4      ), 
2057        .b      (max_5      ), 
2058        .c      (max_6      ), 
2059        .d      (max_7      ), 
2060        .sa     (state_4    ), 
2061        .sb     (state_5    ), 
2062        .sc     (state_6    ), 
2063        .sd     (state_7    ), 
2064        .state  (state_s1_1 ), 
2065        .max    (max_s1_1   )
2066        ) ;
2067
2068//==============================
2069// Get max metric
2070//==============================
2071max_metric #(M, K) max_metric_s1_2 (
2072        .clk    (clk        ),
2073        .a      (max_8      ), 
2074        .b      (max_9      ), 
2075        .c      (max_10     ), 
2076        .d      (max_11     ), 
2077        .sa     (state_8    ), 
2078        .sb     (state_9    ), 
2079        .sc     (state_10   ), 
2080        .sd     (state_11   ), 
2081        .state  (state_s1_2 ), 
2082        .max    (max_s1_2   )
2083        ) ;
2084
2085//==============================
2086// Get max metric
2087//==============================       
2088max_metric #(M, K) max_metric_s1_3 (
2089        .clk    (clk        ),
2090        .a      (max_12     ), 
2091        .b      (max_13     ), 
2092        .c      (max_14     ), 
2093        .d      (max_15     ), 
2094        .sa     (state_12   ), 
2095        .sb     (state_13   ), 
2096        .sc     (state_14   ), 
2097        .sd     (state_15   ), 
2098        .state  (state_s1_3 ), 
2099        .max    (max_s1_3   )
2100        ) ;
2101
2102//==============================
2103// Get max metric
2104//==============================
2105max_metric_logic #(M, K) max_metric_s2_0 (
2106        .a      (max_s1_0    ), 
2107        .b      (max_s1_1    ), 
2108        .c      (max_s1_2    ), 
2109        .d      (max_s1_3    ), 
2110        .sa     (state_s1_0  ), 
2111        .sb     (state_s1_1  ), 
2112        .sc     (state_s1_2  ), 
2113        .sd     (state_s1_3  ), 
2114        .state  (state_s2_0  ), 
2115        .max    (            )
2116        ) ;
2117
2118assign init_state_i = state_s2_0 ;
2119
2120always @ (posedge clk)
2121  if(~nrst)
2122    trace_state <= 0 ;
2123  else
2124  begin
2125    if (trace_pos)
2126    begin
2127      if(zero_tail & trace2_s2)
2128        trace_state <= 0 ;
2129      else
2130        trace_state <= init_state_i ;
2131    end
2132    else if (trace_en)
2133      trace_state <= next_state ;
2134  end
2135
2136// POM: pipeline reg on trace_start_wptr, breaks 7-level critical path
2137reg [TRW -1:0] trace_start_wptr_d;
2138always @(posedge clk)
2139begin
2140    trace_start_wptr_d <= trace_start_wptr;
2141end
2142
2143
2144//assign  trace_start_pos = trace_start_wptr ;
2145assign  trace_start_pos = trace_start_wptr_d ;
2146
2147assign trace_start_pos0 = trace_start_pos - trace_cnt ;
2148assign trace_start_pos1 = trace_start_pos - trace_cnt -1 ;
2149
2150assign cur_state0 = trace_state ;
2151
2152assign tran_all_0 = {
2153                     tran_state_63[trace_start_pos0], tran_state_62[trace_start_pos0], tran_state_61[trace_start_pos0], tran_state_60[trace_start_pos0], 
2154                     tran_state_59[trace_start_pos0], tran_state_58[trace_start_pos0], tran_state_57[trace_start_pos0], tran_state_56[trace_start_pos0], 
2155                     tran_state_55[trace_start_pos0], tran_state_54[trace_start_pos0], tran_state_53[trace_start_pos0], tran_state_52[trace_start_pos0], 
2156                     tran_state_51[trace_start_pos0], tran_state_50[trace_start_pos0], tran_state_49[trace_start_pos0], tran_state_48[trace_start_pos0],
2157                     
2158                     tran_state_47[trace_start_pos0], tran_state_46[trace_start_pos0], tran_state_45[trace_start_pos0], tran_state_44[trace_start_pos0], 
2159                     tran_state_43[trace_start_pos0], tran_state_42[trace_start_pos0], tran_state_41[trace_start_pos0], tran_state_40[trace_start_pos0], 
2160                     tran_state_39[trace_start_pos0], tran_state_38[trace_start_pos0], tran_state_37[trace_start_pos0], tran_state_36[trace_start_pos0], 
2161                     tran_state_35[trace_start_pos0], tran_state_34[trace_start_pos0], tran_state_33[trace_start_pos0], tran_state_32[trace_start_pos0],
2162                     
2163                     tran_state_31[trace_start_pos0], tran_state_30[trace_start_pos0], tran_state_29[trace_start_pos0], tran_state_28[trace_start_pos0], 
2164                     tran_state_27[trace_start_pos0], tran_state_26[trace_start_pos0], tran_state_25[trace_start_pos0], tran_state_24[trace_start_pos0], 
2165                     tran_state_23[trace_start_pos0], tran_state_22[trace_start_pos0], tran_state_21[trace_start_pos0], tran_state_20[trace_start_pos0], 
2166                     tran_state_19[trace_start_pos0], tran_state_18[trace_start_pos0], tran_state_17[trace_start_pos0], tran_state_16[trace_start_pos0],
2167
2168                     tran_state_15[trace_start_pos0], tran_state_14[trace_start_pos0], tran_state_13[trace_start_pos0], tran_state_12[trace_start_pos0], 
2169                     tran_state_11[trace_start_pos0], tran_state_10[trace_start_pos0], tran_state_9[trace_start_pos0], tran_state_8[trace_start_pos0], 
2170                     tran_state_7[trace_start_pos0], tran_state_6[trace_start_pos0], tran_state_5[trace_start_pos0], tran_state_4[trace_start_pos0], 
2171                     tran_state_3[trace_start_pos0], tran_state_2[trace_start_pos0], tran_state_1[trace_start_pos0], tran_state_0[trace_start_pos0]} ;
2172
2173assign tran_all_1 =  {
2174                     tran_state_63[trace_start_pos1], tran_state_62[trace_start_pos1], tran_state_61[trace_start_pos1], tran_state_60[trace_start_pos1], 
2175                     tran_state_59[trace_start_pos1], tran_state_58[trace_start_pos1], tran_state_57[trace_start_pos1], tran_state_56[trace_start_pos1], 
2176                     tran_state_55[trace_start_pos1], tran_state_54[trace_start_pos1], tran_state_53[trace_start_pos1], tran_state_52[trace_start_pos1], 
2177                     tran_state_51[trace_start_pos1], tran_state_50[trace_start_pos1], tran_state_49[trace_start_pos1], tran_state_48[trace_start_pos1],
2178                     
2179                     tran_state_47[trace_start_pos1], tran_state_46[trace_start_pos1], tran_state_45[trace_start_pos1], tran_state_44[trace_start_pos1], 
2180                     tran_state_43[trace_start_pos1], tran_state_42[trace_start_pos1], tran_state_41[trace_start_pos1], tran_state_40[trace_start_pos1], 
2181                     tran_state_39[trace_start_pos1], tran_state_38[trace_start_pos1], tran_state_37[trace_start_pos1], tran_state_36[trace_start_pos1], 
2182                     tran_state_35[trace_start_pos1], tran_state_34[trace_start_pos1], tran_state_33[trace_start_pos1], tran_state_32[trace_start_pos1],
2183                     
2184                     tran_state_31[trace_start_pos1], tran_state_30[trace_start_pos1], tran_state_29[trace_start_pos1], tran_state_28[trace_start_pos1], 
2185                     tran_state_27[trace_start_pos1], tran_state_26[trace_start_pos1], tran_state_25[trace_start_pos1], tran_state_24[trace_start_pos1], 
2186                     tran_state_23[trace_start_pos1], tran_state_22[trace_start_pos1], tran_state_21[trace_start_pos1], tran_state_20[trace_start_pos1], 
2187                     tran_state_19[trace_start_pos1], tran_state_18[trace_start_pos1], tran_state_17[trace_start_pos1], tran_state_16[trace_start_pos1],
2188
2189                     tran_state_15[trace_start_pos1], tran_state_14[trace_start_pos1], tran_state_13[trace_start_pos1], tran_state_12[trace_start_pos1], 
2190                     tran_state_11[trace_start_pos1], tran_state_10[trace_start_pos1], tran_state_9[trace_start_pos1], tran_state_8[trace_start_pos1], 
2191                     tran_state_7[trace_start_pos1], tran_state_6[trace_start_pos1], tran_state_5[trace_start_pos1], tran_state_4[trace_start_pos1], 
2192                     tran_state_3[trace_start_pos1], tran_state_2[trace_start_pos1], tran_state_1[trace_start_pos1], tran_state_0[trace_start_pos1]} ;
2193
2194
2195assign cur_state1 = get_next_trace_state (cur_state0, tran_all_0) ;
2196assign next_state = get_next_trace_state (cur_state1, tran_all_1) ;
2197
2198assign state0_bit = cur_state0 [K -2] ;
2199assign state1_bit = cur_state1 [K -2] ;
2200
2201always @ (posedge clk)
2202  if(~nrst)
2203    res <= 0 ;
2204  else
2205  begin
2206    if (trace_pos)
2207      res <= 0 ;
2208    else if (trace_en)
2209    begin
2210      res <= {state1_bit, state0_bit, res [L-1:2]} ;
2211    end
2212  end
2213
2214//======================================
2215// function: get_next_trace_state
2216//======================================
2217function [K-2:0] get_next_trace_state ;
2218input   [K-2:0]     cur_state_in ;
2219input   [N -1:0]    tran_state_in ;
2220reg     [N -1:0]    tmp ;
2221begin
2222  tmp = tran_state_in >> cur_state_in ;
2223  get_next_trace_state = {cur_state_in [K-3:0], tmp[0]} ;
2224end
2225endfunction
2226
2227endmodule
2228
2229
2230//**************************************************************
2231// File:    max_metric_logic.v
2232// Author:  Yang Sun (ysun@rice.edu)
2233// Birth:   $ 1/14/07
2234// Des:     The top level of viterbi decoder
2235//          Take 5 bit soft value is [-16 : +15]
2236//          K = 7. g0 = 133, g1 = 171
2237// History: $ 1/14/07, Init coding
2238//          $ 1/22/07, K = 5, Zero latency
2239//          $ 12/1/07: Updated
2240//**************************************************************
2241module max_metric_logic (
2242    a       ,   // I, metric a
2243    b       ,   // I, metric b
2244    c       ,   // I, metric c
2245    d       ,   // I, metric d
2246    sa      ,   // I, state a
2247    sb      ,   // I, state b
2248    sc      ,   // I, state c
2249    sd      ,   // I, state d
2250    state   ,   // O, state
2251    max         // O, max metric
2252    ) ;
2253   
2254parameter   M = 7 ;
2255parameter   K = 7 ;
2256
2257input   [M -1:0]    a ;
2258input   [M -1:0]    b ;
2259input   [M -1:0]    c ;
2260input   [M -1:0]    d ;
2261
2262input   [K -2:0]    sa ;
2263input   [K -2:0]    sb ;
2264input   [K -2:0]    sc ;
2265input   [K -2:0]    sd ;
2266
2267output  [K -2:0]    state ;
2268output  [M -1:0]    max ;
2269
2270//==================================
2271//Internal signal
2272//==================================
2273
2274reg     [K -2:0]    pos0 ;
2275reg     [K -2:0]    pos1 ;
2276reg     [M -1:0]    max0 ;
2277reg     [M -1:0]    max1 ;
2278reg     [M -1:0]    tmp ;
2279reg     [K -2:0]    state_i ;
2280reg     [M -1:0]    max_i ;
2281
2282//==================================
2283// Main body of code
2284//==================================
2285assign state = state_i ;
2286assign max = max_i ;
2287
2288always @*
2289begin 
2290  tmp = a-b ;
2291  if(~tmp[M -1])
2292  begin
2293    max0 = a ;
2294    pos0 = sa ;
2295  end
2296  else
2297  begin
2298    max0 = b ;
2299    pos0 = sb ;
2300  end
2301
2302  tmp = c-d ;
2303  if(~tmp[M-1])
2304  begin
2305    max1 = c ;
2306    pos1 = sc ;
2307  end
2308  else
2309  begin
2310    max1 = d ;
2311    pos1 = sd ;
2312  end
2313
2314  tmp = max0 - max1 ;
2315  if (~tmp[M-1])
2316  begin
2317    max_i = max0 ;
2318    state_i = pos0 ;
2319  end
2320  else
2321  begin
2322    state_i = pos1 ;
2323    max_i = max1 ;
2324  end
2325end
2326
2327endmodule
2328
2329//**************************************************************
2330// File:    max_metric
2331// Author:  Yang Sun (ysun@rice.edu)
2332// Birth:   $ 1/14/07
2333// Des:     Find max metric
2334//          K = 7. g0 = 133, g1 = 171
2335// History: $ 1/14/07, Init coding
2336//          $ 1/22/07, K = 5
2337//          $ 2/23/07, 1 pipeline
2338//          $ 12/1/07: updated
2339//**************************************************************
2340module max_metric (
2341    clk     ,   // I, clock
2342    a       ,   // I, metric a
2343    b       ,   // I, metric b
2344    c       ,   // I, metric c
2345    d       ,   // I, metric d
2346    sa      ,   // I, state a
2347    sb      ,   // I, state b
2348    sc      ,   // I, state c
2349    sd      ,   // I, state d
2350    state   ,   // O, state
2351    max         // O, max metric
2352    ) ;
2353
2354parameter   M = 7 ;
2355parameter   K = 7 ;
2356
2357input               clk ;
2358input   [M -1:0]    a ;
2359input   [M -1:0]    b ;
2360input   [M -1:0]    c ;
2361input   [M -1:0]    d ;
2362
2363input   [K -2:0]    sa ;
2364input   [K -2:0]    sb ;
2365input   [K -2:0]    sc ;
2366input   [K -2:0]    sd ;
2367
2368output  [K -2:0]    state ;
2369output  [M -1:0]    max ;
2370
2371//=====================================
2372//Internal signal
2373//=====================================
2374reg     [K -2:0]    pos0 ;
2375reg     [K -2:0]    pos1 ;
2376reg     [M -1:0]    max0 ;
2377reg     [M -1:0]    max1 ;
2378reg     [M -1:0]    tmp ;
2379reg     [K -2:0]    state_i ;
2380reg     [M -1:0]    max_i ;
2381reg     [K -2:0]    state_reg ;
2382reg     [M -1:0]    max_reg ;
2383
2384//=====================================
2385// Main RTL code
2386//=====================================
2387assign state = state_reg ;
2388assign max = max_reg ;
2389
2390always @ (posedge clk)
2391begin
2392  state_reg <= state_i ;
2393  max_reg <= max_i ;
2394end
2395
2396always @*
2397begin 
2398  tmp = a-b ;
2399  if(~tmp[M -1])
2400  begin
2401    max0 = a ;
2402    pos0 = sa ;
2403  end
2404  else
2405  begin
2406    max0 = b ;
2407    pos0 = sb ;
2408  end
2409
2410  tmp = c-d ;
2411  if(~tmp[M-1])
2412  begin
2413    max1 = c ;
2414    pos1 = sc ;
2415  end
2416  else
2417  begin
2418    max1 = d ;
2419    pos1 = sd ;
2420  end
2421
2422  tmp = max0 - max1 ;
2423  if (~tmp[M-1])
2424  begin
2425    max_i = max0 ;
2426    state_i = pos0 ;
2427  end
2428  else
2429  begin
2430    state_i = pos1 ;
2431    max_i = max1 ;
2432  end
2433end
2434
2435endmodule
Note: See TracBrowser for help on using the repository browser.