OpenCores
URL https://opencores.org/ocsvn/socgen/socgen/trunk

Subversion Repositories socgen

[/] [socgen/] [trunk/] [tools/] [regtool/] [gen_registers] - Blame information for rev 135

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 119 jt_eaton
eval 'exec `which perl` -S $0 ${1+"$@"}'
2
   if 0;
3 135 jt_eaton
#/****************************************************************************/
4
#/*                                                                          */
5
#/*   SOCGEN Design for Reuse toolset                                        */
6
#/*                                                                          */
7
#/*   Version 1.0.0                                                          */
8
#/*                                                                          */
9
#/*   Author(s):                                                             */
10
#/*      - John Eaton, z3qmtr45@gmail.com                                    */
11
#/*                                                                          */
12
#/****************************************************************************/
13
#/*                                                                          */
14
#/*                                                                          */
15
#/*             Copyright 2016 John T Eaton                                  */
16
#/*                                                                          */
17
#/* Licensed under the Apache License, Version 2.0 (the "License");          */
18
#/* you may not use this file except in compliance with the License.         */
19
#/* You may obtain a copy of the License at                                  */
20
#/*                                                                          */
21
#/*    http://www.apache.org/licenses/LICENSE-2.0                            */
22
#/*                                                                          */
23
#/* Unless required by applicable law or agreed to in writing, software      */
24
#/* distributed under the License is distributed on an "AS IS" BASIS,        */
25
#/* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. */
26
#/* See the License for the specific language governing permissions and      */
27
#/* limitations under the License.                                           */
28
#/*                                                                          */
29
#/*                                                                          */
30
#/****************************************************************************/
31 119 jt_eaton
 
32
 
33
############################################################################
34
# General PERL config
35
############################################################################
36
use Getopt::Long;
37
use English;
38
use File::Basename;
39
use Cwd;
40
use XML::LibXML;
41
use lib './tools';
42
use sys::lib;
43
use yp::lib;
44
 
45
 
46
$OUTPUT_AUTOFLUSH = 1; # set autoflush of stdout to TRUE.
47
 
48
 
49
############################################################################
50
### Process the options
51
############################################################################
52
 
53
Getopt::Long::config("require_order", "prefix=-");
54
GetOptions("h",
55 128 jt_eaton
           "envidentifier=s" => \$envidentifier,
56 119 jt_eaton
           "prefix=s" => \$prefix,
57
           "vendor=s" => \$vendor,
58 131 jt_eaton
           "library=s" => \$library,
59 119 jt_eaton
           "version=s" => \$version,
60
           "component=s" => \$component,
61
           "dest_dir=s" => \$dest_dir,
62
           "bus_intf=s" => \$bus_intf
63
) || die "(use '$program_name -h' for help)";
64
 
65
 
66
##############################################################################
67
## Help option
68
##############################################################################
69
if (  $opt_h )
70
   {
71 131 jt_eaton
   print "\n build_registers  -envidentifier {sim|syn} -prefix /work -library library_name   -component comp_name  -version version_name  -bus_intf bus_interface  -dest_dir dest_dir";
72 119 jt_eaton
   print "\n";
73
   exit 1;
74
   }
75
 
76
 
77
##############################################################################
78
##
79
##############################################################################
80
 
81 128 jt_eaton
my $parser = XML::LibXML->new();
82 119 jt_eaton
 
83
 
84
$home = cwd();
85
 
86 128 jt_eaton
 
87 131 jt_eaton
my $socgen_file               = $parser->parse_file(yp::lib::find_componentConfiguration($vendor,$library,$component));
88 130 jt_eaton
my $ip_name_base_macro       = $socgen_file->findnodes("//socgen:componentConfiguration/socgen:ip_name_base_macro/text()")->to_literal;
89 128 jt_eaton
 
90
 
91
 
92
 
93
 
94
 
95
 
96
 
97 119 jt_eaton
my $variant;
98
 if($version)       {$variant   = "${component}_${version}";}
99
 else               {$variant   = "${component}";}
100
 
101 131 jt_eaton
my $lib_comp_sep    = yp::lib::find_lib_comp_sep($vendor,$library,$component);
102
my $comp_xml_sep    = yp::lib::find_comp_xml_sep($vendor,$library,$component,$version);
103 119 jt_eaton
 
104
#############################################################################
105
##
106
##
107
#############################################################################
108
 
109 131 jt_eaton
print "  Building  RTL Registers  for  $prefix $vendor $library  $component  $variant in $dest_dir\n" ;
110 119 jt_eaton
 
111
 
112
 
113 131 jt_eaton
my $path  = "${home}${prefix}/${vendor}__${library}${lib_comp_sep}${component}${comp_xml_sep}/${dest_dir}";
114 119 jt_eaton
mkdir $path,0755             unless( -e $path );
115
 
116
 
117
 
118
my $name;
119 131 jt_eaton
 
120 119 jt_eaton
my $memmap_name;
121
my $memmap_base;
122
my $addblk_name;
123
my $addblk_range;
124
my $addblk_numrange;
125
my $addblk_numaddbits;
126
my $addblk_width;
127
my $byte_size;
128
my $reg_dim;
129
my $memMap;
130
 
131
 
132
my $memmap_name;
133
my $memmap_base;
134
my $memmap_numbase;
135
my $memmap_size;
136
my $memmap_type;
137
my $parmap_name;
138
 
139
my $reg_offset;
140
my $reg_numoffset;
141
my $reg_dimbits;
142
my $reg_create;
143
my $reg_has_read;
144
my $reg_has_write;
145
my $opt_bigendian;
146
 
147
my  $reg_numdim;
148
 
149
my $max_dim = 1;
150
my $max_has_read = 0;
151
my $max_has_write = 0;
152
my $max_has_create = 0;
153
 
154
my $pad;
155
my $sys_byte_lanes;
156
 
157
 
158
@registers = ();
159
 
160
#/**********************************************************************/
161
#/*                                                                    */
162
#/* Parse register block info from ip-xact file                        */
163
#/*                                                                    */
164
#/*                                                                    */
165
#/**********************************************************************/
166
 
167
 
168
 
169 128 jt_eaton
 
170 131 jt_eaton
my $spirit_component_file    = $parser->parse_file(yp::lib::find_ipxact_component($vendor,$library,$component,$version));
171 119 jt_eaton
 
172 135 jt_eaton
   $name     = $spirit_component_file->findnodes('//ipxact:component/ipxact:name/text()')->to_literal ;
173
   $version  = $spirit_component_file->findnodes('//ipxact:component/ipxact:version/text()')->to_literal ;
174
   $vendor   = $spirit_component_file->findnodes('//ipxact:component/ipxact:vendor/text()')->to_literal ;
175
   $library  = $spirit_component_file->findnodes('//ipxact:component/ipxact:library/text()')->to_literal ;
176 119 jt_eaton
 
177 135 jt_eaton
foreach my $bus_iface ($spirit_component_file->findnodes("//ipxact:busInterface[ipxact:name/text() = '$bus_intf']/ipxact:slave"))
178 119 jt_eaton
   {
179 135 jt_eaton
   $BI_name         = $bus_iface->findnodes('../ipxact:name/text()')->to_literal ;
180
   $BI_endian       = $bus_iface->findnodes('../ipxact:endianness/text()')->to_literal ;
181
   $BI_width        = $bus_iface->findnodes('../ipxact:bitsInLau/text()')->to_literal ;
182
   $BI_xname        = $bus_iface->findnodes('../ipxact:abstractionTypes/ipxact:abstractionType/ipxact:abstractionRef/@name')->to_literal ;
183
   $memMap          = $bus_iface->findnodes('../ipxact:slave/ipxact:memoryMapRef/@ipxact:memoryMapRef')->to_literal ;
184 119 jt_eaton
   }
185
 
186
unless($BI_endian) {$BI_endian = "little";}
187
$byte_size         = int($BI_width) ;
188
 
189
 
190
 
191
 
192
 
193
 
194
 
195 135 jt_eaton
foreach my $comp_view ($spirit_component_file->findnodes("//ipxact:memoryMap[ipxact:name/text() = '$memMap']"))
196 119 jt_eaton
   {
197 135 jt_eaton
   $memmap_name  = $comp_view->findnodes('./ipxact:bank/ipxact:name/text()')->to_literal ;
198
   $memmap_base  = $comp_view->findnodes('./ipxact:bank/ipxact:baseAddress/text()')->to_literal ;
199
   $memmap_size  = $comp_view->findnodes('./ipxact:addressUnitBits/text()')->to_literal ;
200
   $memmap_type  = $comp_view->findnodes('./ipxact:bank/@ipxact:bankAlignment')->to_literal ;
201
   $parmap_name  = $comp_view->findnodes('./ipxact:name/text()')->to_literal ;
202 119 jt_eaton
 
203
 
204
 
205
   $memmap_numbase = hex($memmap_base);
206
 
207
   #/**********************************************************************/
208
   #/*                                                                    */
209
   #/* Print header, module name and start parameters                     */
210
   #/*                                                                    */
211
   #/*                                                                    */
212
   #/**********************************************************************/
213
 
214 131 jt_eaton
   my $outfile ="${home}${prefix}/${vendor}__${library}${lib_comp_sep}${component}${comp_xml_sep}/${dest_dir}/${name}_${version}_${memmap_name}";
215 119 jt_eaton
   open   OUTFILE,">$outfile" or die "unable to open $outfile";
216
 
217
   print  OUTFILE " /*********************************************/  \n";
218
   print  OUTFILE sprintf(" /* Vendor:       %24s    */  \n",$vendor);
219
   print  OUTFILE sprintf(" /* Library:      %24s    */  \n",$library);
220
   print  OUTFILE sprintf(" /* Component:    %24s    */  \n",$name);
221
   print  OUTFILE sprintf(" /* Version:      %24s    */  \n",$version);
222
   print  OUTFILE sprintf(" /* MemMap:       %24s    */  \n",$memmap_name);
223
   print  OUTFILE sprintf(" /* Base:         %24s    */  \n",$memmap_base);
224
   print  OUTFILE sprintf(" /* Type:         %24s    */  \n",$memmap_type);
225
 
226
 
227
 
228
 
229
   if($BI_endian eq "big" )
230
   {
231
   $opt_bigendian = 1;
232
   print  OUTFILE   " /* Endian:                            Big    */  \n";
233
   }
234
   else
235
 
236
   {
237
   print  OUTFILE   " /* Endian:                         Little    */  \n";
238
   $opt_bigendian = 0;
239
   }
240
 
241
   print  OUTFILE sprintf(" /*********************************************/  \n");
242
 
243
 
244 135 jt_eaton
   foreach my $comp_view ($spirit_component_file->findnodes("//ipxact:memoryMap[ipxact:name/text() = '$memMap']/ipxact:bank/ipxact:addressBlock/ipxact:name"))
245 119 jt_eaton
   {
246 135 jt_eaton
   $addblk_name    = $comp_view->findnodes('../ipxact:name/text()')->to_literal;
247
   $addblk_range   = $comp_view->findnodes('../ipxact:range/text()')->to_literal;
248
   $addblk_width   = $comp_view->findnodes('../ipxact:width/text()')->to_literal;
249 119 jt_eaton
 
250
 
251
 
252
   $addblk_numrange = hex($addblk_range);
253
   $addblk_numaddbits = log($addblk_numrange)/log(2);
254
 
255
   $sys_byte_lanes  = int( $addblk_width) / $byte_size ;
256
 
257
   if    ($sys_byte_lanes == 4 ) { $adr_base = 2;}
258
   elsif ($sys_byte_lanes == 2 ) { $adr_base = 1;}
259
   else                          { $adr_base = 0;}
260
 
261
 
262
   print  OUTFILE sprintf(" /* AddressBlock: %24s    */  \n",$addblk_name);
263
   print  OUTFILE sprintf(" /* NumBase:      %24s    */  \n",$memmap_numbase);
264
   print  OUTFILE sprintf(" /* Range:        %24s    */  \n",$addblk_range);
265
   print  OUTFILE sprintf(" /* NumRange:     %24s    */  \n",$addblk_numrange);
266
   print  OUTFILE sprintf(" /* NumAddBits:   %24s    */  \n",$addblk_numaddbits);
267
   print  OUTFILE sprintf(" /* Width:        %24s    */  \n",$addblk_width);
268
   print  OUTFILE sprintf(" /* Byte_lanes:   %24s    */  \n",$sys_byte_lanes);
269
   print  OUTFILE sprintf(" /* Byte_size:    %24s    */  \n",$byte_size);
270
   print  OUTFILE sprintf(" /*********************************************/  \n");
271
 
272
 
273 135 jt_eaton
   foreach my $reg_view ($spirit_component_file->findnodes("//ipxact:memoryMap[ipxact:name/text() = '$memMap']/ipxact:bank/ipxact:addressBlock[ipxact:name/text() = '$addblk_name']/ipxact:register/ipxact:name "))
274 119 jt_eaton
 
275
        {
276
        $reg_name    = $reg_view->findnodes('./text()')->to_literal ;
277 135 jt_eaton
        $reg_offset  = $reg_view->findnodes('../ipxact:addressOffset/text()')->to_literal ;
278
        $reg_dim     = $reg_view->findnodes('../ipxact:dim/text()')->to_literal ;
279
        $reg_size    = $reg_view->findnodes('../ipxact:size/text()')->to_literal ;
280
        $reg_access  = $reg_view->findnodes('../ipxact:access/text()')->to_literal ;
281 119 jt_eaton
        $reg_numoffset = hex($reg_offset) + $memmap_numbase;
282
        unless($reg_dim) {$reg_dim     = "0x1" ;}
283
        $reg_numdim         = hex($reg_dim);
284
 
285
        if($reg_numdim > $max_dim )  {$max_dim = $reg_numdim;}
286
 
287
        if($reg_numdim)
288
          {
289
          $reg_dimbits      = log($reg_numdim)/log(2);
290
          }
291
        else
292
          {
293
          $reg_dimbits    = 1;
294
          }
295
 
296
        if($reg_access eq "read-write")
297
         {
298
          $reg_has_read   = 1;
299
          $reg_has_write  = 1;
300
          if($reg_numdim)
301
            {
302
            if($reg_dimbits)     {$reg_create     = 0;}
303
            else                 {$reg_create     = 1;}
304
            }
305
          else
306
            {
307
            $reg_create     = 0;
308
            }
309
         }
310
 
311
 
312
 
313
 
314
 
315
 
316
        if($reg_access eq "read-only")
317
         {
318
          $reg_has_read   = 1;
319
          $reg_has_write  = 0;
320
          if($reg_numdim)
321
            {
322
            if($reg_dimbits)     {$reg_create     = 0;}
323
            else                 {$reg_create     = 1;}
324
            }
325
          else
326
            {
327
            $reg_create     = 0;
328
            }
329
 
330
         }
331
 
332
 
333
        if($reg_access eq "write-only")
334
         {
335
          $reg_has_read   = 0;
336
          $reg_has_write  = 1;
337
          if($reg_numdim)
338
            {
339
            if($reg_dimbits)     {$reg_create     = 0;}
340
            else                 {$reg_create     = 1;}
341
            }
342
          else
343
            {
344
            $reg_create     = 0;
345
            }
346
 
347
         }
348
 
349
 
350
        if($reg_access eq "write-strobe")
351
         {
352
          $reg_has_read   = 0;
353
          $reg_has_write  = 1;
354
          $reg_create     = 0;
355
         }
356
 
357
     if($reg_has_read){$max_has_read = 1;}
358
     if($reg_has_write){$max_has_write = 1;}
359
     if($reg_create)   {$max_has_create = 1;}
360
 
361
 
362
 
363
 
364
 
365
 
366
          print  OUTFILE sprintf(" /* Reg Name:       %22s    */  \n",$reg_name);
367
          print  OUTFILE sprintf(" /* Reg Offset:     %22s    */  \n",$reg_offset);
368
          print  OUTFILE sprintf(" /* Reg numOffset:  %22s    */  \n",$reg_numoffset);
369
          print  OUTFILE sprintf(" /* Reg size:       %22s    */  \n",$reg_size);
370
          print  OUTFILE sprintf(" /* Reg Dim:        %22s    */  \n",$reg_dim);
371
          print  OUTFILE sprintf(" /* Reg numDim:     %22s    */  \n",$reg_numdim);
372
          print  OUTFILE sprintf(" /* Reg DimBits:    %22s    */  \n",$reg_dimbits);
373
          print  OUTFILE sprintf(" /* Reg Create:     %22s    */  \n",$reg_create);
374
          print  OUTFILE sprintf(" /* Reg access:     %22s    */  \n",$reg_access);
375
          print  OUTFILE sprintf(" /* Reg has_read:   %22s    */  \n",$reg_has_read);
376
          print  OUTFILE sprintf(" /* Reg has_write:  %22s    */  \n",$reg_has_write);
377
          print  OUTFILE sprintf(" /*********************************************/  \n");
378
 
379
          push @registers , ":::${reg_name}:::${reg_numoffset}:::${reg_size}:::${reg_numdim}:::${reg_dimbits}:::${reg_create}:::${reg_access}:::${reg_has_read}:::${reg_has_write}:::";
380
 
381
        }
382
   }
383
 
384
   if($memmap_type eq "serial")    {     $memmap_numbase = $memmap_numbase + $addblk_numrange;     }
385
 
386
 
387
 
388
 
389
   }
390
 
391
 
392
 
393
 
394
          $num_add = log($max_dim)/log(2);
395
          print  OUTFILE sprintf(" /*********************************************/  \n");
396
          print  OUTFILE sprintf(" /* Max_dim:        %22s    */  \n",$max_dim);
397
          print  OUTFILE sprintf(" /* num_add:        %22s    */  \n",$num_add);
398
          print  OUTFILE sprintf(" /* mas_has_read:   %22s    */  \n",$max_has_read);
399
          print  OUTFILE sprintf(" /* mas_has_write:  %22s    */  \n",$max_has_write);
400
          print  OUTFILE sprintf(" /* mas_has_create: %22s    */  \n",$max_has_create);
401
          print  OUTFILE sprintf(" /*********************************************/  \n");
402
 
403
 
404
 
405
 
406
 
407
 
408
 
409
 
410
   print  OUTFILE     " /*********************************************/  \n";
411 128 jt_eaton
   print  OUTFILE "\n\nmodule `${ip_name_base_macro}`";
412 119 jt_eaton
   print  OUTFILE  uc(${memmap_name});
413
   print  OUTFILE "\n";
414 134 jt_eaton
   print  OUTFILE "#(  parameter UNSELECTED = {${byte_size}{1'b1}},\n";
415
   print  OUTFILE "    parameter UNMAPPED   = {${byte_size}{1'b0}}";
416 119 jt_eaton
 
417
 
418
 
419
 
420
 
421
 
422
 
423
 
424
     foreach $line (@registers)
425
        {
426
 
427
        $_ = $line;
428
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
429
          {
430
          my $t_name                = $1;
431
          my $t_numoffset           = $2;
432
          my $t_size                = $3;
433
          my $t_numdim              = $4;
434
          my $t_dimbits             = $5;
435
          my $t_create              = $6;
436
          my $t_access              = $7;
437
          my $t_has_read            = $8;
438
          my $t_has_write           = $9;
439
 
440
          if( $t_has_write eq "1" and   $t_create eq "1")
441
            {
442
            print  OUTFILE ",\n    parameter ";
443
            print  OUTFILE uc(${t_name});
444
            print  OUTFILE "_RST = ${t_size}'b0";
445
            }
446
 
447
         $pad = $byte_size -( int(${t_size}) % $byte_size )  ;
448
         if ( $pad == $byte_size ) { $pad = 0;}
449
 
450
 
451
 
452
        if($pad)
453
          {
454
          if( $t_has_read eq "1")
455
            {
456
            print  OUTFILE ",\n    parameter ";
457
            print  OUTFILE uc(${t_name});
458
            print  OUTFILE "_PAD = ${pad}'b0";
459
            }
460
 
461
       }
462
 
463
         }
464
       }
465
 
466
   print  OUTFILE ")\n ";
467
 
468
 
469
 
470
 
471
 
472
 
473
 
474
   #/**********************************************************************/
475
   #/*                                                                    */
476
   #/* Print io ports                                                     */
477
   #/*                                                                    */
478
   #/*                                                                    */
479
   #/**********************************************************************/
480
 
481
   print  OUTFILE "(\n";
482
   print  OUTFILE " input  wire             clk,\n";
483
   print  OUTFILE " input  wire             reset,\n";
484
   print  OUTFILE " input  wire             enable,\n";
485
   print  OUTFILE " input  wire             cs,\n";
486
   if($max_has_write){   print  OUTFILE " input  wire             wr,\n";}
487
   if($max_has_read) {print  OUTFILE " input  wire             rd,\n";}
488
   if($max_has_write) {print  OUTFILE " input  wire  [${addblk_width}-1:0]    wdata,\n";}
489
   if($max_has_read) {print  OUTFILE " output  reg  [${addblk_width}-1:0]    rdata,\n";}
490
   print  OUTFILE " input  wire  [${sys_byte_lanes}-1:0]    byte_lanes,\n";
491
   print  OUTFILE " input  wire  [${addblk_numaddbits}-1:${adr_base}]    addr";
492
 
493
   if($max_dim gt "1" )
494
     {
495
     print  OUTFILE " ,\n output  wire  [${num_add}-1:0]    addr_out";
496
     }
497
 
498
 
499
 
500
 
501
 
502
 
503
 
504
 
505
 
506
 
507
     foreach $line (@registers)
508
        {
509
        $_ = $line;
510
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
511
          {
512
          my $t_name                = $1;
513
          my $t_numoffset           = $2;
514
          my $t_size                = $3;
515
          my $t_numdim              = $4;
516
          my $t_dimbits             = $5;
517
          my $t_create              = $6;
518
          my $t_access              = $7;
519
          my $t_has_read            = $8;
520
          my $t_has_write           = $9;
521
 
522
        print  OUTFILE ",\n output  wire  ${t_name}_cs  ";
523
        print  OUTFILE ",\n output   reg  ${t_name}_dec  ";
524
 
525
        if($t_size == 1)
526
          {
527
          if( $t_has_read eq "1")
528
            {
529
            print  OUTFILE ",\n input  wire                     ${t_name}_rdata  ";
530
            }
531
 
532
          if( $t_has_write eq "1")
533
            {
534
            print  OUTFILE ",\n output   reg  ${t_name}_wr_0  ";
535
            if( $t_create eq "1")
536
              {
537
              print  OUTFILE ",\n output  reg                     $t_name  ";
538
              print  OUTFILE ",\n input  wire                     next_${t_name}  ";
539
              }
540
            else
541
              {
542
              print  OUTFILE ",\n output  reg                     ${t_name}_wdata  ";
543
              }
544
            }
545
          }
546
 
547
       else
548
          {
549
          if( $t_has_read eq "1")
550
            {
551
            print  OUTFILE ",\n input  wire  [${t_size}-1:0]    ${t_name}_rdata  ";
552
            }
553
 
554
          if( $t_has_write eq "1")
555
            {
556
            print  OUTFILE ",\n output   reg  ${t_name}_wr_0  ";
557
            if( $t_create eq "1")
558
              {
559
              print  OUTFILE ",\n output  reg  [${t_size}-1:0]    $t_name  ";
560
              print  OUTFILE ",\n input  wire  [${t_size}-1:0]    next_${t_name}  ";
561
              }
562
            else
563
              {
564
              print  OUTFILE ",\n output  reg  [${t_size}-1:0]    ${t_name}_wdata  ";
565
              }
566
            }
567
          }
568
 
569
 
570
        if( $t_has_write eq "1")
571
          {
572
          if($t_size > ${byte_size})        { print  OUTFILE ",\n output   reg  ${t_name}_wr_1  ";  }
573
          if($t_size > (${byte_size}*2))    { print  OUTFILE ",\n output   reg  ${t_name}_wr_2  ";  }
574
          if($t_size > (${byte_size}*3))    { print  OUTFILE ",\n output   reg  ${t_name}_wr_3  ";  }
575
          }
576
       }
577
     }
578
 
579
   print  OUTFILE "\n);\n\n\n";
580
 
581
 
582
 
583
 
584
 
585
 
586
 
587
 
588
 
589
 
590
 
591
 
592
 
593
 
594
 
595
 
596
 
597
 
598
 
599
 
600
 
601
 
602
 
603
 
604
 
605
 
606
 
607
 
608
 
609
 
610
   #/**********************************************************************/
611
   #/*                                                                    */
612
   #/* Print parameters for register addresses                            */
613
   #/*                                                                    */
614
   #/*                                                                    */
615
   #/**********************************************************************/
616
 
617
 
618
     foreach $line (@registers)
619
        {
620
        $_ = $line;
621
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
622
          {
623
          my $t_name                = $1;
624
          my $t_numoffset           = $2;
625
          my $t_size                = $3;
626
          my $t_numdim              = $4;
627
          my $t_dimbits             = $5;
628
          my $t_create              = $6;
629
          my $t_access              = $7;
630
          my $t_has_read            = $8;
631
          my $t_has_write           = $9;
632
 
633
          print  OUTFILE "parameter ";
634
          print  OUTFILE uc(${t_name});
635
          print  OUTFILE " = ${addblk_numaddbits}'d${t_numoffset};\n";
636
          my $register_addressOffset_end = $t_numoffset + $t_numdim;
637
          print  OUTFILE "parameter ";
638
          print  OUTFILE uc(${t_name});
639
          print  OUTFILE "_END = ${addblk_numaddbits}'d${register_addressOffset_end};\n";
640
 
641
          }
642
 
643
        }
644
 
645
 
646 134 jt_eaton
#   print  OUTFILE " input  wire  [${addblk_numaddbits}-1:${adr_base}]    addr";
647 119 jt_eaton
 
648
 
649
   #/**********************************************************************/
650
   #/*                                                                    */
651
   #/* write data register creation                                       */
652
   #/*                                                                    */
653
   #/*                                                                    */
654
   #/**********************************************************************/
655
 
656
 
657
 
658
   print  OUTFILE "\n\n";
659
   print  OUTFILE " reg  [${addblk_width}-1:0]    rdata_i;\n";
660
 
661
 
662
 
663
     foreach $line (@registers)
664
        {
665
        $_ = $line;
666
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
667
          {
668
          my $t_name                = $1;
669
          my $t_numoffset           = $2;
670
          my $t_size                = $3;
671
          my $t_numdim              = $4;
672
          my $t_dimbits             = $5;
673
          my $t_create              = $6;
674
          my $t_access              = $7;
675
          my $t_has_read            = $8;
676
          my $t_has_write           = $9;
677
 
678
          if(( $t_has_write eq "1") and ( $t_create eq "1"))
679
            {
680
            if($t_size eq 1){ print  OUTFILE "reg   ${t_name}_wdata;\n";}
681
            else            { print  OUTFILE "reg  [${t_size}-1:0]    ${t_name}_wdata;\n";}
682
            }
683
          }
684
        }
685
 
686
 
687
 
688
 
689
 
690
 
691
 
692
 
693
 
694
 
695
 
696
 
697
 
698
 
699
 
700
 
701
 
702
 
703
 
704
   #/**********************************************************************/
705
   #/*                                                                    */
706
   #/* Set up for block width and endian                                  */
707
   #/* seperate pass for each byte lane                                   */
708
   #/*                                                                    */
709
   #/**********************************************************************/
710
 
711
 
712
 
713
 
714
 
715
 
716
   for ($log_byte_lane =0; $log_byte_lane < $sys_byte_lanes;  $log_byte_lane++)
717
       {
718
       if($adr_base == 2)
719
         {
720
         if ($opt_bigendian)
721
          {
722
          if    ( $log_byte_lane == 0) {$phy_byte_lane = 3;}
723
          elsif ( $log_byte_lane == 1) {$phy_byte_lane = 2;}
724
          elsif ( $log_byte_lane == 2) {$phy_byte_lane = 1;}
725
          else             {$phy_byte_lane = 0;}
726
          }
727
         else
728
           {$phy_byte_lane = $log_byte_lane}
729
        }
730
 
731
       elsif($adr_base == 1)
732
         {
733
         if ($opt_bigendian)
734
          {
735
          if    ( $log_byte_lane == 0) {$phy_byte_lane = 1;}
736
          else             {$phy_byte_lane = 0;}
737
          }
738
         else
739
           {$phy_byte_lane = $log_byte_lane}
740
        }
741
         else
742
           {$phy_byte_lane = $log_byte_lane}
743
 
744
 
745
 
746
    #/**********************************************************************/
747
    #/*                                                                    */
748
    #/* Debug                                                              */
749
    #/*                                                                    */
750
    #/*                                                                    */
751
    #/**********************************************************************/
752
 
753
 
754
     print  OUTFILE "/*QQQ        Reg_Name     Reg_Access sys_byte_lanes  reg_byte_lanes reg_size  reg_add   ar_base log_byte_lane phy_byte_lane  reg_lane   pad_size        padding     bigend    */  \n";
755
 
756
 
757
 
758
     foreach $line (@registers)
759
        {
760
        $_ = $line;
761
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
762
          {
763
          my $t_name                = $1;
764
          my $t_numoffset           = $2;
765
          my $t_size                = $3;
766
          my $t_numdim              = $4;
767
          my $t_dimbits             = $5;
768
          my $t_create              = $6;
769
          my $t_access              = $7;
770
          my $t_has_read            = $8;
771
          my $t_has_write           = $9;
772
 
773
 
774
          my $reg_byte_lane           =     $t_numoffset   % $sys_byte_lanes  ;
775
          my $reg_byte_lanes          =     $t_size   / ${byte_size}  ;
776
          my $pad_size                =     $t_size  % $byte_size    ;
777
 
778
 
779
 
780
       if($pad_size)  {$padding = $byte_size - $pad_size;}
781
       else
782
         {
783
         $padding = 0;
784
         $pad_size = ${byte_size};
785
         }
786
 
787
          $reg_byte_lanes   = ($padding +  $t_size)/ $byte_size;
788
          my $strng = sprintf( "/*QQQ %16s  %12s %11s  %6s          %6s   %6s   %6s   %6s            %6s      %6s          %2s       %6s     %6s       */  \n",${t_name},${t_access},${sys_byte_lanes},${reg_byte_lanes},${t_size},${t_numoffset},${adr_base},${log_byte_lane},${phy_byte_lane},${reg_byte_lane},${pad_size},${padding},${opt_bigendian});
789
 
790
         print  OUTFILE  $strng;
791
 
792
 
793
 
794
          }
795
        }
796
 
797
         print  OUTFILE "\n\n\n";
798
 
799
 
800
 
801
 
802
 
803
 
804
    #/**********************************************************************/
805
    #/*                                                                    */
806
    #/* Read Data Muxing                                                   */
807
    #/*                                                                    */
808
    #/*                                                                    */
809
    #/**********************************************************************/
810
 
811
 
812
    if($max_has_read == "1" and $max_has_create == "1")
813
     {
814
     print  OUTFILE "always@(*)\n";
815
     print  OUTFILE "  if(rd && cs)\n";
816
     print  OUTFILE "    begin\n";
817
     print  OUTFILE "  if(byte_lanes[ $phy_byte_lane ])\n";
818
     print  OUTFILE "   rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] =  rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}];         \n";
819
     print  OUTFILE "  else\n";
820
     print  OUTFILE "                rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = UNMAPPED;\n";
821
     print  OUTFILE "    end\n";
822
     print  OUTFILE "  else          rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = UNSELECTED;\n\n\n";
823
 
824
     print  OUTFILE "always@(*)\n";
825
     print  OUTFILE "    case(addr[$addblk_numaddbits-1:${adr_base}])\n";
826
 
827
 
828
 
829
 
830
 
831
 
832
 
833
 
834
     foreach $line (@registers)
835
        {
836
        $_ = $line;
837
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
838
          {
839
          my $t_name                = $1;
840
          my $t_numoffset           = $2;
841
          my $t_size                = $3;
842
          my $t_numdim              = $4;
843
          my $t_dimbits             = $5;
844
          my $t_create              = $6;
845
          my $t_access              = $7;
846
          my $t_has_read            = $8;
847
          my $t_has_write           = $9;
848
 
849
 
850
 
851
 
852
          my $reg_byte_lane           =     $t_numoffset   % $sys_byte_lanes  ;
853
          my $reg_byte_lanes          =     $t_size   / ${byte_size}  ;
854
          my $pad_size                =     $t_size  % $byte_size    ;
855
 
856
 
857
 
858
       if($pad_size)  {$padding = $byte_size - $pad_size;}
859
       else
860
         {
861
         $padding = 0;
862
         $pad_size = ${byte_size};
863
         }
864
 
865
          $reg_byte_lanes   = ($padding +  $t_size)/ $byte_size;
866
 
867
 
868
       my $REG_NAME =  uc($t_name);
869
 
870
 
871
 
872
       if(  $t_has_read eq "1" )
873
         {
874
 
875
         if(( $sys_byte_lanes eq "1" ) and ( $reg_byte_lanes  eq "1") )
876
            {
877
             if(   $reg_byte_lanes - 1  eq       $phy_byte_lane )
878
              {
879
              print  OUTFILE "${REG_NAME}[$addblk_numaddbits-1:${adr_base}]:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
880
              if($padding)
881
                {
882
                if($pad_size eq "1")
883
                  {                print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata };//QQQQ\n";}
884
                else
885
                  {                print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:$phy_byte_lane*${byte_size}] };//QQQQ\n";}
886
                }
887
              else         { print  OUTFILE " ${t_name}_rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] ;//QQQQ\n";}
888
              }
889
 
890
 
891
            }
892
 
893
         elsif( $sys_byte_lanes eq  $reg_byte_lanes )
894
            {
895
             if(   $reg_byte_lanes - 1  eq       $phy_byte_lane )
896
              {
897
              print  OUTFILE "${REG_NAME}[$addblk_numaddbits-1:${adr_base}]:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
898
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:$phy_byte_lane*${byte_size}] };//QQQQ\n"; }
899
              else         { print  OUTFILE " ${t_name}_rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] ;//QQQQ\n";}
900
              }
901
            else
902
              {
903
              print  OUTFILE "${REG_NAME}[$addblk_numaddbits-1:${adr_base}]:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
904
              print  OUTFILE " ${t_name}_rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] ;//QQQQ\n";
905
              }
906
            }
907
         elsif (  ($sys_byte_lanes eq "1") and  ( $reg_byte_lanes eq "2"))
908
            {
909
            if($opt_bigendian)
910
              {
911
              print  OUTFILE "{";
912
              print  OUTFILE "${REG_NAME}[$addblk_numaddbits-1:1],1'b1}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
913
              print  OUTFILE " ${t_name}_rdata[${byte_size}-1:0] ;//QQQQ\n";
914
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:1],1'b0}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
915
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:${byte_size}] };//QQQQ\n"; }
916
              else         { print  OUTFILE " ${t_name}_rdata[$(byte_size}-1:${byte_size}] ;//QQQQ\n";}
917
              }
918
            else
919
              {
920
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:1],1'b0}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
921
              print  OUTFILE "${t_name}_rdata[${byte_size}-1:0] ;//QQQQ\n";
922
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:1],1'b1}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
923
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:${byte_size}] };//QQQQ\n";}
924
              else         { print  OUTFILE " ${t_name}_rdata[$(byte_size}-1:${byte_size}] ;//QQQQ\n"; }
925
              }
926
            }
927
 
928
         elsif (  ($sys_byte_lanes eq "1") and  ( $reg_byte_lanes eq "3"))
929
            {
930
            if($opt_bigendian)
931
              {
932
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b11}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
933
              print  OUTFILE " ${t_name}_rdata[${byte_size}-1:0] ;//QQQQ\n";
934
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b10}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
935
              print  OUTFILE " ${t_name}_rdata[$(byte_size}-1:${byte_size}] ;//QQQQ\n";
936
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b01}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
937
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:(${byte_size}*2)] };//QQQQ\n"; }
938
              else         { print  OUTFILE " ${t_name}_rdata[(${byte_size}*3)-1:(${byte_size}*2)] ;//QQQQ\n"; }
939
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b00}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
940
              print  OUTFILE " ${byte_size}'h0 ;//QQQQ\n";
941
              }
942
            else
943
              {
944
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b00}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
945
              print  OUTFILE " ${t_name}_rdata[${byte_size}-1:0] ;//QQQQ\n";
946
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b01}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
947
              print  OUTFILE " ${t_name}_rdata[$(byte_size}-1:${byte_size}] ;//QQQQ\n";
948
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b10}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
949
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:(${byte_size}*2)] };//QQQQ\n"; }
950
              else         { print  OUTFILE " ${t_name}_rdata[(${byte_size}*3)-1:(${byte_size}*2)] ;//QQQQ\n";}
951
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b11}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
952
              print  OUTFILE " ${byte_size}'h0 ;//QQQQ\n";
953
              }
954
           }
955
 
956
         elsif (  ($sys_byte_lanes eq "1") and  ( $reg_byte_lanes eq "4"))
957
            {
958
            if($opt_bigendian)
959
              {
960
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b11}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
961
              print  OUTFILE " ${t_name}_rdata[${byte_size}-1:0] ;//QQQQ\n";
962
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b10}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
963
              print  OUTFILE " ${t_name}_rdata[$(byte_size}-1:${byte_size}] ;//QQQQ\n";
964
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b01}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
965
              print  OUTFILE " ${t_name}_rdata[(${byte_size}*3)-1:(${byte_size}*2)] ;//QQQQ\n";
966
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b00}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
967
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:(${byte_size}*3)] };//QQQQ\n";}
968
              else         { print  OUTFILE " ${t_name}_rdata[(${byte_size}*4)-1:(${byte_size}*3)] ;//QQQQ\n";}
969
              }
970
            else
971
              {
972
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b00}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
973
              print  OUTFILE " ${t_name}_rdata[${byte_size}-1:0] ;//QQQQ\n";
974
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b01}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
975
              print  OUTFILE " ${t_name}_rdata[(${byte_size}*2)-1:${byte_size}] ;//QQQQ\n";
976
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b10}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
977
              print  OUTFILE " ${t_name}_rdata[(${byte_size}*3)-1:(${byte_size}*2)] ;//QQQQ\n";
978
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],2'b11}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
979
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:(${byte_size}*3)] };//QQQQ\n"; }
980
              else         { print  OUTFILE " ${t_name}_rdata[(${byte_size}*4)-1:(${byte_size}*3)] ;//QQQQ\n";}
981
              }
982
            }
983
 
984
 
985
 
986
         elsif (  ($sys_byte_lanes eq "2") and  ( $reg_byte_lanes eq "3") )
987
            {
988
            if($opt_bigendian)
989
              {
990
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],1'b1}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
991
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:$phy_byte_lane*${byte_size}]   };//QQQQ\n"; }
992
              else         { print  OUTFILE " ${t_name}_rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]      ;//QQQQ\n"; }
993
              }
994
            else
995
              {
996
 
997
 
998
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],1'b0}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
999
              print  OUTFILE " ${t_name}_rdata[$log_byte_lane*${byte_size}+${byte_size}-1:$log_byte_lane*${byte_size}]      ;//QQQQ\n";
1000
 
1001
              unless ($log_byte_lane){
1002
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],1'b1}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1003
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:(${byte_size}*2)]   };//QQQQ\n"; }
1004
              else         { print  OUTFILE " ${t_name}_rdata[(${byte_size}*3)-1:(${byte_size}*2)]      ;//QQQQ\n";}
1005
              }
1006
 
1007
 
1008
 
1009
              }
1010
            }
1011
 
1012
         elsif (  ($sys_byte_lanes eq "2") and  ( $reg_byte_lanes eq "4") )
1013
            {
1014
            if($opt_bigendian)
1015
              {
1016
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],1'b1}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1017
              print  OUTFILE " ${t_name}_rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] ;//QQQQ\n";
1018
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],1'b0}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1019
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:$phy_byte_lane*${byte_size}+(${byte_size}*2)]   };//QQQQ\n"; }
1020
              else         { print  OUTFILE " ${t_name}_rdata[$phy_byte_lane*${byte_size}+${byte_size}-1+(${byte_size}*2):$phy_byte_lane*${byte_size}+(${byte_size}*2)]      ;//QQQQ\n"; }
1021
              }
1022
            else
1023
              {
1024
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],1'b0}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1025
              print  OUTFILE " ${t_name}_rdata[$log_byte_lane*${byte_size}+${byte_size}-1:$log_byte_lane*${byte_size}] ;//QQQQ\n";
1026
              print  OUTFILE "{${REG_NAME}[$addblk_numaddbits-1:2],1'b1}:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1027
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:$log_byte_lane*${byte_size}+(${byte_size}*2)]   };//QQQQ\n"; }
1028
              else         { print  OUTFILE " ${t_name}_rdata[$log_byte_lane*${byte_size}+${byte_size}-1+(${byte_size}*2):$log_byte_lane*${byte_size}+(${byte_size}*2)]      ;//QQQQ\n";}
1029
              }
1030
            }
1031
 
1032
         elsif(( $sys_byte_lanes eq "2") and  ( $reg_byte_lanes eq "1") and ($reg_byte_lane eq $log_byte_lane)  )
1033
            {
1034
             print  OUTFILE "${REG_NAME}[$addblk_numaddbits-1:${adr_base}]:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1035
             if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata };//QQQQ\n"; }
1036
             else         { print  OUTFILE " ${t_name}_rdata ;//QQQQ\n"; }
1037
            }
1038
 
1039
 
1040
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "1") and ($reg_byte_lane eq $log_byte_lane)  )
1041
            {
1042
            print  OUTFILE "${REG_NAME}[$addblk_numaddbits-1:${adr_base}]:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1043
            if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata };//QQQQ\n";}
1044
            else         { print  OUTFILE " ${t_name}_rdata ;//QQQQ\n"; }
1045
            }
1046
 
1047
 
1048
 
1049
 
1050
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "2") and ($reg_byte_lane eq $log_byte_lane)  )
1051
            {
1052
            print  OUTFILE "${REG_NAME}[$addblk_numaddbits-1:${adr_base}]:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1053
            print  OUTFILE " ${t_name}_rdata[${byte_size}-1:0] ;//QQQQ\n";
1054
            }
1055
 
1056
 
1057
 
1058
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "2") and ($reg_byte_lane ==    ${log_byte_lane}-1 ))
1059
            {
1060
            print  OUTFILE "${REG_NAME}[$addblk_numaddbits-1:${adr_base}]:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1061
            if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:${byte_size}] };//QQQQ\n";}
1062
            else         { print  OUTFILE " ${t_name}_rdata[$(byte_size}-1:${byte_size}] ;//QQQQ\n"; }
1063
            }
1064
 
1065
 
1066
 
1067
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "3") and ($phy_byte_lane) ne "3"  )
1068
            {
1069
             if(   $reg_byte_lanes - 1  eq       $phy_byte_lane )
1070
              {
1071
              print  OUTFILE "${REG_NAME}[$addblk_numaddbits-1:${adr_base}]:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1072
              if($padding) { print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata[${t_size}-1:$phy_byte_lane*${byte_size}] };//QQQQ\n"; }
1073
              else         { print  OUTFILE " ${t_name}_rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] ;//QQQQ\n";}
1074
              }
1075
            else
1076
              {
1077
              print  OUTFILE "${REG_NAME}[$addblk_numaddbits-1:${adr_base}]:      rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = ";
1078
              print  OUTFILE " ${t_name}_rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] ;//QQQQ\n";
1079
              }
1080
            }
1081
 
1082
         }
1083
      }
1084
 
1085
   }
1086
 
1087
         print  OUTFILE "\n\n\n";
1088
         print  OUTFILE "    default:    rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = UNMAPPED;\n";
1089
         print  OUTFILE "    endcase\n\n";
1090
 
1091
 
1092
 
1093
 
1094
     }
1095
 
1096
 
1097
 
1098
 
1099
 
1100
 
1101
 
1102
 
1103
 
1104
 
1105
 
1106
 
1107
 
1108
 
1109
    #/**********************************************************************/
1110
    #/*                                                                    */
1111
    #/* Read Data Muxing                                                   */
1112
    #/*                                                                    */
1113
    #/*                                                                    */
1114
    #/**********************************************************************/
1115
 
1116
 
1117
    if($max_has_read == "1" and $max_has_create == "0" )
1118
     {
1119
     print  OUTFILE "always@(*)\n";
1120
     print  OUTFILE "  if(rd && cs)\n";
1121
     print  OUTFILE "    begin\n";
1122
     print  OUTFILE "  if(byte_lanes[ $phy_byte_lane ])\n";
1123
     print  OUTFILE "   rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] =  rdata_i[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}];         \n";
1124
     print  OUTFILE "  else\n";
1125
     print  OUTFILE "                rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = UNMAPPED;\n";
1126
     print  OUTFILE "    end\n";
1127
     print  OUTFILE "  else          rdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}] = UNSELECTED;\n\n\n";
1128
 
1129
     print  OUTFILE "always@(*)\n";
1130
     print  OUTFILE "    begin\n";
1131
     print  OUTFILE "        rdata_i  = UNMAPPED;\n";
1132
 
1133
 
1134
     foreach $line (@registers)
1135
        {
1136
        $_ = $line;
1137
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
1138
          {
1139
          my $t_name                = $1;
1140
          my $t_numoffset           = $2;
1141
          my $t_size                = $3;
1142
          my $t_numdim              = $4;
1143
          my $t_dimbits             = $5;
1144
          my $t_create              = $6;
1145
          my $t_access              = $7;
1146
          my $t_has_read            = $8;
1147
          my $t_has_write           = $9;
1148
          my $reg_byte_lane           =     $t_numoffset   % $sys_byte_lanes  ;
1149
          my $reg_byte_lanes          =     $t_size   / ${byte_size}  ;
1150
          my $pad_size                =     $t_size  % $byte_size    ;
1151
 
1152
 
1153
       if($pad_size)  {$padding = $byte_size - $pad_size;}
1154
       else
1155
         {
1156
         $padding = 0;
1157
         $pad_size = ${byte_size};
1158
         }
1159
 
1160
 
1161
         my $REG_NAME =  uc($t_name);
1162
 
1163
 
1164
 
1165
 
1166
 
1167
         if(  $t_has_read eq "1" )
1168
           {
1169
           print  OUTFILE "if( ${t_name}_cs )     rdata_i = ";
1170
                if($padding) {   print  OUTFILE "{${REG_NAME}_PAD , ${t_name}_rdata };//QQQQ\n";}
1171
                else         {   print  OUTFILE " ${t_name}_rdata ;//QQQQ\n";}
1172
           }
1173
 
1174
 
1175
 
1176
 
1177
 
1178
         print  OUTFILE "\n";
1179
 
1180
 
1181
 
1182
     }
1183
 
1184
 
1185
}
1186
 
1187
         print  OUTFILE "    end\n\n";
1188
 
1189
 
1190
}
1191
 
1192
 
1193
 
1194
 
1195
 
1196
 
1197
 
1198
 
1199
 
1200
 
1201
 
1202
 
1203
 
1204
 
1205
 
1206
 
1207
 
1208
 
1209
 
1210
 
1211
 
1212
 
1213
 
1214
 
1215
 
1216
 
1217
 
1218
 
1219
 
1220
 
1221
 
1222
 
1223
 
1224
 
1225
 
1226
 
1227
 
1228
 
1229
 
1230
    #/**********************************************************************/
1231
    #/*                                                                    */
1232
    #/* Write Data Selection                                               */
1233
    #/*                                                                    */
1234
    #/*                                                                    */
1235
    #/**********************************************************************/
1236
 
1237
 
1238
 
1239
    if($max_has_write)
1240
     {
1241
 
1242
     print  OUTFILE "always@(*)\n";
1243
     print  OUTFILE "    begin\n";
1244
 
1245
     foreach $line (@registers)
1246
        {
1247
        $_ = $line;
1248
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
1249
          {
1250
          my $t_name                = $1;
1251
          my $t_numoffset           = $2;
1252
          my $t_size                = $3;
1253
          my $t_numdim              = $4;
1254
          my $t_dimbits             = $5;
1255
          my $t_create              = $6;
1256
          my $t_access              = $7;
1257
          my $t_has_read            = $8;
1258
          my $t_has_write           = $9;
1259
          my $reg_byte_lane           =     $t_numoffset   % $sys_byte_lanes  ;
1260
          my $reg_byte_lanes          =     $t_size   / ${byte_size}  ;
1261
          my $pad_size                =     $t_size  % $byte_size    ;
1262
 
1263
 
1264
       if($pad_size)  {$padding = $byte_size - $pad_size;}
1265
       else
1266
         {
1267
         $padding = 0;
1268
         $pad_size = ${byte_size};
1269
         }
1270
 
1271
 
1272
       my $REG_NAME =  uc($t_name);
1273
 
1274
 
1275
         $reg_byte_lanes   = ($padding + $t_size)/ $byte_size;
1276
 
1277
 
1278
 
1279
 
1280
       if( $t_has_write eq "1" )
1281
         {
1282
         if (  ($sys_byte_lanes eq "1") and  ( $reg_byte_lanes eq "1"))
1283
            {
1284
            print  OUTFILE "${t_name}_wdata      =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:0];//    1\n";
1285
            }
1286
 
1287
        elsif( $sys_byte_lanes eq  $reg_byte_lanes )
1288
            {
1289
             if(   $reg_byte_lanes - 1  eq       $phy_byte_lane )
1290
              {
1291
              print  OUTFILE "${t_name}_wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:$phy_byte_lane*${byte_size}]     =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:$phy_byte_lane*${byte_size}];// 2\n";
1292
 
1293
              }
1294
            else
1295
              {
1296
 
1297
              print  OUTFILE "${t_name}_wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]     =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //    3 \n";
1298
              }
1299
            }
1300
         elsif (  ($sys_byte_lanes eq "1") and  ( $reg_byte_lanes eq "2"))
1301
            {
1302
            if($opt_bigendian)
1303
              {
1304
              print  OUTFILE "${t_name}_wdata[${byte_size}-1:0]            =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:0]; //   4  \n";
1305
 
1306
 
1307
              print  OUTFILE "${t_name}_wdata[${pad_size}+${byte_size}-1:${byte_size}]            =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:0]; //  5   \n";
1308
 
1309
              }
1310
            else
1311
              {
1312
              print  OUTFILE "${t_name}_wdata[${byte_size}-1:0]            =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //   6  \n";
1313
 
1314
 
1315
              print  OUTFILE "${t_name}_wdata[${pad_size}+${byte_size}-1:${byte_size}]            =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:0]; //  ${byte_size}-1   \n";
1316
 
1317
              }
1318
            }
1319
 
1320
         elsif (  ($sys_byte_lanes eq "1") and  ( $reg_byte_lanes eq "3"))
1321
            {
1322
            if($opt_bigendian)
1323
              {
1324
              print  OUTFILE "${t_name}_wdata[${byte_size}-1:0]             =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //   8  \n";
1325
              print  OUTFILE "${t_name}_wdata[$(byte_size}-1:${byte_size}]             =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  9   \n";
1326
              print  OUTFILE "${t_name}_wdata[${pad_size}+$(byte_size}-1:(${byte_size}*2)]             =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:0]; // 10    \n";
1327
              }
1328
            else
1329
              {
1330
              print  OUTFILE "${t_name}_wdata[${byte_size}-1:0]                  =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  11   \n";
1331
              print  OUTFILE "${t_name}_wdata[$(byte_size}-1:${byte_size}]                 =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  12   \n";
1332
              print  OUTFILE "${t_name}_wdata[${pad_size}+$(byte_size}-1:(${byte_size}*2)]    =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:0]; // 13    \n";
1333
              }
1334
           }
1335
 
1336
         elsif (  ($sys_byte_lanes eq "1") and  ( $reg_byte_lanes eq "4"))
1337
            {
1338
            if($opt_bigendian)
1339
              {
1340
              print  OUTFILE "${t_name}_wdata[${byte_size}-1:0]             =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //   14  \n";
1341
              print  OUTFILE "${t_name}_wdata[$(byte_size}-1:${byte_size}]             =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  15   \n";
1342
              print  OUTFILE "${t_name}_wdata[(${byte_size}*3)-1:(${byte_size}*2)]             =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; // 16    \n";
1343
              print  OUTFILE "${t_name}_wdata[${pad_size}+(${byte_size}*3)-1:(${byte_size}*3)]             =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:0]; // 17    \n";
1344
 
1345
              }
1346
            else
1347
              {
1348
              print  OUTFILE "${t_name}_wdata[${byte_size}-1:0]             =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //   18  \n";
1349
              print  OUTFILE "${t_name}_wdata[$(byte_size}-1:${byte_size}]             =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  19   \n";
1350
              print  OUTFILE "${t_name}_wdata[(${byte_size}*3)-1:(${byte_size}*2)]             =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; // 20    \n";
1351
              print  OUTFILE "${t_name}_wdata[${pad_size}+(${byte_size}*3)-1:(${byte_size}*3)]             =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:0]; // 21    \n";
1352
              }
1353
            }
1354
 
1355
         elsif (  ($sys_byte_lanes eq "2") and  ( $reg_byte_lanes eq "3") )
1356
            {
1357
            if($opt_bigendian)
1358
              {
1359
              print  OUTFILE "${t_name}_wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]            =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  22   \n";
1360
              }
1361
            else
1362
              {
1363
              print  OUTFILE "${t_name}_wdata[$log_byte_lane*${byte_size}+${byte_size}-1:$log_byte_lane*${byte_size}]            =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //    \n";
1364
              if($log_byte_lane == 0)
1365
              {
1366
              print  OUTFILE "${t_name}_wdata[$log_byte_lane*${byte_size}+${pad_size}+$(byte_size}-1:$log_byte_lane*${byte_size}+(${byte_size}*2)]            =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //     \n";
1367
              }
1368
              }
1369
            }
1370
 
1371
         elsif (  ($sys_byte_lanes eq "2") and  ( $reg_byte_lanes eq "4") )
1372
            {
1373
            if($opt_bigendian)
1374
              {
1375
              print  OUTFILE "${t_name}_wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]            =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  24   \n";
1376
              print  OUTFILE "${t_name}_wdata[$phy_byte_lane*${byte_size}+${byte_size}-1+$(byte_size}-1:$phy_byte_lane*${byte_size}+(${byte_size}*2)]           =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  25   \n";
1377
              }
1378
            else
1379
              {
1380
              print  OUTFILE "${t_name}_wdata[$log_byte_lane*${byte_size}+${byte_size}-1:$log_byte_lane*${byte_size}]            =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; // 26    \n";
1381
             if($log_byte_lane)
1382
               {
1383
 
1384
              print  OUTFILE "${t_name}_wdata[$log_byte_lane*${byte_size}+${pad_size}+$(byte_size}-1:$log_byte_lane*${byte_size}+(${byte_size}*2)]            =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:$phy_byte_lane*${byte_size}]; //  27   \n";
1385
               }
1386
             else
1387
                      {
1388
 
1389
              print  OUTFILE "${t_name}_wdata[$log_byte_lane*${byte_size}+${byte_size}-1+(${byte_size}*2):$log_byte_lane*${byte_size}+(${byte_size}*2)]            =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  27   \n";
1390
               }
1391
 
1392
             }
1393
            }
1394
 
1395
         elsif(( $sys_byte_lanes eq "2") and  ( $reg_byte_lanes eq "1") and ($reg_byte_lane eq $log_byte_lane)  )
1396
            {
1397
             print  OUTFILE "${t_name}_wdata     =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:$phy_byte_lane*${byte_size}]; //  28   \n";
1398
            }
1399
 
1400
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "1") and ($reg_byte_lane eq $log_byte_lane)  )
1401
            {
1402
            print  OUTFILE "${t_name}_wdata     =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:$phy_byte_lane*${byte_size}]; //  29   \n";
1403
            }
1404
 
1405
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "2") and ($reg_byte_lane eq $log_byte_lane)  )
1406
            {
1407
            print  OUTFILE "${t_name}_wdata[${byte_size}-1:0]     =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  30   \n";
1408
            }
1409
 
1410
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "2") and ($reg_byte_lane == ${log_byte_lane}-1 ))
1411
            {
1412
            print  OUTFILE "${t_name}_wdata[${pad_size}+${byte_size}-1:${byte_size}]     =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:$phy_byte_lane*${byte_size}]; //    \n";
1413
            }
1414
 
1415
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "3") and ($phy_byte_lane) ne "3"  )
1416
            {
1417
             if(   $reg_byte_lanes - 1  eq       $phy_byte_lane )
1418
              {
1419
              print  OUTFILE "${t_name}_wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:$phy_byte_lane*${byte_size}]     =  wdata[$phy_byte_lane*${byte_size}+${pad_size}-1:$phy_byte_lane*${byte_size}]; //  32   \n";
1420
              }
1421
            else
1422
              {
1423
              print  OUTFILE "${t_name}_wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]     =  wdata[$phy_byte_lane*${byte_size}+${byte_size}-1:$phy_byte_lane*${byte_size}]; //  33   \n";
1424
              }
1425
            }
1426
 
1427
         }
1428
      }
1429
 
1430
   }
1431
 
1432
         print  OUTFILE "\n\n\n";
1433
         print  OUTFILE "    end\n\n";
1434
 
1435
 
1436
 
1437
 
1438
 
1439
    #/**********************************************************************/
1440
    #/*                                                                    */
1441
    #/* Write strobe Creation                                              */
1442
    #/*                                                                    */
1443
    #/*                                                                    */
1444
    #/**********************************************************************/
1445
 
1446
 
1447
 
1448
     print  OUTFILE "always@(*)\n";
1449
     print  OUTFILE "    begin\n";
1450
 
1451
 
1452
 
1453
     foreach $line (@registers)
1454
        {
1455
        $_ = $line;
1456
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
1457
          {
1458
          my $t_name                = $1;
1459
          my $t_numoffset           = $2;
1460
          my $t_size                = $3;
1461
          my $t_numdim              = $4;
1462
          my $t_dimbits             = $5;
1463
          my $t_create              = $6;
1464
          my $t_access              = $7;
1465
          my $t_has_read            = $8;
1466
          my $t_has_write           = $9;
1467
 
1468
 
1469
          my $reg_byte_lane           =     $t_numoffset   % $sys_byte_lanes  ;
1470
          my $reg_byte_lanes          =     $t_size   / ${byte_size}  ;
1471
          my $pad_size                =     $t_size  % $byte_size    ;
1472
 
1473
 
1474
 
1475
       if($pad_size)  {$padding = $byte_size - $pad_size;}
1476
       else
1477
         {
1478
         $padding = 0;
1479
         $pad_size = ${byte_size};
1480
         }
1481
 
1482
          $reg_byte_lanes   = ($padding +  $t_size)/ $byte_size;
1483
 
1484
 
1485
 
1486
       my $REG_NAME =  uc($t_name);
1487
 
1488
 
1489
 
1490
 
1491
 
1492
 
1493
 
1494
 
1495
       if( $t_has_write eq "1" )
1496
         {
1497
         if ( $sys_byte_lanes eq  $reg_byte_lanes )
1498
            {
1499
            print  OUTFILE "${t_name}_wr_${phy_byte_lane} = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:${adr_base}]== ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] ); //     \n";
1500
            }
1501
 
1502
         elsif (  ($sys_byte_lanes eq "1") and  ( $reg_byte_lanes eq "2"))
1503
            {
1504
            if($opt_bigendian)
1505
              {
1506
              print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:1],1'b1} ); //     \n";
1507
              print  OUTFILE "${t_name}_wr_1 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:1],1'b0} ); //     \n";
1508
 
1509
              }
1510
            else
1511
              {
1512
              print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:1],1'b0} ); //     \n";
1513
              print  OUTFILE "${t_name}_wr_1 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:1],1'b1} ); //     \n";
1514
              }
1515
            }
1516
 
1517
         elsif (  ($sys_byte_lanes eq "1") and  ( $reg_byte_lanes eq "3"))
1518
            {
1519
            if($opt_bigendian)
1520
              {
1521
              print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b11} ); //     \n";
1522
              print  OUTFILE "${t_name}_wr_1 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b10} ); //     \n";
1523
              print  OUTFILE "${t_name}_wr_2 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b01} ); //     \n";
1524
              }
1525
            else
1526
              {
1527
              print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b00} ); //     \n";
1528
              print  OUTFILE "${t_name}_wr_1 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b01} ); //     \n";
1529
              print  OUTFILE "${t_name}_wr_2 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b10} ); //     \n";
1530
              }
1531
           }
1532
 
1533
         elsif (  ($sys_byte_lanes eq "1") and  ( $reg_byte_lanes eq "4"))
1534
            {
1535
            if($opt_bigendian)
1536
              {
1537
              print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b11} ); //     \n";
1538
              print  OUTFILE "${t_name}_wr_1 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b10} ); //     \n";
1539
              print  OUTFILE "${t_name}_wr_2 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b01} ); //     \n";
1540
              print  OUTFILE "${t_name}_wr_3 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b00} ); //     \n";
1541
              }
1542
            else
1543
              {
1544
              print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b00} ); //     \n";
1545
              print  OUTFILE "${t_name}_wr_1 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b01} ); //     \n";
1546
              print  OUTFILE "${t_name}_wr_2 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b10} ); //     \n";
1547
              print  OUTFILE "${t_name}_wr_3 = cs && wr && enable && byte_lanes[ 0 ] && ( addr[$addblk_numaddbits-1:0]== {${REG_NAME}[$addblk_numaddbits-1:2],2'b11} ); //     \n";
1548
 
1549
              }
1550
            }
1551
 
1552
         elsif (  ($sys_byte_lanes eq "2") and  ( $reg_byte_lanes eq "3") )
1553
            {
1554
              if ($log_byte_lane == 0 )
1555
                 {
1556
                 print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:1]== {${REG_NAME}[$addblk_numaddbits-1:2],1'b0} ); //     \n";
1557
                 print  OUTFILE "${t_name}_wr_2 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:1]== {${REG_NAME}[$addblk_numaddbits-1:2],1'b1} ); //     \n";
1558
                 }
1559
              elsif ($log_byte_lane == 1 )
1560
                 {
1561
                 print  OUTFILE "${t_name}_wr_1 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:1]== {${REG_NAME}[$addblk_numaddbits-1:2],1'b0} ); //     \n";
1562
                 }
1563
            }
1564
 
1565
 
1566
 
1567
         elsif (  ($sys_byte_lanes eq "2") and  ( $reg_byte_lanes eq "4") )
1568
            {
1569
              if ($log_byte_lane == 0 )
1570
                 {
1571
                 print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:1]== {${REG_NAME}[$addblk_numaddbits-1:2],1'b0} ); //     \n";
1572
                 print  OUTFILE "${t_name}_wr_2 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:1]== {${REG_NAME}[$addblk_numaddbits-1:2],1'b1} ); //     \n";
1573
                 }
1574
              elsif ($log_byte_lane == 1 )
1575
                 {
1576
                 print  OUTFILE "${t_name}_wr_1 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:1]== {${REG_NAME}[$addblk_numaddbits-1:2],1'b0} ); //     \n";
1577
                 print  OUTFILE "${t_name}_wr_3 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:1]== {${REG_NAME}[$addblk_numaddbits-1:2],1'b1} ); //     \n";
1578
                 }
1579
            }
1580
 
1581
 
1582
 
1583
 
1584
 
1585
 
1586
         elsif(( $sys_byte_lanes eq "2") and  ( $reg_byte_lanes eq "1") and ($reg_byte_lane eq $log_byte_lane)  )
1587
            {
1588
            print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:${adr_base}]== ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] );\n";
1589
            }
1590
 
1591
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "1") and ($reg_byte_lane eq $log_byte_lane)  )
1592
            {
1593
            print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:${adr_base}]== ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] );\n";
1594
            }
1595
 
1596
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "2") and ($reg_byte_lane eq $log_byte_lane)  )
1597
            {
1598
            print  OUTFILE "${t_name}_wr_0 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:${adr_base}]== ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] );\n";
1599
            }
1600
 
1601
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "2") and ($reg_byte_lane == ${log_byte_lane}-1 ))
1602
            {
1603
            print  OUTFILE "${t_name}_wr_1 = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:${adr_base}]== ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] );\n";
1604
            }
1605
 
1606
         elsif(( $sys_byte_lanes eq "4") and  ( $reg_byte_lanes eq "3") and ($log_byte_lane  ne "3")  )
1607
            {
1608
             if(   ${reg_byte_lanes}-1   ==       $log_byte_lane )
1609
              {
1610
            print  OUTFILE "${t_name}_wr_${log_byte_lane} = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:${adr_base}]== ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] ); //     \n";
1611
              }
1612
            else
1613
              {
1614
            print  OUTFILE "${t_name}_wr_${log_byte_lane} = cs && wr && enable && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:${adr_base}]== ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] ); //     \n";
1615
              }
1616
            }
1617
 
1618
         }
1619
      }
1620
 
1621
 
1622
}
1623
         print  OUTFILE "\n\n\n";
1624
         print  OUTFILE "    end\n\n";
1625
 
1626
 
1627
}
1628
 
1629
 
1630
 
1631
 
1632
 
1633
 
1634
 
1635
 
1636
 
1637
 
1638
 
1639
 
1640
 
1641
 
1642
 
1643
 
1644
 
1645
 
1646
    #/**********************************************************************/
1647
    #/*                                                                    */
1648
    #/* Print read strobes                                                 */
1649
    #/*                                                                    */
1650
    #/*                                                                    */
1651
    #/**********************************************************************/
1652
 
1653
 
1654
 
1655
 
1656
 
1657
     foreach $line (@registers)
1658
        {
1659
        $_ = $line;
1660
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
1661
          {
1662
          my $t_name                = $1;
1663
          my $t_numoffset           = $2;
1664
          my $t_size                = $3;
1665
          my $t_numdim              = $4;
1666
          my $t_dimbits             = $5;
1667
          my $t_create              = $6;
1668
          my $t_access              = $7;
1669
          my $t_has_read            = $8;
1670
          my $t_has_write           = $9;
1671
          my $reg_byte_lane           =     $t_numoffset   % $sys_byte_lanes  ;
1672
          my $reg_byte_lanes          =     $t_size   / ${byte_size}  ;
1673
          my $pad_size                =     $t_size  % $byte_size    ;
1674
 
1675
 
1676
       if($pad_size)  {$padding = $byte_size - $pad_size;}
1677
       else
1678
         {
1679
         $padding = 0;
1680
         $pad_size = ${byte_size};
1681
         }
1682
 
1683
 
1684
         my $REG_NAME =  uc($t_name);
1685
 
1686
 
1687
 
1688
 
1689
          $reg_byte_lanes   = ($padding + int($t_size))/ $byte_size;
1690
 
1691
 
1692
 
1693
 
1694
 
1695
 
1696
            if(( $sys_byte_lanes == 1) and ($reg_byte_lanes == 1))
1697
              {
1698
 
1699
              }
1700
 
1701
            elsif(( $sys_byte_lanes == 1) and ($reg_byte_lanes == 2))
1702
              {
1703
 
1704
              }
1705
 
1706
            elsif(( $sys_byte_lanes == 1) and ($reg_byte_lanes == 3))
1707
              {
1708
 
1709
              }
1710
            elsif(( $sys_byte_lanes == 1) and ($reg_byte_lanes == 4))
1711
              {
1712
 
1713
              }
1714
            elsif (  ( $sys_byte_lanes == 2) and ($reg_byte_lanes == 1) and       ( $log_byte_lane == $reg_byte_lane)  )
1715
               {
1716
               push  @add_decs, "        ${t_name}_dec = cs && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:${adr_base}]== ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] );//. $sys_byte_lanes. $reg_byte_lanes.   5\n"
1717
               }
1718
              elsif (  ( $sys_byte_lanes == 4) and ($reg_byte_lanes == 1) and       ( $log_byte_lane == $reg_byte_lane)  )
1719
               {
1720
               push  @add_decs, "        ${t_name}_dec = cs && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:${adr_base}]== ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] );//. $sys_byte_lanes. $reg_byte_lanes.   5\n"
1721
               }
1722
            elsif (  ( $sys_byte_lanes == 4) and ($reg_byte_lanes == 2) and       ( $log_byte_lane == $reg_byte_lane)  )
1723
               {
1724
               push  @add_decs, "        ${t_name}_dec = cs && byte_lanes[ $phy_byte_lane ] && ( addr[$addblk_numaddbits-1:${adr_base}]== ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] );//. $sys_byte_lanes. $reg_byte_lanes.   5\n"
1725
               }
1726
          }
1727
       }
1728
 
1729
}
1730
 
1731
 
1732
 
1733
 
1734
 
1735
 
1736
 
1737
 
1738
 
1739
 
1740
     foreach $line (@registers)
1741
        {
1742
        $_ = $line;
1743
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
1744
          {
1745
          my $t_name                = $1;
1746
          my $t_numoffset           = $2;
1747
          my $t_size                = $3;
1748
          my $t_numdim              = $4;
1749
          my $t_dimbits             = $5;
1750
          my $t_create              = $6;
1751
          my $t_access              = $7;
1752
          my $t_has_read            = $8;
1753
          my $t_has_write           = $9;
1754
          my $reg_byte_lane           =     $t_numoffset   % $sys_byte_lanes  ;
1755
          my $reg_byte_lanes          =     $t_size   / ${byte_size}  ;
1756
          my $pad_size                =     $t_size  % $byte_size    ;
1757
 
1758
 
1759
       if($pad_size)  {$padding = $byte_size - $pad_size;}
1760
       else
1761
         {
1762
         $padding = 0;
1763
         $pad_size = ${byte_size};
1764
         }
1765
       my $REG_NAME =  uc($t_name);
1766
 
1767
 
1768
          $reg_byte_lanes   = ($padding + int($t_size))/ $byte_size;
1769
 
1770
 
1771
 
1772
 
1773
 
1774
 
1775
            if(( $sys_byte_lanes == 1) and ($reg_byte_lanes == 1))
1776
              {
1777
               push  @add_decs, "        ${t_name}_dec = cs && ( addr[$addblk_numaddbits-1:0]== ${REG_NAME}[$addblk_numaddbits-1:0] );//  1\n"
1778
              }
1779
 
1780
            elsif(( $sys_byte_lanes == 1) and ($reg_byte_lanes == 2))
1781
              {
1782
               push  @add_decs, "        ${t_name}_dec = cs && ( addr[$addblk_numaddbits-1:1]== ${REG_NAME}[$addblk_numaddbits-1:1] );//  2\n"
1783
              }
1784
 
1785
            elsif(( $sys_byte_lanes == 1) and ($reg_byte_lanes == 3))
1786
              {
1787
               push  @add_decs, "        ${t_name}_dec = cs && ( addr[$addblk_numaddbits-1:2]== ${REG_NAME}[$addblk_numaddbits-1:2] );//  3\n"
1788
              }
1789
            elsif(( $sys_byte_lanes == 1) and ($reg_byte_lanes == 4))
1790
              {
1791
               push  @add_decs, "        ${t_name}_dec = cs && ( addr[$addblk_numaddbits-1:2]== ${REG_NAME}[$addblk_numaddbits-1:2] );//  4\n"
1792
              }
1793
            elsif(( $sys_byte_lanes == 2) and ($reg_byte_lanes == 2))
1794
              {
1795
               push  @add_decs, "        ${t_name}_dec = cs && ( addr[$addblk_numaddbits-1:1]== ${REG_NAME}[$addblk_numaddbits-1:1] );//  4\n"
1796
              }
1797
 
1798
            elsif(( $sys_byte_lanes == 2) and ($reg_byte_lanes == 3))
1799
              {
1800
               push  @add_decs, "        ${t_name}_dec = cs && ( addr[$addblk_numaddbits-1:2]== ${REG_NAME}[$addblk_numaddbits-1:2] );//  4\n"
1801
              }
1802
 
1803
            elsif(( $sys_byte_lanes == 2) and ($reg_byte_lanes == 4))
1804
              {
1805
               push  @add_decs, "        ${t_name}_dec = cs && ( addr[$addblk_numaddbits-1:2]== ${REG_NAME}[$addblk_numaddbits-1:2] );//  4\n"
1806
              }
1807
 
1808
 
1809
            elsif(( $sys_byte_lanes == 4) and ($reg_byte_lanes == 3))
1810
              {
1811
               push  @add_decs, "        ${t_name}_dec = cs && ( addr[$addblk_numaddbits-1:2]== ${REG_NAME}[$addblk_numaddbits-1:2] );//  4\n"
1812
              }
1813
 
1814
            elsif(( $sys_byte_lanes == 4) and ($reg_byte_lanes == 4))
1815
              {
1816
               push  @add_decs, "        ${t_name}_dec = cs && ( addr[$addblk_numaddbits-1:2]== ${REG_NAME}[$addblk_numaddbits-1:2] );//  4\n"
1817
              }
1818
 
1819
 
1820
 
1821
 
1822
          }
1823
 
1824
}
1825
 
1826
         print  OUTFILE "\n\n always@(*)\n     begin\n";
1827
           foreach my $add_line (@add_decs)
1828
                {
1829
                 print  OUTFILE "${add_line}";
1830
                }
1831
 
1832
            print  OUTFILE "\n     end\n\n";
1833
 
1834
 
1835
 
1836
 
1837
 
1838
 
1839
 
1840
 
1841
 
1842
 
1843
 
1844
 
1845
 
1846
 
1847
 
1848
 
1849
 
1850
 
1851
 
1852
    #/**********************************************************************/
1853
    #/*                                                                    */
1854
    #/* Create Chip Selects                                                */
1855
    #/*                                                                    */
1856
    #/*                                                                    */
1857
    #/**********************************************************************/
1858
 
1859
   print  OUTFILE "\n  /* verilator lint_off UNSIGNED */           \n";
1860
 
1861
     foreach $line (@registers)
1862
        {
1863
        $_ = $line;
1864
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
1865
          {
1866
          my $t_name                = $1;
1867
          my $t_numoffset           = $2;
1868
          my $t_size                = $3;
1869
          my $t_numdim              = $4;
1870
          my $t_dimbits             = $5;
1871
          my $t_create              = $6;
1872
          my $t_access              = $7;
1873
          my $t_has_read            = $8;
1874
          my $t_has_write           = $9;
1875
          my $REG_NAME              =  uc($t_name);
1876 134 jt_eaton
          print  OUTFILE "assign   ${t_name}_cs = cs && ( addr[$addblk_numaddbits-1:${adr_base}] >= ${REG_NAME}[$addblk_numaddbits-1:${adr_base}] ) && ( addr[$addblk_numaddbits-1:${adr_base}] < ${REG_NAME}_END[$addblk_numaddbits-1:${adr_base}] );\n";
1877 119 jt_eaton
          }
1878
        }
1879
 
1880
 
1881
   print  OUTFILE "\n  /* verilator lint_on UNSIGNED */           \n";
1882
 
1883
 
1884
 
1885
 
1886
 
1887
 
1888
    #/**********************************************************************/
1889
    #/*                                                                    */
1890
    #/* Create Registers                                                   */
1891
    #/*                                                                    */
1892
    #/*                                                                    */
1893
    #/**********************************************************************/
1894
 
1895
     foreach $line (@registers)
1896
        {
1897
        $_ = $line;
1898
        if(/:::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::(\S+):::/)
1899
          {
1900
          my $t_name                = $1;
1901
          my $t_numoffset           = $2;
1902
          my $t_size                = $3;
1903
          my $t_numdim              = $4;
1904
          my $t_dimbits             = $5;
1905
          my $t_create              = $6;
1906
          my $t_access              = $7;
1907
          my $t_has_read            = $8;
1908
          my $t_has_write           = $9;
1909
 
1910
 
1911
          my $reg_byte_lane           =     $t_numoffset   % $sys_byte_lanes  ;
1912
          my $reg_byte_lanes          =     $t_size   / ${byte_size}  ;
1913
          my $pad_size                =     $t_size  % $byte_size    ;
1914
 
1915
 
1916
 
1917
       if($pad_size)  {$padding = $byte_size - $pad_size;}
1918
       else
1919
         {
1920
         $padding = 0;
1921
         $pad_size = ${byte_size};
1922
         }
1923
 
1924
          $reg_byte_lanes   = ($padding +  $t_size)/ $byte_size;
1925
 
1926
 
1927
       if(( $t_has_write eq "1") and   ( $t_create eq "1")  )
1928
         {
1929
         print  OUTFILE "   always@(posedge clk)\n     if(reset)  $t_name <=  ";
1930
         print  OUTFILE uc($t_name);
1931
         print  OUTFILE "_RST;\n        else\n       begin\n";
1932
 
1933
         if($reg_byte_lanes == 1)
1934
          {
1935
          if($pad_size ==1)
1936
           {
1937
           print  OUTFILE "    if(${t_name}_wr_0)    ${t_name}   <=  ${t_name}_wdata   ;\n";
1938
           print  OUTFILE "    else    ${t_name}                        <=    next_${t_name};\n\n";
1939
           }
1940
         else
1941
           {
1942
           print  OUTFILE "    if(${t_name}_wr_0)    ${t_name}[${pad_size}-1:0]  <=  ${t_name}_wdata[${pad_size}-1:0]  ;\n";
1943
           print  OUTFILE "    else    ${t_name}[${pad_size}-1:0]   <=    next_${t_name}[${pad_size}-1:0];\n\n";
1944
           }
1945
 
1946
          }
1947
         elsif($reg_byte_lanes == 2)
1948
          {
1949
          print  OUTFILE "    if(${t_name}_wr_0)    ${t_name}[${byte_size}-1:0]  <=  ${t_name}_wdata[${byte_size}-1:0]  ;\n";
1950
          print  OUTFILE "    else    ${t_name}[${byte_size}-1:0]   <=    next_${t_name}[${byte_size}-1:0];\n\n";
1951
          print  OUTFILE "    if(${t_name}_wr_1)    ${t_name}[${pad_size}+${byte_size}-1:${byte_size}]  <=  ${t_name}_wdata[${pad_size}+${byte_size}-1:${byte_size}]  ;\n";
1952
          print  OUTFILE "    else    ${t_name}[${pad_size}+${byte_size}-1:${byte_size}]   <=    next_${t_name}[${pad_size}+${byte_size}-1:${byte_size}];\n\n";
1953
          }
1954
         elsif($reg_byte_lanes == 3)
1955
          {
1956
          print  OUTFILE "    if(${t_name}_wr_0)    ${t_name}[${byte_size}-1:0]  <=  ${t_name}_wdata[${byte_size}-1:0]  ;\n";
1957
          print  OUTFILE "    else    ${t_name}[${byte_size}-1:0]   <=    next_${t_name}[${byte_size}-1:0];\n\n";
1958
          print  OUTFILE "    if(${t_name}_wr_1)    ${t_name}[$(byte_size}-1:${byte_size}]  <=  ${t_name}_wdata[$(byte_size}-1:${byte_size}]  ;\n";
1959
          print  OUTFILE "    else    ${t_name}[$(byte_size}-1:${byte_size}]   <=    next_${t_name}[$(byte_size}-1:${byte_size}];\n\n";
1960
          print  OUTFILE "    if(${t_name}_wr_2)    ${t_name}[${pad_size}+$(byte_size}-1:(${byte_size}*2)]  <=  ${t_name}_wdata[${pad_size}+$(byte_size}-1:(${byte_size}*2)]  ;\n";
1961
          print  OUTFILE "    else    ${t_name}[${pad_size}+$(byte_size}-1:(${byte_size}*2)]   <=    next_${t_name}[${pad_size}+$(byte_size}-1:(${byte_size}*2)];\n\n";
1962
          }
1963
         elsif($reg_byte_lanes == 4)
1964
          {
1965
          print  OUTFILE "    if(${t_name}_wr_0)    ${t_name}[${byte_size}-1:0]  <=  ${t_name}_wdata[${byte_size}-1:0]  ;\n";
1966
          print  OUTFILE "    else    ${t_name}[${byte_size}-1:0]   <=    next_${t_name}[${byte_size}-1:0];\n\n";
1967
          print  OUTFILE "    if(${t_name}_wr_1)    ${t_name}[$(byte_size}-1:${byte_size}]  <=  ${t_name}_wdata[$(byte_size}-1:${byte_size}]  ;\n";
1968
          print  OUTFILE "    else    ${t_name}[$(byte_size}-1:${byte_size}]   <=    next_${t_name}[$(byte_size}-1:${byte_size}];\n\n";
1969
          print  OUTFILE "    if(${t_name}_wr_2)    ${t_name}[(${byte_size}*3)-1:(${byte_size}*2)]  <=  ${t_name}_wdata[(${byte_size}*3)-1:(${byte_size}*2)]  ;\n";
1970
          print  OUTFILE "    else    ${t_name}[(${byte_size}*3)-1:(${byte_size}*2)]   <=    next_${t_name}[(${byte_size}*3)-1:(${byte_size}*2)];\n\n";
1971
          print  OUTFILE "    if(${t_name}_wr_3)    ${t_name}[${pad_size}+(${byte_size}*3)-1:(${byte_size}*3)]  <=  ${t_name}_wdata[${pad_size}+(${byte_size}*3)-1:(${byte_size}*3)]  ;\n";
1972
          print  OUTFILE "    else    ${t_name}[${pad_size}+(${byte_size}*3)-1:(${byte_size}*3)]   <=    next_${t_name}[${pad_size}+(${byte_size}*3)-1:(${byte_size}*3)];\n\n";
1973
          }
1974
 
1975
       print  OUTFILE "\n     end\n\n";
1976
 
1977
 
1978
         }
1979
 
1980
 
1981
 
1982
 
1983
 
1984
 
1985
       }
1986
 
1987
}
1988
 
1989
 
1990
 
1991
 
1992
 
1993
 
1994
 
1995
 
1996
 
1997
 
1998
 
1999
 
2000
 
2001
 
2002
 
2003
 
2004
 
2005
 
2006
 
2007
   print  OUTFILE "\nendmodule \n";
2008
 
2009
 
2010
 
2011
 
2012
 
2013
 
2014
 
2015
close  OUTFILE ;
2016
 
2017
 
2018
1
2019
 
2020
 

powered by: WebSVN 2.1.0

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