OpenCores
URL https://opencores.org/ocsvn/bluespec-h264/bluespec-h264/trunk

Subversion Repositories bluespec-h264

[/] [bluespec-h264/] [trunk/] [release/] [mkEntropyDec.bsv] - Blame information for rev 100

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 85 jamey.hick
// The MIT License
2
 
3
// Copyright (c) 2006-2007 Massachusetts Institute of Technology
4
 
5
// Permission is hereby granted, free of charge, to any person obtaining a copy
6
// of this software and associated documentation files (the "Software"), to deal
7
// in the Software without restriction, including without limitation the rights
8
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
// copies of the Software, and to permit persons to whom the Software is
10
// furnished to do so, subject to the following conditions:
11
 
12
// The above copyright notice and this permission notice shall be included in
13
// all copies or substantial portions of the Software.
14
 
15
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
// THE SOFTWARE.
22 84 jamey.hick
//**********************************************************************
23
// Entropy Decoder implementation
24
//----------------------------------------------------------------------
25
//
26
//
27
 
28
package mkEntropyDec;
29
 
30
import H264Types::*;
31
import ExpGolomb::*;
32
import CAVLC::*;
33
import ICalc_nC::*;
34
import mkCalc_nC::*;
35
import IEntropyDec::*;
36
import FIFO::*;
37
 
38
import Connectable::*;
39
import GetPut::*;
40
import ClientServer::*;
41
 
42
 
43
//-----------------------------------------------------------
44
// Local Datatypes
45
//-----------------------------------------------------------
46
 
47
typedef union tagged
48
{
49
 void     Start;            //special state that initializes the process.
50
 void     NewUnit;          //special state that checks the NAL unit type.
51
 
52
 Bit#(5)  CodedSlice;       //decodes a type of NAL unit
53
 void     SEI;              //decodes a type of NAL unit
54
 Bit#(5)  SPS;              //decodes a type of NAL unit
55
 Bit#(5)  PPS;              //decodes a type of NAL unit
56
 void     AUD;              //decodes a type of NAL unit
57
 void     EndSequence;      //decodes a type of NAL unit
58
 void     EndStream;        //decodes a type of NAL unit
59
 void     Filler;           //decodes a type of NAL unit
60
 
61
 Bit#(5)  SliceData;        //decodes slice data (part of a CodedSlice NAL unit)
62
 Bit#(5)  MacroblockLayer;  //decodes macroblock layer (part of a CodedSlice NAL unit)
63
 Bit#(5)  MbPrediction;     //decodes macroblock prediction (part of a CodedSlice NAL unit)
64
 Bit#(5)  SubMbPrediction;  //decodes sub-macroblock prediction (part of a CodedSlice NAL unit)
65
 Bit#(5)  ResidualBlock;    //decodes residual block (part of a CodedSlice NAL unit)
66
}
67
State deriving(Eq,Bits);
68
 
69
 
70
 
71
//-----------------------------------------------------------
72
// Helper functions
73
function MbType mbtype_convert( Bit#(5) in_mb_type, Bit#(4) in_slice_type );//converts mb_type syntax element to MbType type
74
   Bit#(5) tempmb = in_mb_type;
75
   if(in_slice_type == 2 || in_slice_type == 7)//I slice
76
      tempmb = in_mb_type+5;
77
   case ( tempmb )
78
      0: return P_L0_16x16;
79
      1: return P_L0_L0_16x8;
80
      2: return P_L0_L0_8x16;
81
      3: return P_8x8;
82
      4: return P_8x8ref0;
83
      5: return I_NxN;
84
      30: return I_PCM;
85
      default:
86
      begin
87
         Bit#(5) tempmb16x16 = tempmb-6;
88
         Bit#(2) tempv1 = tempmb16x16[1:0];
89
         Bit#(2) tempv2;
90
         Bit#(1) tempv3;
91
         if(tempmb16x16 < 12)
92
            begin
93
               tempv3 = 0;
94
               tempv2 = tempmb16x16[3:2];
95
            end
96
         else
97
            begin
98
               tempv3 = 1;
99
               tempv2 = tempmb16x16[3:2]+1;
100
            end
101
         return I_16x16{intra16x16PredMode:tempv1, codedBlockPatternChroma:tempv2, codedBlockPatternLuma:tempv3};
102
      end
103
   endcase
104
endfunction
105
 
106
 
107
 
108
//-----------------------------------------------------------
109
// Entropy Decoder Module
110
//-----------------------------------------------------------
111
 
112
 
113
(* synthesize *)
114
module mkEntropyDec( IEntropyDec );
115
 
116
   FIFO#(NalUnwrapOT)       infifo      <- mkSizedFIFO(entropyDec_infifo_size);
117
   FIFO#(EntropyDecOT)      outfifo     <- mkFIFO;
118
   FIFO#(EntropyDecOT_InverseTrans) outfifo_ITB <- mkFIFO;
119
   Reg#(State)              state       <- mkReg(Start);
120
   Reg#(Bit#(2))            nalrefidc   <- mkReg(0);
121
   Reg#(Bit#(5))            nalunittype <- mkReg(0);
122
   Reg#(Buffer)             buffer      <- mkReg(0);
123
   Reg#(Bufcount)           bufcount    <- mkReg(0);
124
 
125
   //saved syntax elements
126
   Reg#(Bit#(5))              spsseq_parameter_set_id                    <- mkReg(0);
127
   Reg#(Bit#(5))              spslog2_max_frame_num                      <- mkReg(0);
128
   Reg#(Bit#(5))              spslog2_max_pic_order_cnt_lsb              <- mkReg(0);
129
   Reg#(Bit#(2))              spspic_order_cnt_type                      <- mkReg(0);
130
   Reg#(Bit#(1))              spsdelta_pic_order_always_zero_flag        <- mkReg(0);
131
   Reg#(Bit#(8))              spsnum_ref_frames_in_pic_order_cnt_cycle   <- mkReg(0);
132
   Reg#(Bit#(8))              ppspic_parameter_set_id                    <- mkReg(0);
133
   Reg#(Bit#(1))              ppspic_order_present_flag                  <- mkReg(0);
134
   Reg#(Bit#(1))              ppsdeblocking_filter_control_present_flag  <- mkReg(0);
135
   Reg#(Bit#(4))              shslice_type                               <- mkReg(0);
136
   Reg#(Bit#(3))              shdmemory_management_control_operation     <- mkReg(0);
137
   Reg#(MbType)               sdmmbtype                                  <- mkReg(I_NxN);
138
   Reg#(Bit#(4))              sdmcodedBlockPatternLuma                   <- mkReg(0);
139
   Reg#(Bit#(2))              sdmcodedBlockPatternChroma                 <- mkReg(0);
140
   Reg#(Bit#(5))              sdmrTotalCoeff                             <- mkReg(0);
141
   Reg#(Bit#(2))              sdmrTrailingOnes                           <- mkReg(0);
142
 
143
   //derived decoding variables for slice data
144
   Reg#(Bit#(16))             tempreg                                    <- mkReg(0);
145
   Reg#(Bit#(5))              num_ref_idx_l0_active_minus1               <- mkReg(0);
146
   Reg#(Bit#(PicAreaSz))      currMbAddr                                 <- mkReg(0);
147
   Reg#(Bit#(3))              temp3bit0                                  <- mkReg(0);
148
   Reg#(Bit#(3))              temp3bit1                                  <- mkReg(0);
149
   Reg#(Bit#(3))              temp3bit2                                  <- mkReg(0);
150
   Reg#(Bit#(3))              temp3bit3                                  <- mkReg(0);
151
   Reg#(Bit#(5))              temp5bit                                   <- mkReg(0);
152
   Reg#(Bit#(5))              temp5bit2                                  <- mkReg(0);
153
   Reg#(Bit#(5))              maxNumCoeff                                <- mkReg(0);
154
   FIFO#(Bit#(13))            cavlcFIFO                                  <- mkSizedFIFO(16);
155
   Calc_nC                    calcnc                                     <- mkCalc_nC();
156
   Reg#(Bit#(1))              residualChroma                             <- mkReg(0);
157
   Reg#(Bit#(5))              totalCoeff                                 <- mkReg(0);
158
   Reg#(Bit#(4))              zerosLeft                                  <- mkReg(0);
159
 
160
   //exp-golomb 32-bit version states
161
   Reg#(Bufcount)             egnumbits                                  <- mkReg(0);
162
 
163
   //extra-buffering states
164
   Reg#(Bit#(32))             extrabuffer                                <- mkReg(0);
165
   Reg#(Bit#(3))              extrabufcount                              <- mkReg(0);
166
   Reg#(Bit#(1))              extraendnalflag                            <- mkReg(0);
167
   Reg#(Bit#(1))              endnalflag                                 <- mkReg(0);
168
 
169
 
170
   //-----------------------------------------------------------
171
   // Rules
172
 
173
   rule startup (state matches Start);
174
      case (infifo.first()) matches
175
         tagged NewUnit :
176
            begin
177
               infifo.deq();
178
               state <= NewUnit;
179
               buffer <= 0;
180
               bufcount <= 0;
181
               extrabuffer <= 0;
182
               extrabufcount <= 0;
183
               extraendnalflag <= 0;
184
               endnalflag <= 0;
185
            end
186
         tagged RbspByte .rdata :
187
            begin
188
               infifo.deq();
189
            end
190
         tagged EndOfFile :
191
            begin
192
               infifo.deq();
193
               outfifo.enq(EndOfFile);
194
               $display( "INFO EntropyDec: EndOfFile reached" );
195
            end
196
      endcase
197
   endrule
198
 
199
 
200
   rule newunit (state matches NewUnit);
201
      case (infifo.first()) matches
202
         tagged NewUnit : state <= Start;
203
         tagged RbspByte .rdata :
204
            begin
205
               infifo.deq();
206
               nalrefidc <= rdata[6:5];
207
               nalunittype <= rdata[4:0];
208
               case (rdata[4:0])
209
                  1 : state <= tagged CodedSlice 0;
210
                  5 : state <= tagged CodedSlice 0;
211
                  6 : state <= SEI;
212
                  7 : state <= tagged SPS 0;
213
                  8 : state <= tagged PPS 0;
214
                  9 : state <= AUD;
215
                  10: state <= EndSequence;
216
                  11: state <= EndStream;
217
                  12: state <= Filler;
218
                  default:
219
                  begin
220
                     $display( "ERROR EntropyDec: NAL Unit Type = %d", rdata[4:0] );
221
                     state <= Start;
222
                  end
223
               endcase
224
               $display("ccl2newunit");
225
               $display("ccl2rbspbyte %h", rdata);
226
               outfifo.enq(tagged NewUnit rdata);
227
               outfifo_ITB.enq(tagged NewUnit rdata);
228
            end
229
         tagged EndOfFile : state <= Start;
230
      endcase
231
   endrule
232
 
233
 
234
   rule fillextrabuffer (state != Start
235
                         && state != NewUnit
236
                         && extrabufcount < 4
237
                         && extraendnalflag == 0);
238
      if(infifo.first() matches tagged RbspByte .dbyte)
239
         begin
240
            case ( extrabufcount )
241
               0: extrabuffer <= {dbyte, extrabuffer[23:0]};
242
               1: extrabuffer <= {extrabuffer[31:24],dbyte,extrabuffer[15:0]};
243
               2: extrabuffer <= {extrabuffer[31:16],dbyte,extrabuffer[7:0]};
244
               3: extrabuffer <= {extrabuffer[31:8],dbyte};
245
               default: $display( "ERROR EntropyDec: fillextrabuffer default case_" );
246
            endcase
247
            extrabufcount <= extrabufcount + 1;
248
            infifo.deq();
249
            //$display( "TRACE EntropyDec: fillextrabuffer RbspByte %h %h %h", dbyte, extrabufcount, extrabuffer);
250
         end
251
      else
252
         begin
253
            if(extrabufcount != 0)
254
               extraendnalflag <= 1;
255
            //$display( "TRACE EntropyDec: fillextrabuffer else %h", extrabufcount);
256
         end
257
   endrule
258
 
259
 
260
   rule fillbuffer (state != Start
261
                    && state != NewUnit
262
                    && bufcount<=truncate(buffersize-32)
263
                    && (extrabufcount == 4 || extraendnalflag == 1)
264
                    && endnalflag == 0);//predicate not sure
265
      Buffer temp = zeroExtend(extrabuffer);
266
      Bufcount temp2 = truncate(buffersize)-bufcount-32;
267
      buffer <= (buffer | (temp << zeroExtend(temp2)));
268
      case ( extrabufcount )
269
         4: bufcount <= bufcount+32;
270
         3: bufcount <= bufcount+24;
271
         2: bufcount <= bufcount+16;
272
         1: bufcount <= bufcount+8;
273
         default: $display( "ERROR EntropyDec: fillbuffer default case" );
274
      endcase
275
      extrabuffer <= 0;
276
      extrabufcount <= 0;
277
      if(infifo.first()==NewUnit || infifo.first()==EndOfFile)
278
         endnalflag <= 1;
279
      //$display( "TRACE EntropyDec: fillbuffer RbspByte %h %h %h %h %h %h %h %h", extrabufcount, bufcount, extrabuffer, temp, temp2, (temp << zeroExtend(temp2)), buffer, (buffer | (temp << zeroExtend(temp2))));
280
   endrule
281
 
282
 
283
   rule parser (state != Start
284
                &&& state != NewUnit
285
                &&& (bufcount > truncate(buffersize-32) || endnalflag == 1));//predicate not sure
286
      //$display( "TRACE EntropyDec: fillbuffer RbspByte %h %h", bufcount, buffer );
287
 
288
      Bufcount numbitsused = 0;
289
      State nextstate = Start;
290
      Int#(16) tempint = 0;
291
      Int#(32) tempint32 = 0;
292
 
293
      case ( state ) matches
294
         tagged CodedSlice .step :
295
            begin
296
               case ( step )
297
                  0:
298
                  begin
299
                     $display( "ccl2SHfirst_mb_in_slice %0d", expgolomb_unsigned(buffer) );
300
                     outfifo.enq(tagged SHfirst_mb_in_slice truncate(expgolomb_unsigned(buffer)));
301
                     currMbAddr <= truncate(expgolomb_unsigned(buffer));
302
                     calcnc.initialize(truncate(expgolomb_unsigned(buffer)));
303
                     numbitsused = expgolomb_numbits(buffer);
304
                     nextstate = tagged CodedSlice 1;
305
                  end
306
                  1:
307
                  begin
308
                     $display( "ccl2SHslice_type %0d", expgolomb_unsigned(buffer) );
309
                     outfifo.enq(tagged SHslice_type truncate(expgolomb_unsigned(buffer)));
310
                     shslice_type <= truncate(expgolomb_unsigned(buffer));
311
                     numbitsused = expgolomb_numbits(buffer);
312
                     nextstate = tagged CodedSlice 2;
313
                  end
314
                  2:
315
                  begin
316
                     $display( "ccl2SHpic_parameter_set_id %0d", expgolomb_unsigned(buffer) );
317
                     outfifo.enq(tagged SHpic_parameter_set_id truncate(expgolomb_unsigned(buffer)));
318
                     numbitsused = expgolomb_numbits(buffer);
319
                     nextstate = tagged CodedSlice 3;
320
                     if(ppspic_parameter_set_id != truncate(expgolomb_unsigned(buffer))) $display( "ERROR EntropyDec: pic_parameter_set_id don't match" );
321
                  end
322
                  3:
323
                  begin
324
                     Bit#(16) tttt = buffer[buffersize-1:buffersize-16];
325
                     tttt = tttt >> 16 - zeroExtend(spslog2_max_frame_num);
326
                     $display( "ccl2SHframe_num %0d", tttt );
327
                     outfifo.enq(tagged SHframe_num tttt);
328
                     numbitsused = zeroExtend(spslog2_max_frame_num);
329
                     nextstate = tagged CodedSlice 4;
330
                  end
331
                  4:
332
                  begin
333
                     if(nalunittype == 5)
334
                        begin
335
                           $display( "ccl2SHidr_pic_id %0d", expgolomb_unsigned(buffer) );
336
                           outfifo.enq(tagged SHidr_pic_id truncate(expgolomb_unsigned(buffer)));
337
                           numbitsused = expgolomb_numbits(buffer);
338
                        end
339
                     nextstate = tagged CodedSlice 5;
340
                  end
341
                  5:
342
                  begin
343
                     if(spspic_order_cnt_type == 0)
344
                        begin
345
                           Bit#(16) tttt = buffer[buffersize-1:buffersize-16];
346
                           tttt = tttt >> 16 - zeroExtend(spslog2_max_pic_order_cnt_lsb);
347
                           $display( "ccl2SHpic_order_cnt_lsb %0d", tttt );
348
                           outfifo.enq(tagged SHpic_order_cnt_lsb tttt);
349
                           numbitsused = zeroExtend(spslog2_max_pic_order_cnt_lsb);
350
                           nextstate = tagged CodedSlice 6;
351
                        end
352
                     else
353
                        nextstate = tagged CodedSlice 7;
354
                  end
355
                  6:
356
                  begin
357
                     if(ppspic_order_present_flag == 1)
358
                        begin
359
                           if(egnumbits == 0)
360
                              begin
361
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
362
                                 egnumbits <= tempbufcount;
363
                                 numbitsused = tempbufcount-1;
364
                                 nextstate = tagged CodedSlice 6;
365
                              end
366
                           else
367
                              begin
368
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
369
                                 $display( "ccl2SHdelta_pic_order_cnt_bottom %0d", tempint32 );
370
                                 outfifo.enq(tagged SHdelta_pic_order_cnt_bottom truncate(expgolomb_signed32(buffer,egnumbits)));
371
                                 egnumbits <= 0;
372
                                 numbitsused = egnumbits;
373
                                 nextstate = tagged CodedSlice 7;
374
                              end
375
                        end
376
                     else
377
                        nextstate = tagged CodedSlice 7;
378
                  end
379
                  7:
380
                  begin
381
                     if(spspic_order_cnt_type == 1 && spsdelta_pic_order_always_zero_flag == 0)
382
                        begin
383
                           if(egnumbits == 0)
384
                              begin
385
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
386
                                 egnumbits <= tempbufcount;
387
                                 numbitsused = tempbufcount-1;
388
                                 nextstate = tagged CodedSlice 7;
389
                              end
390
                           else
391
                              begin
392
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
393
                                 $display( "ccl2SHdelta_pic_order_cnt0 %0d", tempint32 );
394
                                 outfifo.enq(tagged SHdelta_pic_order_cnt0 truncate(expgolomb_signed32(buffer,egnumbits)));
395
                                 egnumbits <= 0;
396
                                 numbitsused = egnumbits;
397
                                 nextstate = tagged CodedSlice 8;
398
                              end
399
                        end
400
                     else
401
                        nextstate = tagged CodedSlice 9;
402
                  end
403
                  8:
404
                  begin
405
                     if(ppspic_order_present_flag == 1)
406
                        begin
407
                           if(egnumbits == 0)
408
                              begin
409
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
410
                                 egnumbits <= tempbufcount;
411
                                 numbitsused = tempbufcount-1;
412
                                 nextstate = tagged CodedSlice 8;
413
                              end
414
                           else
415
                              begin
416
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
417
                                 $display( "ccl2SHdelta_pic_order_cnt1 %0d", tempint32 );
418
                                 outfifo.enq(tagged SHdelta_pic_order_cnt1 truncate(expgolomb_signed32(buffer,egnumbits)));
419
                                 egnumbits <= 0;
420
                                 numbitsused = egnumbits;
421
                                 nextstate = tagged CodedSlice 9;
422
                              end
423
                        end
424
                     else
425
                        nextstate = tagged CodedSlice 9;
426
                  end
427
                  9:
428
                  begin
429
                     if(shslice_type == 0 || shslice_type == 5)
430
                        begin
431
                           $display( "ccl2SHnum_ref_idx_active_override_flag %0d", buffer[buffersize-1] );
432
                           outfifo.enq(tagged SHnum_ref_idx_active_override_flag buffer[buffersize-1]);
433
                           numbitsused = 1;
434
                           if(buffer[buffersize-1] == 1)
435
                              nextstate = tagged CodedSlice 10;
436
                           else
437
                              nextstate = tagged CodedSlice 11;
438
                        end
439
                     else
440
                        nextstate = tagged CodedSlice 11;
441
                  end
442
                  10:
443
                  begin
444
                     $display( "ccl2SHnum_ref_idx_l0_active %0d", expgolomb_unsigned(buffer)+1 );
445
                     outfifo.enq(tagged SHnum_ref_idx_l0_active truncate(expgolomb_unsigned(buffer)+1));
446
                     num_ref_idx_l0_active_minus1 <= truncate(expgolomb_unsigned(buffer));
447
                     numbitsused = expgolomb_numbits(buffer);
448
                     nextstate = tagged CodedSlice 11;
449
                  end
450
                  11:
451
                  begin
452
                     if(shslice_type != 2 && shslice_type != 7)
453
                        begin
454
                           $display( "ccl2SHRref_pic_list_reordering_flag_l0 %0d", buffer[buffersize-1] );
455
                           outfifo.enq(tagged SHRref_pic_list_reordering_flag_l0 buffer[buffersize-1]);
456
                           numbitsused = 1;
457
                           if(buffer[buffersize-1] == 1)
458
                              nextstate = tagged CodedSlice 12;
459
                           else
460
                              nextstate = tagged CodedSlice 15;
461
                        end
462
                     else
463
                        nextstate = tagged CodedSlice 15;
464
                  end
465
                  12:
466
                  begin
467
                     $display( "ccl2SHRreordering_of_pic_nums_idc %0d", expgolomb_unsigned(buffer) );
468
                     outfifo.enq(tagged SHRreordering_of_pic_nums_idc truncate(expgolomb_unsigned(buffer)));
469
                     numbitsused = expgolomb_numbits(buffer);
470
                     if(expgolomb_unsigned(buffer)==0 || expgolomb_unsigned(buffer)==1)
471
                        nextstate = tagged CodedSlice 13;
472
                     else if(expgolomb_unsigned(buffer)==2)
473
                        nextstate = tagged CodedSlice 14;
474
                     else
475
                        nextstate = tagged CodedSlice 15;
476
                  end
477
                  13:
478
                  begin
479
                     Bit#(17) temp17 = zeroExtend(expgolomb_unsigned(buffer)) + 1;
480
                     $display( "ccl2SHRabs_diff_pic_num %0d", temp17 );
481
                     outfifo.enq(tagged SHRabs_diff_pic_num temp17);
482
                     numbitsused = expgolomb_numbits(buffer);
483
                     nextstate = tagged CodedSlice 12;
484
                  end
485
                  14:
486
                  begin
487
                     $display( "ccl2SHRlong_term_pic_num %0d", expgolomb_unsigned(buffer) );
488
                     outfifo.enq(tagged SHRlong_term_pic_num truncate(expgolomb_unsigned(buffer)));
489
                     numbitsused = expgolomb_numbits(buffer);
490
                     nextstate = tagged CodedSlice 12;
491
                  end
492
                  15:
493
                  begin
494
                     if(nalrefidc == 0)
495
                        nextstate = tagged CodedSlice 23;
496
                     else
497
                        begin
498
                           if(nalunittype == 5)
499
                              begin
500
                                 $display( "ccl2SHDno_output_of_prior_pics_flag %0d", buffer[buffersize-1] );
501
                                 outfifo.enq(tagged SHDno_output_of_prior_pics_flag buffer[buffersize-1]);
502
                                 numbitsused = 1;
503
                                 nextstate = tagged CodedSlice 16;
504
                              end
505
                           else
506
                              nextstate = tagged CodedSlice 17;
507
                        end
508
                  end
509
                  16:
510
                  begin
511
                     $display( "ccl2SHDlong_term_reference_flag %0d", buffer[buffersize-1] );
512
                     outfifo.enq(tagged SHDlong_term_reference_flag buffer[buffersize-1]);
513
                     numbitsused = 1;
514
                     nextstate = tagged CodedSlice 23;
515
                  end
516
                  17:
517
                  begin
518
                     $display( "ccl2SHDadaptive_ref_pic_marking_mode_flag %0d", buffer[buffersize-1] );
519
                     outfifo.enq(tagged SHDadaptive_ref_pic_marking_mode_flag buffer[buffersize-1]);
520
                     numbitsused = 1;
521
                     if(buffer[buffersize-1] == 1)
522
                        nextstate = tagged CodedSlice 18;
523
                     else
524
                        nextstate = tagged CodedSlice 23;
525
                  end
526
                  18:
527
                  begin
528
                     $display( "ccl2SHDmemory_management_control_operation %0d", expgolomb_unsigned(buffer) );
529
                     outfifo.enq(tagged SHDmemory_management_control_operation truncate(expgolomb_unsigned(buffer)));
530
                     shdmemory_management_control_operation <= truncate(expgolomb_unsigned(buffer));
531
                     numbitsused = expgolomb_numbits(buffer);
532
                     if(expgolomb_unsigned(buffer)!=0)
533
                        nextstate = tagged CodedSlice 19;
534
                     else
535
                        nextstate = tagged CodedSlice 23;
536
                  end
537
                  19:
538
                  begin
539
                     if(shdmemory_management_control_operation==1 || shdmemory_management_control_operation==3)
540
                        begin
541
                           Bit#(17) temp17 = zeroExtend(expgolomb_unsigned(buffer)) + 1;
542
                           $display( "ccl2SHDdifference_of_pic_nums %0d", temp17 );
543
                           outfifo.enq(tagged SHDdifference_of_pic_nums temp17);
544
                           numbitsused = expgolomb_numbits(buffer);
545
                           nextstate = tagged CodedSlice 20;
546
                        end
547
                     else
548
                        nextstate = tagged CodedSlice 20;
549
                  end
550
                  20:
551
                  begin
552
                     if(shdmemory_management_control_operation==2)
553
                        begin
554
                           $display( "ccl2SHDlong_term_pic_num %0d", expgolomb_unsigned(buffer) );
555
                           outfifo.enq(tagged SHDlong_term_pic_num truncate(expgolomb_unsigned(buffer)));
556
                           numbitsused = expgolomb_numbits(buffer);
557
                           nextstate = tagged CodedSlice 21;
558
                        end
559
                     else
560
                        nextstate = tagged CodedSlice 21;
561
                  end
562
                  21:
563
                  begin
564
                     if(shdmemory_management_control_operation==3 || shdmemory_management_control_operation==6)
565
                        begin
566
                           $display( "ccl2SHDlong_term_frame_idx %0d", expgolomb_unsigned(buffer) );
567
                           outfifo.enq(tagged SHDlong_term_frame_idx truncate(expgolomb_unsigned(buffer)));
568
                           numbitsused = expgolomb_numbits(buffer);
569
                           nextstate = tagged CodedSlice 22;
570
                        end
571
                     else
572
                        nextstate = tagged CodedSlice 22;
573
                  end
574
                  22:
575
                  begin
576
                     if(shdmemory_management_control_operation==4)
577
                        begin
578
                           $display( "ccl2SHDmax_long_term_frame_idx_plus1 %0d", expgolomb_unsigned(buffer) );
579
                           outfifo.enq(tagged SHDmax_long_term_frame_idx_plus1 truncate(expgolomb_unsigned(buffer)));
580
                           numbitsused = expgolomb_numbits(buffer);
581
                           nextstate = tagged CodedSlice 18;
582
                        end
583
                     else
584
                        nextstate = tagged CodedSlice 18;
585
                  end
586
                  23:
587
                  begin
588
                     tempint = unpack(expgolomb_signed(buffer));
589
                     $display( "ccl2SHslice_qp_delta %0d", tempint );
590
                     outfifo_ITB.enq(tagged SHslice_qp_delta truncate(expgolomb_signed(buffer)));
591
                     numbitsused = expgolomb_numbits(buffer);
592
                     nextstate = tagged CodedSlice 24;
593
                  end
594
                  24:
595
                  begin
596
                     if(ppsdeblocking_filter_control_present_flag==1)
597
                        begin
598
                           $display( "ccl2SHdisable_deblocking_filter_idc %0d", expgolomb_unsigned(buffer) );
599
                           outfifo.enq(tagged SHdisable_deblocking_filter_idc truncate(expgolomb_unsigned(buffer)));
600
                           numbitsused = expgolomb_numbits(buffer);
601
                           if(expgolomb_unsigned(buffer)!=1)
602
                              nextstate = tagged CodedSlice 25;
603
                           else
604
                              nextstate = tagged CodedSlice 27;
605
                        end
606
                     else
607
                        nextstate = tagged CodedSlice 27;
608
                  end
609
                  25:
610
                  begin
611
                     tempint = unpack(expgolomb_signed(buffer) << 1);
612
                     $display( "ccl2SHslice_alpha_c0_offset %0d", tempint );
613
                     outfifo.enq(tagged SHslice_alpha_c0_offset truncate(expgolomb_signed(buffer) << 1));
614
                     numbitsused = expgolomb_numbits(buffer);
615
                     nextstate = tagged CodedSlice 26;
616
                  end
617
                  26:
618
                  begin
619
                     tempint = unpack(expgolomb_signed(buffer) << 1);
620
                     $display( "ccl2SHslice_beta_offset %0d", tempint );
621
                     outfifo.enq(tagged SHslice_beta_offset truncate(expgolomb_signed(buffer) << 1));
622
                     numbitsused = expgolomb_numbits(buffer);
623
                     nextstate = tagged CodedSlice 27;
624
                  end
625
                  27:
626
                  begin
627
                     nextstate = tagged SliceData 0;
628
                  end
629
                  default: $display( "ERROR EntropyDec: CodedSlice default step" );
630
               endcase
631
            end
632
         tagged SEI .step :
633
            begin
634
               nextstate = Start;
635
               $display( "INFO EntropyDec: SEI data thrown away" );
636
            end
637
         tagged SPS .step :
638
            begin
639
               case ( step )
640
                  0:
641
                  begin
642
                     Bit#(8) outputdata = buffer[buffersize-1:buffersize-8];
643
                     $display( "INFO EntropyDec: profile_idc = %d", outputdata );
644
                     outputdata = buffer[buffersize-9:buffersize-16];
645
                     $display( "INFO EntropyDec: constraint_set = %b", outputdata );
646
                     outputdata = buffer[buffersize-17:buffersize-24];
647
                     $display( "INFO EntropyDec: level_idc = %d", outputdata );
648
                     numbitsused = 24;
649
                     nextstate = tagged SPS 1;
650
                  end
651
                  1:
652
                  begin
653
                     $display( "ccl2SPSseq_parameter_set_id %0d", expgolomb_unsigned(buffer) );
654
                     outfifo.enq(tagged SPSseq_parameter_set_id truncate(expgolomb_unsigned(buffer)));
655
                     spsseq_parameter_set_id <= truncate(expgolomb_unsigned(buffer));
656
                     numbitsused = expgolomb_numbits(buffer);
657
                     nextstate = tagged SPS 2;
658
                  end
659
                  2:
660
                  begin
661
                     $display( "ccl2SPSlog2_max_frame_num %0d", expgolomb_unsigned(buffer)+4 );
662
                     outfifo.enq(tagged SPSlog2_max_frame_num truncate(expgolomb_unsigned(buffer)+4));
663
                     spslog2_max_frame_num <= truncate(expgolomb_unsigned(buffer)+4);
664
                     numbitsused = expgolomb_numbits(buffer);
665
                     nextstate = tagged SPS 3;
666
                  end
667
                  3:
668
                  begin
669
                     let tttt = expgolomb_unsigned(buffer);
670
                     $display( "ccl2SPSpic_order_cnt_type %0d", tttt );
671
                     outfifo.enq(tagged SPSpic_order_cnt_type truncate(tttt));
672
                     spspic_order_cnt_type <= truncate(tttt);
673
                     numbitsused = expgolomb_numbits(buffer);
674
                     if(tttt == 0)
675
                        nextstate = tagged SPS 4;
676
                     else if(tttt == 1)
677
                        nextstate = tagged SPS 5;
678
                     else
679
                        nextstate = tagged SPS 10;
680
                  end
681
                  4:
682
                  begin
683
                     $display( "ccl2SPSlog2_max_pic_order_cnt_lsb %0d", expgolomb_unsigned(buffer)+4 );
684
                     outfifo.enq(tagged SPSlog2_max_pic_order_cnt_lsb truncate(expgolomb_unsigned(buffer)+4));
685
                     spslog2_max_pic_order_cnt_lsb <= truncate(expgolomb_unsigned(buffer)+4);
686
                     numbitsused = expgolomb_numbits(buffer);
687
                     nextstate = tagged SPS 10;
688
                  end
689
                  5:
690
                  begin
691
                     $display( "ccl2SPSdelta_pic_order_always_zero_flag %0d", buffer[buffersize-1] );
692
                     outfifo.enq(tagged SPSdelta_pic_order_always_zero_flag buffer[buffersize-1]);
693
                     spsdelta_pic_order_always_zero_flag <= buffer[buffersize-1];
694
                     numbitsused = 1;
695
                     nextstate = tagged SPS 6;
696
                  end
697
                  6:
698
                  begin
699
                     if(egnumbits == 0)
700
                        begin
701
                           Bufcount tempbufcount = expgolomb_numbits32(buffer);
702
                           egnumbits <= tempbufcount;
703
                           numbitsused = tempbufcount-1;
704
                           nextstate = tagged SPS 6;
705
                        end
706
                     else
707
                        begin
708
                           tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
709
                           $display( "ccl2SPSoffset_for_non_ref_pic %0d", tempint32 );
710
                           outfifo.enq(tagged SPSoffset_for_non_ref_pic truncate(expgolomb_signed32(buffer,egnumbits)));
711
                           egnumbits <= 0;
712
                           numbitsused = egnumbits;
713
                           nextstate = tagged SPS 7;
714
                        end
715
                  end
716
                  7:
717
                  begin
718
                     if(egnumbits == 0)
719
                        begin
720
                           Bufcount tempbufcount = expgolomb_numbits32(buffer);
721
                           egnumbits <= tempbufcount;
722
                           numbitsused = tempbufcount-1;
723
                           nextstate = tagged SPS 7;
724
                        end
725
                     else
726
                        begin
727
                           tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
728
                           $display( "ccl2SPSoffset_for_top_to_bottom_field %0d", tempint32 );
729
                           outfifo.enq(tagged SPSoffset_for_top_to_bottom_field truncate(expgolomb_signed32(buffer,egnumbits)));
730
                           egnumbits <= 0;
731
                           numbitsused = egnumbits;
732
                           nextstate = tagged SPS 8;
733
                        end
734
                  end
735
                  8:
736
                  begin
737
                     $display( "ccl2SPSnum_ref_frames_in_pic_order_cnt_cycle %0d", expgolomb_unsigned(buffer) );
738
                     outfifo.enq(tagged SPSnum_ref_frames_in_pic_order_cnt_cycle truncate(expgolomb_unsigned(buffer)));
739
                     spsnum_ref_frames_in_pic_order_cnt_cycle <= truncate(expgolomb_unsigned(buffer));
740
                     numbitsused = expgolomb_numbits(buffer);
741
                     nextstate = tagged SPS 9;
742
                  end
743
                  9:
744
                  begin
745
                     if(spsnum_ref_frames_in_pic_order_cnt_cycle == 0)
746
                        nextstate = tagged SPS 10;
747
                     else
748
                        begin
749
                           if(egnumbits == 0)
750
                              begin
751
                                 Bufcount tempbufcount = expgolomb_numbits32(buffer);
752
                                 egnumbits <= tempbufcount;
753
                                 numbitsused = tempbufcount-1;
754
                                 nextstate = tagged SPS 9;
755
                              end
756
                           else
757
                              begin
758
                                 tempint32 = unpack(expgolomb_signed32(buffer,egnumbits));
759
                                 $display( "ccl2SPSoffset_for_ref_frame %0d", tempint32 );
760
                                 outfifo.enq(tagged SPSoffset_for_ref_frame truncate(expgolomb_signed32(buffer,egnumbits)));
761
                                 egnumbits <= 0;
762
                                 spsnum_ref_frames_in_pic_order_cnt_cycle <= spsnum_ref_frames_in_pic_order_cnt_cycle - 1;
763
                                 numbitsused = egnumbits;
764
                                 nextstate = tagged SPS 9;
765
                              end
766
                        end
767
                  end
768
                  10:
769
                  begin
770
                     $display( "ccl2SPSnum_ref_frames %0d", expgolomb_unsigned(buffer) );
771
                     outfifo.enq(tagged SPSnum_ref_frames truncate(expgolomb_unsigned(buffer)));
772
                     numbitsused = expgolomb_numbits(buffer);
773
                     nextstate = tagged SPS 11;
774
                  end
775
                  11:
776
                  begin
777
                     $display( "ccl2SPSgaps_in_frame_num_allowed_flag %0d", buffer[buffersize-1] );
778
                     outfifo.enq(tagged SPSgaps_in_frame_num_allowed_flag buffer[buffersize-1]);
779
                     numbitsused = 1;
780
                     nextstate = tagged SPS 12;
781
                  end
782
                  12:
783
                  begin
784
                     $display( "ccl2SPSpic_width_in_mbs %0d", expgolomb_unsigned(buffer)+1 );
785
                     outfifo.enq(tagged SPSpic_width_in_mbs truncate(expgolomb_unsigned(buffer)+1));
786
                     calcnc.initialize_picWidth(truncate(expgolomb_unsigned(buffer)+1));
787
                     numbitsused = expgolomb_numbits(buffer);
788
                     nextstate = tagged SPS 13;
789
                  end
790
                  13:
791
                  begin
792
                     $display( "ccl2SPSpic_height_in_map_units %0d", expgolomb_unsigned(buffer)+1 );
793
                     outfifo.enq(tagged SPSpic_height_in_map_units truncate(expgolomb_unsigned(buffer)+1));
794
                     numbitsused = expgolomb_numbits(buffer);
795
                     nextstate = tagged SPS 14;
796
                  end
797
                  14:
798
                  begin
799
                     //SPSframe_mbs_only_flag = 1 for baseline
800
                     numbitsused = 1;
801
                     nextstate = tagged SPS 15;
802
                  end
803
                  15:
804
                  begin
805
                     $display( "ccl2SPSdirect_8x8_inference_flag %0d", buffer[buffersize-1] );
806
                     outfifo.enq(tagged SPSdirect_8x8_inference_flag buffer[buffersize-1]);
807
                     numbitsused = 1;
808
                     nextstate = tagged SPS 16;
809
                  end
810
                  16:
811
                  begin
812
                     $display( "ccl2SPSframe_cropping_flag %0d", buffer[buffersize-1] );
813
                     outfifo.enq(tagged SPSframe_cropping_flag buffer[buffersize-1]);
814
                     numbitsused = 1;
815
                     if(buffer[buffersize-1] == 1)
816
                        nextstate = tagged SPS 17;
817
                     else
818
                        nextstate = tagged SPS 21;
819
                  end
820
                  17:
821
                  begin
822
                     $display( "ccl2SPSframe_crop_left_offset %0d", expgolomb_unsigned(buffer) );
823
                     outfifo.enq(tagged SPSframe_crop_left_offset truncate(expgolomb_unsigned(buffer)));
824
                     numbitsused = expgolomb_numbits(buffer);
825
                     nextstate = tagged SPS 18;
826
                  end
827
                  18:
828
                  begin
829
                     $display( "ccl2SPSframe_crop_right_offset %0d", expgolomb_unsigned(buffer) );
830
                     outfifo.enq(tagged SPSframe_crop_right_offset truncate(expgolomb_unsigned(buffer)));
831
                     numbitsused = expgolomb_numbits(buffer);
832
                     nextstate = tagged SPS 19;
833
                  end
834
                  19:
835
                  begin
836
                     $display( "ccl2SPSframe_crop_top_offset %0d", expgolomb_unsigned(buffer) );
837
                     outfifo.enq(tagged SPSframe_crop_top_offset truncate(expgolomb_unsigned(buffer)));
838
                     numbitsused = expgolomb_numbits(buffer);
839
                     nextstate = tagged SPS 20;
840
                  end
841
                  20:
842
                  begin
843
                     $display( "ccl2SPSframe_crop_bottom_offset %0d", expgolomb_unsigned(buffer) );
844
                     outfifo.enq(tagged SPSframe_crop_bottom_offset truncate(expgolomb_unsigned(buffer)));
845
                     numbitsused = expgolomb_numbits(buffer);
846
                     nextstate = tagged SPS 21;
847
                  end
848
                  21:
849
                  begin
850
                     nextstate = Start;
851
                     $display( "INFO EntropyDec:VUI data thrown away" );
852
                  end
853
                  default: $display( "ERROR EntropyDec: SPS default step" );
854
               endcase
855
            end
856
         tagged PPS .step :
857
            begin
858
               case ( step )
859
                  0:
860
                  begin
861
                     ppspic_parameter_set_id <= truncate(expgolomb_unsigned(buffer));
862
                     $display( "ccl2PPSpic_parameter_set_id %0d", expgolomb_unsigned(buffer) );
863
                     outfifo.enq(tagged PPSpic_parameter_set_id truncate(expgolomb_unsigned(buffer)));
864
                     outfifo_ITB.enq(tagged PPSpic_parameter_set_id truncate(expgolomb_unsigned(buffer)));
865
                     numbitsused = expgolomb_numbits(buffer);
866
                     nextstate = tagged PPS 1;
867
                  end
868
                  1:
869
                  begin
870
                     $display( "ccl2PPSseq_parameter_set_id %0d", expgolomb_unsigned(buffer) );
871
                     outfifo.enq(tagged PPSseq_parameter_set_id truncate(expgolomb_unsigned(buffer)));
872
                     numbitsused = expgolomb_numbits(buffer);
873
                     nextstate = tagged PPS 2;
874
                     if(spsseq_parameter_set_id != truncate(expgolomb_unsigned(buffer)))
875
                        $display( "ERROR EntropyDec: seq_parameter_set_id don't match" );
876
                  end
877
                  2:
878
                  begin
879
                     //PPSentropy_coding_mode_flag = 0 for baseline
880
                     numbitsused = 1;
881
                     nextstate = tagged PPS 3;
882
                  end
883
                  3:
884
                  begin
885
                     ppspic_order_present_flag <= buffer[buffersize-1];
886
                     $display( "ccl2PPSpic_order_present_flag %0d", buffer[buffersize-1] );
887
                     outfifo.enq(tagged PPSpic_order_present_flag buffer[buffersize-1]);
888
                     numbitsused = 1;
889
                     nextstate = tagged PPS 4;
890
                  end
891
                  4:
892
                  begin
893
                     numbitsused = expgolomb_numbits(buffer);
894
                     nextstate = tagged PPS 5;
895
                     if(expgolomb_unsigned(buffer)+1 != 1)
896
                        $display( "ERROR EntropyDec: PPSnum_slice_groups not equal to 1" );//=1 for main
897
                  end
898
                  5:
899
                  begin
900
                     $display( "ccl2PPSnum_ref_idx_l0_active %0d", expgolomb_unsigned(buffer)+1 );
901
                     outfifo.enq(tagged PPSnum_ref_idx_l0_active truncate(expgolomb_unsigned(buffer)+1));
902
                     num_ref_idx_l0_active_minus1 <= truncate(expgolomb_unsigned(buffer));
903
                     numbitsused = expgolomb_numbits(buffer);
904
                     nextstate = tagged PPS 6;
905
                  end
906
                  6:
907
                  begin
908
                     $display( "ccl2PPSnum_ref_idx_l1_active %0d", expgolomb_unsigned(buffer)+1 );
909
                     outfifo.enq(tagged PPSnum_ref_idx_l1_active truncate(expgolomb_unsigned(buffer)+1));
910
                     numbitsused = expgolomb_numbits(buffer);
911
                     nextstate = tagged PPS 7;
912
                  end
913
                  7:
914
                  begin
915
                     //PPSweighted_pred_flag = 0 for baseline; PPSweighted_bipred_idc = 0 for baseline
916
                     numbitsused = 3;
917
                     nextstate = tagged PPS 8;
918
                  end
919
                  8:
920
                  begin
921
                     $display( "ccl2PPSpic_init_qp %0d", expgolomb_signed(buffer)+26 );
922
                     outfifo_ITB.enq(tagged PPSpic_init_qp truncate(expgolomb_signed(buffer)+26));
923
                     numbitsused = expgolomb_numbits(buffer);
924
                     nextstate = tagged PPS 9;
925
                  end
926
                  9:
927
                  begin
928
                     $display( "ccl2PPSpic_init_qs %0d", expgolomb_signed(buffer)+26 );
929
                     outfifo_ITB.enq(tagged PPSpic_init_qs truncate(expgolomb_signed(buffer)+26));
930
                     numbitsused = expgolomb_numbits(buffer);
931
                     nextstate = tagged PPS 10;
932
                  end
933
                  10:
934
                  begin
935
                     tempint = unpack(expgolomb_signed(buffer));
936
                     $display( "ccl2PPSchroma_qp_index_offset %0d", tempint );
937
                     outfifo_ITB.enq(tagged PPSchroma_qp_index_offset truncate(expgolomb_signed(buffer)));
938
                     numbitsused = expgolomb_numbits(buffer);
939
                     nextstate = tagged PPS 11;
940
                  end
941
                  11:
942
                  begin
943
                     ppsdeblocking_filter_control_present_flag <= buffer[buffersize-1];
944
                     $display( "ccl2PPSdeblocking_filter_control_present_flag %0d", buffer[buffersize-1] );
945
                     outfifo.enq(tagged PPSdeblocking_filter_control_present_flag buffer[buffersize-1]);
946
                     numbitsused = 1;
947
                     nextstate = tagged PPS 12;
948
                  end
949
                  12:
950
                  begin
951
                     $display( "ccl2PPSconstrained_intra_pred_flag %0d", buffer[buffersize-1] );
952
                     outfifo.enq(tagged PPSconstrained_intra_pred_flag buffer[buffersize-1]);
953
                     numbitsused = 1;
954
                     nextstate = tagged PPS 13;
955
                  end
956
                  13:
957
                  begin
958
                     //PPSredundant_pic_cnt_present_flag = 0 for main
959
                     numbitsused = 1;
960
                     nextstate = tagged PPS 14;
961
                     if(buffer[buffersize-1] != 0)
962
                        $display( "ERROR EntropyDec: PPSredundant_pic_cnt_present_flag not equal to 0" );//=0 for main
963
                  end
964
                  14:
965
                  begin
966
                     nextstate = Start;
967
                  end
968
                  default: $display( "ERROR EntropyDec: PPS default step" );
969
               endcase
970
            end
971
         tagged AUD .step :
972
            begin
973
               outfifo.enq(tagged AUDPrimaryPicType buffer[buffersize-1:buffersize-3]);
974
               numbitsused = 3;
975
               nextstate = Start;
976
            end
977
         tagged EndSequence :
978
            begin
979
               outfifo.enq(tagged EndOfSequence);
980
               nextstate = Start;
981
            end
982
         tagged EndStream :
983
            begin
984
               outfifo.enq(tagged EndOfStream);
985
               nextstate = Start;
986
            end
987
         tagged Filler :
988
            begin
989
               nextstate = Start;
990
            end
991
         tagged SliceData .step :
992
            begin
993
               case ( step )
994
                  0:
995
                  begin
996
                     if( shslice_type!=2 && shslice_type!=7 )
997
                        begin
998
                           $display( "ccl2SDmb_skip_run %0d", expgolomb_unsigned(buffer) );
999
                           outfifo.enq(tagged SDmb_skip_run truncate(expgolomb_unsigned(buffer)));
1000
                           tempreg <= truncate(expgolomb_unsigned(buffer));
1001
                           calcnc.nNupdate_pskip( truncate(expgolomb_unsigned(buffer)) );
1002
                           numbitsused = expgolomb_numbits(buffer);
1003
                           nextstate = tagged SliceData 1;
1004
                        end
1005
                     else
1006
                        nextstate = tagged SliceData 2;
1007
                  end
1008
                  1:
1009
                  begin
1010
                     if( tempreg>0 )
1011
                        begin
1012
                           currMbAddr <= currMbAddr+1;//only because input assumed to comform to both baseline and main
1013
                           tempreg <= tempreg-1;
1014
                           nextstate = tagged SliceData 1;
1015
                        end
1016
                     else
1017
                        begin
1018
                           ////$display( "ccl2SDcurrMbAddr %0d", currMbAddr );
1019
                           ////outfifo.enq(SDcurrMbAddr currMbAddr);
1020
                           nextstate = tagged SliceData 2;
1021
                        end
1022
                  end
1023
                  2:
1024
                  begin
1025
                     if( bufcount>8 || buffer[buffersize-1]!=1 || (buffer<<1)!=0 )
1026
                        begin
1027
                           calcnc.loadMb(currMbAddr);
1028
                           nextstate = tagged MacroblockLayer 0;
1029
                        end
1030
                     else
1031
                        nextstate = tagged SliceData 3;
1032
                  end
1033
                  3:
1034
                  begin
1035
                     currMbAddr <= currMbAddr+1;//only because input assumed to comform to both baseline and main
1036
                     if( bufcount>8 || buffer[buffersize-1]!=1 || (buffer<<1)!=0 )
1037
                        nextstate = tagged SliceData 0;
1038
                     else
1039
                        nextstate = Start;
1040
                  end
1041
                  default: $display( "ERROR EntropyDec: SliceData default step" );
1042
               endcase
1043
            end
1044
         tagged MacroblockLayer .step : //return to SliceData 3
1045
            begin
1046
               case ( step )
1047
                  0:
1048
                  begin
1049
                     $display( "ccl2SDMmb_type %0d", expgolomb_unsigned(buffer) );
1050
                     outfifo.enq(tagged SDMmbtype mbtype_convert(truncate(expgolomb_unsigned(buffer)), shslice_type) );
1051
                     outfifo_ITB.enq(tagged SDMmbtype mbtype_convert(truncate(expgolomb_unsigned(buffer)), shslice_type) );
1052
                     sdmmbtype <= mbtype_convert(truncate(expgolomb_unsigned(buffer)), shslice_type);
1053
                     numbitsused = expgolomb_numbits(buffer);
1054
                     if(mbtype_convert(truncate(expgolomb_unsigned(buffer)), shslice_type) == I_PCM)
1055
                        begin
1056
                           calcnc.nNupdate_ipcm();
1057
                           nextstate = tagged MacroblockLayer 1;
1058
                        end
1059
                     else
1060
                        nextstate = tagged MacroblockLayer 4;
1061
                  end
1062
                  1:
1063
                  begin
1064
                     tempreg <= 256;
1065
                     numbitsused = zeroExtend(bufcount[2:0]);
1066
                     nextstate = tagged MacroblockLayer 2;
1067
                  end
1068
                  2:
1069
                  begin
1070
                     if( tempreg>0 )
1071
                        begin
1072
                           Bit#(8) outputdata = buffer[buffersize-1:buffersize-8];
1073
                           $display( "ccl2SDMpcm_sample_luma %0d", outputdata );
1074
                           outfifo.enq(tagged SDMpcm_sample_luma outputdata);
1075
                           tempreg <= tempreg-1;
1076
                           numbitsused = 8;
1077
                           nextstate = tagged MacroblockLayer 2;
1078
                        end
1079
                     else
1080
                        begin
1081
                           tempreg <= 128;
1082
                           nextstate = tagged MacroblockLayer 3;
1083
                        end
1084
                  end
1085
                  3:
1086
                  begin
1087
                     if( tempreg>0 )
1088
                        begin
1089
                           Bit#(8) outputdata = buffer[buffersize-1:buffersize-8];
1090
                           $display( "ccl2SDMpcm_sample_chroma %0d", outputdata );
1091
                           outfifo.enq(tagged SDMpcm_sample_chroma outputdata);
1092
                           tempreg <= tempreg-1;
1093
                           numbitsused = 8;
1094
                           nextstate = tagged MacroblockLayer 3;
1095
                        end
1096
                     else
1097
                           nextstate = tagged SliceData 3;
1098
                  end
1099
                  4:
1100
                  begin
1101
                     if(sdmmbtype != I_NxN
1102
                        &&& mbPartPredMode(sdmmbtype,0) != Intra_16x16
1103
                        &&& numMbPart(sdmmbtype) == 4)
1104
                        nextstate = tagged SubMbPrediction 0;
1105
                     else
1106
                        nextstate = tagged MbPrediction 0;
1107
                  end
1108
                  5:
1109
                  begin
1110
                     if(mbPartPredMode(sdmmbtype,0) != Intra_16x16)
1111
                        begin
1112
                           $display( "ccl2SDMcoded_block_pattern %0d", expgolomb_coded_block_pattern(buffer,sdmmbtype) );
1113
                           ////outfifo.enq(SDMcoded_block_pattern expgolomb_coded_block_pattern(buffer,sdmmbtype));
1114
                           sdmcodedBlockPatternLuma <= expgolomb_coded_block_pattern(buffer,sdmmbtype)[3:0];
1115
                           sdmcodedBlockPatternChroma <= expgolomb_coded_block_pattern(buffer,sdmmbtype)[5:4];
1116
                           numbitsused = expgolomb_numbits(buffer);
1117
                        end
1118
                     else
1119
                        begin
1120
                           if(sdmmbtype matches tagged I_16x16 {intra16x16PredMode:.tempv1, codedBlockPatternChroma:.tempv2, codedBlockPatternLuma:.tempv3})
1121
                              begin
1122
                                 sdmcodedBlockPatternLuma <= {tempv3,tempv3,tempv3,tempv3};
1123
                                 sdmcodedBlockPatternChroma <= tempv2;
1124
                              end
1125
                           else
1126
                              $display( "ERROR EntropyDec: MacroblockLayer 5 sdmmbtype not I_16x16" );
1127
                        end
1128
                     nextstate = tagged MacroblockLayer 6;
1129
                  end
1130
                  6:
1131
                  begin
1132
                     if(sdmcodedBlockPatternLuma > 0
1133
                        || sdmcodedBlockPatternChroma > 0
1134
                        || mbPartPredMode(sdmmbtype,0) == Intra_16x16)
1135
                        begin
1136
                           tempint = unpack(expgolomb_signed(buffer));
1137
                           $display( "ccl2SDMmb_qp_delta %0d", tempint );
1138
                           outfifo_ITB.enq(tagged SDMmb_qp_delta truncate(expgolomb_signed(buffer)));
1139
                           numbitsused = expgolomb_numbits(buffer);
1140
                        end
1141
                     residualChroma <= 0;
1142
                     temp5bit <= 0;
1143
                     maxNumCoeff <= 16;
1144
                     nextstate = tagged ResidualBlock 0;
1145
                  end
1146
                  default: $display( "ERROR EntropyDec: MacroblockLayer default step" );
1147
               endcase
1148
            end
1149
         tagged MbPrediction .step : //return to tagged MacroblockLayer 5
1150
            begin
1151
               case ( step )
1152
                  0:
1153
                  begin
1154
                     if(mbPartPredMode(sdmmbtype,0) == Intra_16x16)
1155
                        begin
1156
                           $display( "ccl2SDMMintra_chroma_pred_mode %0d", expgolomb_unsigned(buffer) );
1157
                           outfifo.enq(tagged SDMMintra_chroma_pred_mode truncate(expgolomb_unsigned(buffer)));
1158
                           numbitsused = expgolomb_numbits(buffer);
1159
                           nextstate = tagged MacroblockLayer 5;
1160
                        end
1161
                     else if(mbPartPredMode(sdmmbtype,0) == Intra_4x4)
1162
                        begin
1163
                           temp5bit <= 16;
1164
                           nextstate = tagged MbPrediction 1;
1165
                        end
1166
                     else if(num_ref_idx_l0_active_minus1 > 0)
1167
                        begin
1168
                           temp3bit0 <= numMbPart(sdmmbtype);
1169
                           nextstate = tagged MbPrediction 2;
1170
                        end
1171
                     else
1172
                        begin
1173
                           temp3bit0 <= numMbPart(sdmmbtype);
1174
                           nextstate = tagged MbPrediction 3;
1175
                        end
1176
                  end
1177
                  1:
1178
                  begin
1179
                     if(temp5bit == 0)
1180
                        begin
1181
                           $display( "ccl2SDMMintra_chroma_pred_mode %0d", expgolomb_unsigned(buffer) );
1182
                           outfifo.enq(tagged SDMMintra_chroma_pred_mode truncate(expgolomb_unsigned(buffer)));
1183
                           numbitsused = expgolomb_numbits(buffer);
1184
                           nextstate = tagged MacroblockLayer 5;
1185
                        end
1186
                     else
1187
                        begin
1188
                           ////$display( "ccl2SDMMprev_intra4x4_pred_mode_flag %0d", buffer[buffersize-1] );
1189
                           if(buffer[buffersize-1] == 0)
1190
                              begin
1191
                                 Bit#(4) tttt = buffer[buffersize-1:buffersize-4];
1192
                                 $display( "ccl2SDMMrem_intra4x4_pred_mode %0d", tttt );
1193
                                 outfifo.enq(tagged SDMMrem_intra4x4_pred_mode tttt);
1194
                                 numbitsused = 4;
1195
                              end
1196
                           else
1197
                              begin
1198
                                 outfifo.enq(tagged SDMMrem_intra4x4_pred_mode 4'b1000);
1199
                                 numbitsused = 1;
1200
                              end
1201
                           temp5bit <= temp5bit-1;
1202
                           nextstate = tagged MbPrediction 1;
1203
                        end
1204
                  end
1205
                  2:
1206
                  begin
1207
                     if(num_ref_idx_l0_active_minus1 == 1)
1208
                        begin
1209
                           $display( "ccl2SDMMref_idx_l0 %0d", 1-buffer[buffersize-1] );
1210
                           outfifo.enq(tagged SDMMref_idx_l0 zeroExtend(1-buffer[buffersize-1]));
1211
                           numbitsused = 1;
1212
                        end
1213
                     else
1214
                        begin
1215
                           $display( "ccl2SDMMref_idx_l0 %0d", expgolomb_unsigned(buffer) );
1216
                           outfifo.enq(tagged SDMMref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1217
                           numbitsused = expgolomb_numbits(buffer);
1218
                        end
1219
                     if(temp3bit0 == 1)
1220
                        begin
1221
                           temp3bit0 <= numMbPart(sdmmbtype);
1222
                           nextstate = tagged MbPrediction 3;
1223
                        end
1224
                     else
1225
                        begin
1226
                           temp3bit0 <= temp3bit0-1;
1227
                           nextstate = tagged MbPrediction 2;
1228
                        end
1229
                  end
1230
                  3:
1231
                  begin
1232
                     tempint = unpack(expgolomb_signed(buffer));
1233
                     $display( "ccl2SDMMmvd_l0 %0d", tempint );
1234
                     outfifo.enq(tagged SDMMmvd_l0 truncate(expgolomb_signed(buffer)));
1235
                     numbitsused = expgolomb_numbits(buffer);
1236
                     nextstate = tagged MbPrediction 4;
1237
                  end
1238
                  4:
1239
                  begin
1240
                     tempint = unpack(expgolomb_signed(buffer));
1241
                     $display( "ccl2SDMMmvd_l0 %0d", tempint );
1242
                     outfifo.enq(tagged SDMMmvd_l0 truncate(expgolomb_signed(buffer)));
1243
                     numbitsused = expgolomb_numbits(buffer);
1244
                     temp3bit0 <= temp3bit0-1;
1245
                     if(temp3bit0 == 1)
1246
                        nextstate = tagged MacroblockLayer 5;
1247
                     else
1248
                        nextstate = tagged MbPrediction 3;
1249
                  end
1250
                  default: $display( "ERROR EntropyDec: MbPrediction default step" );
1251
               endcase
1252
            end
1253
         tagged SubMbPrediction .step : //return to MacroblockLayer 5
1254
            begin
1255
               case ( step )
1256
                  0:
1257
                  begin
1258
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1259
                     outfifo.enq(tagged SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1260
                     temp3bit0 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1261
                     numbitsused = expgolomb_numbits(buffer);
1262
                     nextstate = tagged SubMbPrediction 1;
1263
                  end
1264
                  1:
1265
                  begin
1266
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1267
                     outfifo.enq(tagged SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1268
                     temp3bit1 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1269
                     numbitsused = expgolomb_numbits(buffer);
1270
                     nextstate = tagged SubMbPrediction 2;
1271
                  end
1272
                  2:
1273
                  begin
1274
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1275
                     outfifo.enq(tagged SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1276
                     temp3bit2 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1277
                     numbitsused = expgolomb_numbits(buffer);
1278
                     nextstate = tagged SubMbPrediction 3;
1279
                  end
1280
                  3:
1281
                  begin
1282
                     $display( "ccl2SDMSsub_mb_type %0d", expgolomb_unsigned(buffer) );
1283
                     outfifo.enq(tagged SDMSsub_mb_type truncate(expgolomb_unsigned(buffer)));
1284
                     temp3bit3 <= numSubMbPart(truncate(expgolomb_unsigned(buffer)));
1285
                     numbitsused = expgolomb_numbits(buffer);
1286
                     if(num_ref_idx_l0_active_minus1 > 0
1287
                              && sdmmbtype != P_8x8ref0)
1288
                        nextstate = tagged SubMbPrediction 4;
1289
                     else
1290
                        nextstate = tagged SubMbPrediction 8;
1291
                  end
1292
                  4:
1293
                  begin
1294
                     if(num_ref_idx_l0_active_minus1 == 1)
1295
                        begin
1296
                           $display( "ccl2SDMSref_idx_l0 %0d", 1-buffer[buffersize-1] );
1297
                           outfifo.enq(tagged SDMSref_idx_l0 zeroExtend(1-buffer[buffersize-1]));
1298
                           numbitsused = 1;
1299
                        end
1300
                     else
1301
                        begin
1302
                           $display( "ccl2SDMSref_idx_l0 %0d", expgolomb_unsigned(buffer) );
1303
                           outfifo.enq(tagged SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1304
                           numbitsused = expgolomb_numbits(buffer);
1305
                        end
1306
                     nextstate = tagged SubMbPrediction 5;
1307
                  end
1308
                  5:
1309
                  begin
1310
                     if(num_ref_idx_l0_active_minus1 == 1)
1311
                        begin
1312
                           $display( "ccl2SDMSref_idx_l0 %0d", 1-buffer[buffersize-1] );
1313
                           outfifo.enq(tagged SDMSref_idx_l0 zeroExtend(1-buffer[buffersize-1]));
1314
                           numbitsused = 1;
1315
                        end
1316
                     else
1317
                        begin
1318
                           $display( "ccl2SDMSref_idx_l0 %0d", expgolomb_unsigned(buffer) );
1319
                           outfifo.enq(tagged SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1320
                           numbitsused = expgolomb_numbits(buffer);
1321
                        end
1322
                     nextstate = tagged SubMbPrediction 6;
1323
                  end
1324
                  6:
1325
                  begin
1326
                     if(num_ref_idx_l0_active_minus1 == 1)
1327
                        begin
1328
                           $display( "ccl2SDMSref_idx_l0 %0d", 1-buffer[buffersize-1] );
1329
                           outfifo.enq(tagged SDMSref_idx_l0 zeroExtend(1-buffer[buffersize-1]));
1330
                           numbitsused = 1;
1331
                        end
1332
                     else
1333
                        begin
1334
                           $display( "ccl2SDMSref_idx_l0 %0d", expgolomb_unsigned(buffer) );
1335
                           outfifo.enq(tagged SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1336
                           numbitsused = expgolomb_numbits(buffer);
1337
                        end
1338
                     nextstate = tagged SubMbPrediction 7;
1339
                  end
1340
                  7:
1341
                  begin
1342
                     if(num_ref_idx_l0_active_minus1 == 1)
1343
                        begin
1344
                           $display( "ccl2SDMSref_idx_l0 %0d", 1-buffer[buffersize-1] );
1345
                           outfifo.enq(tagged SDMSref_idx_l0 zeroExtend(1-buffer[buffersize-1]));
1346
                           numbitsused = 1;
1347
                        end
1348
                     else
1349
                        begin
1350
                           $display( "ccl2SDMSref_idx_l0 %0d", expgolomb_unsigned(buffer) );
1351
                           outfifo.enq(tagged SDMSref_idx_l0 truncate(expgolomb_unsigned(buffer)));
1352
                           numbitsused = expgolomb_numbits(buffer);
1353
                        end
1354
                     nextstate = tagged SubMbPrediction 8;
1355
                  end
1356
                  8:
1357
                  begin
1358
                     tempint = unpack(expgolomb_signed(buffer));
1359
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1360
                     outfifo.enq(tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1361
                     numbitsused = expgolomb_numbits(buffer);
1362
                     nextstate = tagged SubMbPrediction 9;
1363
                  end
1364
                  9:
1365
                  begin
1366
                     tempint = unpack(expgolomb_signed(buffer));
1367
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1368
                     outfifo.enq(tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1369
                     numbitsused = expgolomb_numbits(buffer);
1370
                     temp3bit0 <= temp3bit0-1;
1371
                     if(temp3bit0 == 1)
1372
                        nextstate = tagged SubMbPrediction 10;
1373
                     else
1374
                        nextstate = tagged SubMbPrediction 8;
1375
                  end
1376
                  10:
1377
                  begin
1378
                     tempint = unpack(expgolomb_signed(buffer));
1379
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1380
                     outfifo.enq(tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1381
                     numbitsused = expgolomb_numbits(buffer);
1382
                     nextstate = tagged SubMbPrediction 11;
1383
                  end
1384
                  11:
1385
                  begin
1386
                     tempint = unpack(expgolomb_signed(buffer));
1387
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1388
                     outfifo.enq(tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1389
                     numbitsused = expgolomb_numbits(buffer);
1390
                     temp3bit1 <= temp3bit1-1;
1391
                     if(temp3bit1 == 1)
1392
                        nextstate = tagged SubMbPrediction 12;
1393
                     else
1394
                        nextstate = tagged SubMbPrediction 10;
1395
                  end
1396
                  12:
1397
                  begin
1398
                     tempint = unpack(expgolomb_signed(buffer));
1399
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1400
                     outfifo.enq(tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1401
                     numbitsused = expgolomb_numbits(buffer);
1402
                     nextstate = tagged SubMbPrediction 13;
1403
                  end
1404
                  13:
1405
                  begin
1406
                     tempint = unpack(expgolomb_signed(buffer));
1407
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1408
                     outfifo.enq(tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1409
                     numbitsused = expgolomb_numbits(buffer);
1410
                     temp3bit2 <= temp3bit2-1;
1411
                     if(temp3bit2 == 1)
1412
                        nextstate = tagged SubMbPrediction 14;
1413
                     else
1414
                        nextstate = tagged SubMbPrediction 12;
1415
                  end
1416
                  14:
1417
                  begin
1418
                     tempint = unpack(expgolomb_signed(buffer));
1419
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1420
                     outfifo.enq(tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1421
                     numbitsused = expgolomb_numbits(buffer);
1422
                     nextstate = tagged SubMbPrediction 15;
1423
                  end
1424
                  15:
1425
                  begin
1426
                     tempint = unpack(expgolomb_signed(buffer));
1427
                     $display( "ccl2SDMSmvd_l0 %0d", tempint );
1428
                     outfifo.enq(tagged SDMSmvd_l0 truncate(expgolomb_signed(buffer)));
1429
                     numbitsused = expgolomb_numbits(buffer);
1430
                     temp3bit3 <= temp3bit3-1;
1431
                     if(temp3bit3 == 1)
1432
                        nextstate = tagged MacroblockLayer 5;
1433
                     else
1434
                        nextstate = tagged SubMbPrediction 14;
1435
                  end
1436
                  default: $display( "ERROR EntropyDec: SubMbPrediction default step" );
1437
               endcase
1438
            end
1439
         tagged ResidualBlock .step : //if(residualChroma==0) return to Residual 1;   else if(maxNumCoeff==4) return to Residual 3;   else return to Residual 5
1440
            begin//don't modify maxNumCoeff, residualChroma, and increment temp5bit on return
1441
               case ( step )
1442
                  0:
1443
                  begin
1444
                     cavlcFIFO.clear();
1445
                     if(maxNumCoeff != 4)
1446
                        begin
1447
                           if(residualChroma == 0)
1448
                              tempreg <= zeroExtend(calcnc.nCcalc_luma(truncate(temp5bit)));
1449
                           else
1450
                              tempreg <= zeroExtend(calcnc.nCcalc_chroma(truncate(temp5bit)));
1451
                        end
1452
                     else
1453
                        tempreg <= zeroExtend(6'b111111);
1454
                     if(mbPartPredMode(sdmmbtype,0)==Intra_16x16 && maxNumCoeff==16)
1455
                        nextstate = tagged ResidualBlock 1;
1456
                     else if(residualChroma==0 && (sdmcodedBlockPatternLuma & (1 << zeroExtend(temp5bit[3:2])))==0)
1457
                        begin
1458
                           calcnc.nNupdate_luma(truncate(temp5bit),0);
1459
                           outfifo_ITB.enq(tagged SDMRcoeffLevelZeros maxNumCoeff);
1460
                           nextstate = tagged ResidualBlock 5;
1461
                        end
1462
                     else if(residualChroma==1 && maxNumCoeff==4 && (sdmcodedBlockPatternChroma & 3)==0)
1463
                        begin
1464
                           outfifo_ITB.enq(tagged SDMRcoeffLevelZeros 4);
1465
                           nextstate = tagged ResidualBlock 5;
1466
                        end
1467
                     else if(residualChroma==1 && maxNumCoeff!=4 && (sdmcodedBlockPatternChroma & 2)==0)
1468
                        begin
1469
                           calcnc.nNupdate_chroma(truncate(temp5bit),0);
1470
                           outfifo_ITB.enq(tagged SDMRcoeffLevelZeros 15);
1471
                           nextstate = tagged ResidualBlock 5;
1472
                        end
1473
                     else
1474
                        nextstate = tagged ResidualBlock 1;
1475
                     //$display( "TRACE EntropyDec: ResidualBlock 0 temp5bit = %0d", temp5bit);
1476
                  end
1477
                  1:
1478
                  begin
1479
                     Bit#(2) trailingOnesTemp = 0;
1480
                     Bit#(5) totalCoeffTemp = 0;
1481
                     {trailingOnesTemp,totalCoeffTemp,numbitsused} = cavlc_coeff_token( buffer, truncate(tempreg) );
1482
                     temp3bit0 <= zeroExtend(trailingOnesTemp);//trailingOnes
1483
                     totalCoeff <= totalCoeffTemp;
1484
                     if(residualChroma == 0 && !(mbPartPredMode(sdmmbtype,0)==Intra_16x16 && maxNumCoeff==16))
1485
                        calcnc.nNupdate_luma(truncate(temp5bit),totalCoeffTemp);
1486
                     else if(residualChroma == 1 && maxNumCoeff != 4)
1487
                        calcnc.nNupdate_chroma(truncate(temp5bit),totalCoeffTemp);
1488
                     temp5bit2 <= 0;//i
1489
                     tempreg <= 0;//levelCode temp
1490
                     if(totalCoeffTemp > 10 && trailingOnesTemp < 3)
1491
                        temp3bit1 <= 1;//suffixLength
1492
                     else
1493
                        temp3bit1 <= 0;//suffixLength
1494
                     nextstate = tagged ResidualBlock 2;
1495
                     //$display( "TRACE EntropyDec: ResidualBlock 1 nC = %0d", tempreg);
1496
                     $display( "ccl2SDMRtotal_coeff %0d", totalCoeffTemp );
1497
                     $display( "ccl2SDMRtrailing_ones %0d", trailingOnesTemp );
1498
                  end
1499
                  2:
1500
                  begin
1501
                     if( totalCoeff != 0 )
1502
                        begin
1503
                           if(temp5bit2 < zeroExtend(temp3bit0))
1504
                              begin
1505
                                 if(buffer[buffersize-1] == 1)
1506
                                    cavlcFIFO.enq(-1);
1507
                                 else
1508
                                    cavlcFIFO.enq(1);
1509
                                 numbitsused = 1;
1510
                              end
1511
                           else
1512
                              begin
1513
                                 Bit#(32) buffertempshow = buffer[buffersize-1:buffersize-32];
1514
                                 Bit#(3) suffixLength = temp3bit1;
1515
                                 Bit#(4) levelSuffixSize = zeroExtend(suffixLength);
1516
                                 Bit#(4) level_prefix = cavlc_level_prefix( buffer );
1517
                                 Bit#(5) temp_level_prefix = zeroExtend(level_prefix);
1518
                                 Bit#(28) tempbuffer = buffer[buffersize-1:buffersize-28] << zeroExtend(temp_level_prefix+1);
1519
                                 Bit#(14) levelCode = zeroExtend(level_prefix) << zeroExtend(suffixLength);
1520
                                 if(level_prefix == 14 && suffixLength == 0)
1521
                                    levelSuffixSize = 4;
1522
                                 else if(level_prefix == 15)
1523
                                    levelSuffixSize = 12;
1524
                                 levelCode = levelCode + zeroExtend(tempbuffer[27:16] >> (12-zeroExtend(levelSuffixSize)));//level_suffix
1525
                                 if(level_prefix == 15 && suffixLength == 0)
1526
                                    levelCode = levelCode + 15;
1527
                                 if(temp5bit2 == zeroExtend(temp3bit0) && temp3bit0 < 3)
1528
                                    levelCode = levelCode + 2;
1529
                                 if(suffixLength == 0)
1530
                                    suffixLength = 1;
1531
                                 if( suffixLength < 6 && ((levelCode+2) >> 1) > (3 << zeroExtend(suffixLength-1)) )
1532
                                    suffixLength = suffixLength+1;
1533
                                 if(levelCode[0] == 0)
1534
                                    cavlcFIFO.enq(truncate((levelCode+2) >> 1));
1535
                                 else
1536
                                    cavlcFIFO.enq(truncate((~levelCode) >> 1));
1537
                                 if(levelCode[0] == 0)//////////////////////////////////////////////////
1538
                                    begin
1539
                                       tempint = signExtend(unpack((levelCode+2) >> 1));
1540
                                       //$display( "TRACE EntropyDec: temp level %0d", tempint );
1541
                                    end
1542
                                 else
1543
                                    begin
1544
                                       Bit#(13) tempinttemp = truncate((~levelCode) >> 1);
1545
                                       tempint = signExtend(unpack(tempinttemp));
1546
                                       //$display( "TRACE EntropyDec: temp level %0d", tempint );
1547
                                    end///////////////////////////////////////////////////////////////////////
1548
                                 temp3bit1 <= suffixLength;
1549
                                 numbitsused = zeroExtend(level_prefix)+1+zeroExtend(levelSuffixSize);
1550
                              end
1551
                        end
1552
                     if( totalCoeff==0 || temp5bit2+1==totalCoeff )
1553
                        begin
1554
                           temp5bit2 <= 0;
1555
                           zerosLeft <= 0;
1556
                           if(totalCoeff < maxNumCoeff)
1557
                              nextstate = tagged ResidualBlock 3;
1558
                           else
1559
                              nextstate = tagged ResidualBlock 5;
1560
                        end
1561
                     else
1562
                        begin
1563
                           temp5bit2 <= temp5bit2 + 1;
1564
                           nextstate = tagged ResidualBlock 2;
1565
                        end
1566
                  end
1567
                  3:
1568
                  begin
1569
                     Bit#(4) tempZerosLeft;
1570
                     if(totalCoeff > 0)
1571
                        begin
1572
                           {tempZerosLeft,numbitsused} = cavlc_total_zeros( buffer, truncate(totalCoeff), maxNumCoeff);
1573
                           $display( "ccl2SDMRtotal_zeros %0d", tempZerosLeft );//////////////////////////////////////
1574
                        end
1575
                     else
1576
                        tempZerosLeft = 0;
1577
                     zerosLeft <= tempZerosLeft;
1578
                     if(maxNumCoeff - totalCoeff - zeroExtend(tempZerosLeft) > 0)
1579
                        begin
1580
                           $display( "ccl2SDMRcoeffLevelZeros %0d", maxNumCoeff - totalCoeff - zeroExtend(tempZerosLeft) );
1581
                           outfifo_ITB.enq(tagged SDMRcoeffLevelZeros (maxNumCoeff - totalCoeff - zeroExtend(tempZerosLeft)));
1582
                        end
1583
                     nextstate = tagged ResidualBlock 5;
1584
                  end
1585
                  5:
1586
                  begin
1587
                     if( totalCoeff > 0 )
1588
                        begin
1589
                           tempint = signExtend(unpack(cavlcFIFO.first()));
1590
                           $display( "ccl2SDMRcoeffLevel %0d", tempint );
1591
                           if( zerosLeft > 0 )
1592
                              begin
1593
                                 Bit#(4) run_before = 0;
1594
                                 if( totalCoeff > 1 )
1595
                                    {run_before,numbitsused} = cavlc_run_before( buffer, zerosLeft);
1596
                                 else
1597
                                    run_before = zerosLeft;
1598
                                 zerosLeft <= zerosLeft - run_before;
1599
                                 outfifo_ITB.enq(tagged SDMRcoeffLevelPlusZeros {level:cavlcFIFO.first(),zeros:zeroExtend(run_before)});
1600
                                 if( run_before > 0 )
1601
                                    $display( "ccl2SDMRcoeffLevelZeros %0d", run_before );
1602
                              end
1603
                           else
1604
                              outfifo_ITB.enq(tagged SDMRcoeffLevelPlusZeros {level:cavlcFIFO.first(),zeros:0});
1605
                           cavlcFIFO.deq();
1606
                           totalCoeff <= totalCoeff-1;
1607
                        end
1608
                     if( totalCoeff <= 1 )
1609
                        begin
1610
                           if(residualChroma==0)
1611
                              begin
1612
                                 nextstate = tagged ResidualBlock 0;
1613
                                 if(mbPartPredMode(sdmmbtype,0)==Intra_16x16 && maxNumCoeff==16)
1614
                                    maxNumCoeff <= 15;
1615
                                 else if(temp5bit==15)
1616
                                    begin
1617
                                       temp5bit <= 0;
1618
                                       maxNumCoeff <= 4;
1619
                                       residualChroma <= 1;
1620
                                    end
1621
                                 else
1622
                                    temp5bit <= temp5bit+1;
1623
                              end
1624
                           else if(maxNumCoeff==4)
1625
                              begin
1626
                                 nextstate = tagged ResidualBlock 0;
1627
                                 if(temp5bit==1)
1628
                                    begin
1629
                                       temp5bit <= 0;
1630
                                       maxNumCoeff <= 15;
1631
                                    end
1632
                                 else
1633
                                    temp5bit <= temp5bit+1;
1634
                              end
1635
                           else
1636
                              begin
1637
                                 if(temp5bit==7)
1638
                                    begin
1639
                                       temp5bit <= 0;
1640
                                       nextstate = tagged SliceData 3;
1641
                                    end
1642
                                 else
1643
                                    begin
1644
                                       nextstate = tagged ResidualBlock 0;
1645
                                       temp5bit <= temp5bit+1;
1646
                                    end
1647
                              end
1648
                        end
1649
                     else
1650
                        nextstate = tagged ResidualBlock 5;
1651
                  end
1652
                  default: $display( "ERROR EntropyDec: ResidualBlock default step" );
1653
               endcase
1654
            end
1655
      endcase
1656
 
1657
      if(numbitsused+1 > bufcount)
1658
         begin
1659
            $display( "ERROR EntropyDec: not enough bits in buffer" );
1660
            nextstate = Start;
1661
         end
1662
      buffer <= buffer << zeroExtend(numbitsused);
1663
      bufcount <= bufcount-numbitsused;
1664
      state <= nextstate;
1665
 
1666
   endrule
1667
 
1668
 
1669
   interface Put ioin  = fifoToPut(infifo);
1670
   interface Get ioout = fifoToGet(outfifo);
1671
   interface Get ioout_InverseTrans = fifoToGet(outfifo_ITB);
1672
 
1673
   interface mem_client = calcnc.mem_client;
1674
 
1675
endmodule
1676
 
1677
endpackage

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.