OpenCores
URL https://opencores.org/ocsvn/an-fpga-implementation-of-low-latency-noc-based-mpsoc/an-fpga-implementation-of-low-latency-noc-based-mpsoc/trunk

Subversion Repositories an-fpga-implementation-of-low-latency-noc-based-mpsoc

[/] [an-fpga-implementation-of-low-latency-noc-based-mpsoc/] [trunk/] [mpsoc/] [perl_gui/] [lib/] [perl/] [topology_verilog_gen.pl] - Blame information for rev 51

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 48 alirezamon
use strict;
2
use warnings;
3
 
4
use FindBin;
5
use lib $FindBin::Bin;
6
 
7
 
8
 
9
 
10
sub generate_topology_top_v {
11
        my ($self,$info,$dir)=@_;
12
 
13
 
14
        #create topology top file
15
        my $name=$self->object_get_attribute('save_as');
16
 
17
        my $r;
18
        my $top="$dir/${name}_noc.sv";
19
    open my $fd, ">$top" or $r = "$!\n";
20
    if(defined $r) {
21
        add_colored_info($info,"Error in creating $top: $r",'red');
22
                return;
23
    }
24
    print $fd autogen_warning();
25
    print $fd get_license_header($top);
26
 
27
 
28
    my $param_str ="\tparameter TOPOLOGY = \"$name\",
29
\tparameter ROUTE_NAME = \"${name}_DETERMINISTIC\"";
30
 
31
   my @parameters=@{$self->object_get_attribute ('Verilog','Router_param')};
32
   my @ports= @{$self->object_get_attribute('Verilog','Router_ports')};
33
 
34
#       foreach my $d (@parameters){
35
#               $param_str = $param_str.",\n\tparameter $d->{param_name} = $d->{value}";
36
#       }
37
 
38
    my @ends=get_list_of_all_endpoints($self);
39
    my @routers=get_list_of_all_routers($self);
40
 
41
    my $MAX_P=0;
42
    foreach my $p (@routers){
43
        my $Pnum=$self->object_get_attribute("$p",'PNUM');
44
        $MAX_P =$Pnum  if($Pnum>$MAX_P );
45
    }
46
 
47
    my $NE= scalar @ends;
48
    my $NR= scalar @routers;
49
 
50
 
51
 
52
 
53
 
54
        #step 2         add routers
55
        my @nodes=get_list_of_all_routers($self);
56
        my $i=0;
57
 
58
        my $ports="\treset,
59
\tclk";
60
        my $wires='',
61
        my $routers='';
62
 
63
        foreach my $p (@ends){
64
                my $instance= $self->object_get_attribute("$p","NAME");
65
                $ports=$ports.",\n\t//$instance";
66
                $wires=$wires."
67
        /*******************
68
        *               $instance
69
        *******************/
70
";
71
 
72
                $wires=$wires."\tinput  smartflit_chanel_t ${instance}_chan_in;\n";
73
                $wires=$wires."\toutput smartflit_chanel_t ${instance}_chan_out;\n";
74
                $ports=$ports.",\n\t${instance}_chan_in,\n\t${instance}_chan_out";
75
 
76
                foreach my $d (@ports){
77
                                my $range = ($d->{pwidth} eq 1)? " " :  " [$d->{pwidth}-1 : 0]";
78
                                my $type=$d->{type};
79
                                my $ctype= ($type eq 'input')? 'output' : 'input';
80
                                if( $d->{endp} eq "yes"){
81
                                        #$wires=$wires."\t$type $range ${instance}_$d->{pname};\n";
82
                                        #$wires=$wires."\t$ctype $range ${instance}_$d->{pconnect};\n";
83
                                        #$ports=$ports.",\n\t${instance}_$d->{pname},\n\t${instance}_$d->{pconnect}";
84
                                }
85
                }
86
        }
87
 
88
 
89
        foreach my $p (@nodes){
90
 
91
                my ($wire,$router) = get_router_instance_v($self,$p,$i,$NE,$NR,$MAX_P);
92
                $wires=$wires.$wire,
93
                $routers=$routers.$router;
94
 
95
 
96
                $i++;
97
        }
98
 
99
        my $assign="";
100
        foreach my $p (@ends){
101
                my $instance= $self->object_get_attribute("$p","NAME");
102
                my $pname= "Port[0]";
103
                my $connect = $self->{$p}{'PCONNECT'}{$pname};
104
                if(defined $connect){
105
                        my ($cname,$pnode)=split(/\s*,\s*/,$connect);
106
                        my $cinstance= $self->object_get_attribute("$cname","NAME");
107
                        my ($cp)= sscanf("Port[%u]","$pnode");
108
                        #$assign = $assign."//Connect $instance output ports 0 to  $cinstance input ports $cp\n";
109
                        my $cpplus=$cp+1;
110
 
111
 
112
                        foreach my $p (@ports){
113
                                my $w=$p->{pwidth};
114
                                my $range = ($w eq 1)?  " " : "[$w-1 :           0 ]";
115
                                my $crange = ($w eq 1)? "[$cp]" : "[($cpplus*$w)-1 :     $cp*$w ]";
116
                                my $cport =  "${cinstance}_$p->{connect}";
117
                                my $port ="${instance}_$p->{pconnect}";
118
                                if($p->{type} eq 'input' ){
119
                                        # $assign=  $assign."\t\tassign  $port $range = $cport $crange;\n" if($p->{endp} eq "yes");             
120
                                }else{
121
                                        # $assign=  $assign."\t\tassign  $cport $crange= $port $range;\n" if($p->{endp} eq "yes");              
122
                                }
123
 
124
                         }      #@port
125
                }
126
 
127
        }
128
 
129
 
130
 
131
 
132
         print $fd "
133
module   ${name}_noc
134
        import pronoc_pkg::*;
135
        (
136
   $ports
137
);
138
 
139
         function integer log2;
140
      input integer number; begin
141
         log2=(number <=1) ? 1: 0;
142
         while(2**log2<number) begin
143
            log2=log2+1;
144
         end
145
      end
146
    endfunction // log2
147
 
148
        localparam
149
                NE = $NE,
150
                NR = $NR,
151
                RAw=log2(NR);
152
 
153
 
154
 
155
 
156
    input reset,clk;
157
 
158
    $wires
159
 
160
    $routers
161
 
162
    $assign
163
 
164
endmodule
165
";
166
        add_info($info,"$top file is created\n  ");
167
        close $fd;
168
 
169
 
170
}
171
 
172
 
173
 
174
 
175
sub get_router_instance_v {
176
        my ($self,$rname,$current_r,$NE,$NR,$MAX_P)=@_;
177
 
178
 
179
        my $instance= $self->object_get_attribute("$rname","NAME");
180
        my $Pnum=$self->object_get_attribute("$rname",'PNUM');
181
 
182
        #read ruter parameters and ports
183
         my @parameters=@{$self->object_get_attribute ('Verilog','Router_param')};
184
     my @ports= @{$self->object_get_attribute('Verilog','Router_ports')};
185
 
186
        my $wires_v="
187
        /*******************
188
        *               $instance
189
        *******************/
190
\twire ${instance}_clk;
191
\twire ${instance}_reset;
192
 
193
\twire [RAw-1 :  0] ${instance}_current_r_addr;
194
 
195
\tsmartflit_chanel_t    ${instance}_chan_in   [$Pnum-1 : 0];
196
\tsmartflit_chanel_t    ${instance}_chan_out  [$Pnum-1 : 0];
197
 
198
";
199
 
200
 
201
 
202
 
203
        my $router_v="
204
        /*******************
205
        *               $instance
206
        *******************/
207
        router_top #(
208
                .P($Pnum)
209
        )
210
        $instance
211
        (
212
                .clk(${instance}_clk),
213
                .reset(${instance}_reset),
214
                .current_r_addr  (${instance}_current_r_addr),
215
                .chan_in   (${instance}_chan_in),
216
                .chan_out  (${instance}_chan_out)
217
        );
218
";
219
 
220
 
221
$router_v= $router_v."
222
\t\tassign ${instance}_clk = clk;
223
\t\tassign ${instance}_reset = reset;
224
\t\tassign ${instance}_current_r_addr = $current_r;
225
";
226
 
227
 
228
 
229
 
230
for (my $i=0;$i<$Pnum; $i++){
231
        my $pname= "Port[${i}]";
232
        my $connect = $self->{$rname}{'PCONNECT'}{$pname};
233
        my $iplus=$i+1;
234
        if(defined $connect){
235
                my ($cname,$pnode)=split(/\s*,\s*/,$connect);
236
                my $cinstance= $self->object_get_attribute("$cname","NAME");
237
                my $ctype = $self->object_get_attribute("$cname",'TYPE');
238
                my ($cp)= sscanf("Port[%u]","$pnode");
239
                $router_v = $router_v."//Connect $instance port $i to  $cinstance port $cp\n";
240
                if($ctype ne 'ENDP'){
241
                        $router_v.=" \t\tassign ${instance}_chan_in [$i]   = ${cinstance}_chan_out [$cp];\n";
242
                }else{
243
                        $router_v.=" \t\tassign ${instance}_chan_in [$i]  = ${cinstance}_chan_in;\n";
244
                        $router_v.=" \t\tassign ${cinstance}_chan_out = ${instance}_chan_out [$i];\n";
245
                }
246
                my $cpplus=$cp+1;
247
 
248
                #{name=> "flit_in_all", type=>"input", width=>"PFw", connect=>"flit_out_all",  pwidth=>"Fw" },
249
 
250
 
251
 
252
                foreach my $p (@ports){
253
                        my $w=$p->{pwidth};
254
                        my $range = ($w eq 1)?  "[$i]" : "[($iplus*$w)-1 :               $i*$w ]";
255
                        my $crange = ($ctype eq 'ENDP') ? '' :
256
                        ($w eq 1)? "[$cp]"      : "[($cpplus*$w)-1 :     $cp*$w ]";
257
                        my $cport = ($ctype eq 'ENDP') ? "${cinstance}_$p->{pname}" : "${cinstance}_$p->{connect}";
258
                        my $port ="${instance}_$p->{name}";
259
                        if($ctype eq 'ENDP' && $p->{endp} eq "no" && $p->{type} eq 'input' ){
260
                                # $router_v=  $router_v."\t\tassign  $port $range = 0;\n";              
261
 
262
                        }else{
263
                                if($p->{type} eq 'input' ){
264
                                # $router_v=  $router_v."\t\tassign  $port $range = $cport $crange;\n";         
265
                                }else{
266
                                # $router_v=  $router_v."\t\tassign  $cport $crange= $port $range;\n";  
267
                                }
268
                        }
269
                 }      #@port
270
 
271
        }else {
272
                        $router_v = $router_v."//Connect $instance port $i to  ground
273
\t      assign  ${instance}_chan_in [$i]= {CHANEL_w{1'b0}};\n";
274
 
275
                        foreach my $p (@ports){
276
                                my $w=$p->{pwidth};
277
                                my $range = ($w eq 1)?  "[$i]" : "[($iplus*$w)-1 :               $i*$w ]";
278
                                if($p->{type} eq 'input' ){
279
                                #       $router_v=  $router_v."\t\tassign  ${instance}_$p->{name} $range = \{$w\{1'b0\}\};\n";          
280
                                }
281
                        }
282
        }
283
 
284
}
285
 
286
 
287
        return ($wires_v,$router_v);
288
}
289
 
290
 
291
 
292
#*******************
293
#       generate_topology_top_genvar_v
294
#********************
295
 
296
 
297
sub generate_topology_top_genvar_v{
298
        my ($self,$info,$dir)=@_;
299
 
300
 
301
        #create topology top file
302
        my $name=$self->object_get_attribute('save_as');
303
        my $r;
304
        my $top="$dir/${name}_noc_genvar.sv";
305
    open my $fd, ">$top" or $r = "$!\n";
306
    if(defined $r) {
307
        add_colored_info($info,"Error in creating $top: $r",'red');
308
                return;
309
    }
310
    print $fd autogen_warning();
311
    print $fd get_license_header($top);
312
 
313
 
314
    my $param_str ="\tparameter TOPOLOGY = \"$name\",
315
\tparameter ROUTE_NAME = \"${name}_DETERMINISTIC\"";
316
 
317
   my @parameters=@{$self->object_get_attribute ('Verilog','Router_param')};
318
   my @ports= @{$self->object_get_attribute('Verilog','Router_ports')};
319
 
320
        foreach my $d (@parameters){
321
                $param_str = $param_str.",\n\tparameter $d->{param_name} = $d->{value}";
322
        }
323
 
324
    my @ends=get_list_of_all_endpoints($self);
325
    my @routers=get_list_of_all_routers($self);
326
 
327
    my $MAX_P=0;
328
    foreach my $p (@routers){
329
        my $Pnum=$self->object_get_attribute("$p",'PNUM');
330
        $MAX_P =$Pnum  if($Pnum>$MAX_P );
331
    }
332
 
333
    my $NE= scalar @ends;
334
    my $NR= scalar @routers;
335
 
336
 
337
 
338
        my @nodes=get_list_of_all_routers($self);
339
        my $i=0;
340
 
341
        my $ports="\treset,
342
\tclk,
343
\tchan_in_all,
344
\tchan_out_all
345
";
346
    my $ports_def="
347
\tinput  reset;
348
\tinput  clk;
349
\tinput  smartflit_chanel_t chan_in_all  [NE-1 : 0];
350
\toutput smartflit_chanel_t chan_out_all [NE-1 : 0];
351
 
352
//all routers port
353
\tsmartflit_chanel_t    router_chan_in   [NR-1 :0][MAX_P-1 : 0];
354
\tsmartflit_chanel_t    router_chan_out  [NR-1 :0][MAX_P-1 : 0];
355
 
356
\twire [RAw-1 : 0] current_r_addr [NR-1 : 0];
357
 
358
 
359
";
360
 
361
        my $router_wires="";
362
        my $endps_wires="";
363
 
364
 
365
 
366
 
367
        foreach my $d (@ports){
368
                my $range = ($d->{width} eq 1)? " " :  " [$d->{width}-1 : 0]";
369
                my $pdef_range = ($d->{pwidth} eq 1)? "[NE-1 : 0]" : "[(NE*$d->{pwidth})-1 : 0]";
370
                my $endp_range = "[$d->{pwidth}-1 : 0]";
371
                my $type=$d->{type};
372
                my $ctype= ($type eq 'input')? 'output' : 'input';
373
                if( $d->{endp} eq "yes"){
374
                        #$ports_def=$ports_def."\t$type $pdef_range $d->{name};\n";
375
                        #$ports_def=$ports_def."\t$ctype $pdef_range $d->{connect};\n";                 
376
                        #$ports=$ports.",\n\t$d->{name},\n\t$d->{connect}";
377
                }
378
                        if($d->{width} eq 1){
379
                                #$router_wires=$router_wires. "\twire [NR-1 :0] router_$d->{name};\n";
380
                                #$router_wires=$router_wires. "\twire [NR-1 :0] router_$d->{connect};\n";
381
                        }else{
382
                                #$router_wires=$router_wires. "\twire $range router_$d->{name} [NR-1 :0];\n";
383
                                #$router_wires=$router_wires. "\twire $range router_$d->{connect} [NR-1 :0];\n";
384
                        }
385
                if( $d->{endp} eq "yes"){
386
                    if($d->{pwidth} eq 1){
387
                        #$endps_wires=$endps_wires. "\twire [NE-1 :0] ni_$d->{pname};\n";
388
                                #$endps_wires=$endps_wires. "\twire [NE-1 :0] ni_$d->{pconnect};\n";
389
                    }else{
390
                                #$endps_wires=$endps_wires. "\twire $endp_range ni_$d->{pname} [NE-1 :0];\n";
391
                                #$endps_wires=$endps_wires. "\twire $endp_range ni_$d->{pconnect} [NE-1 :0];\n";
392
                    }
393
 
394
                }
395
        }
396
 
397
 
398
 
399
 
400
        #step 2         add routers
401
        my $Tnum=1;
402
 
403
        my $routers='
404
        genvar i;
405
        generate
406
        ';
407
        my $offset=0;
408
        my $assign="";
409
        my $assign_h="";
410
        my $init_h="";
411
        my %new_h;
412
        my $addr=0;
413
        for ( my $i=2;$i<=12; $i++){
414
                my $n= $self->object_get_attribute("ROUTER${i}","NUM");
415
                $n=0 if(!defined $n);
416
                if($n>0){
417
 
418
                        for(my $rr=0; $rr<$n; $rr=$rr+1) {
419
                                my $pos= ($offset==0)? $rr : $rr+$offset;
420
                                $new_h{"TNUM_${pos}"}="$Tnum";
421
                                $new_h{"RNUM_${pos}"}="$rr";
422
 
423
                                $init_h.="router${Tnum}[$rr]->current_r_addr=$addr;\n";
424
                                $addr++;
425
                        }
426
                        $offset+=       $n;
427
                        $Tnum++;
428
                }
429
        }
430
 
431
 
432
 
433
 
434
 
435
 
436
 
437
        $offset=0;
438
 
439
        for ( my $i=2;$i<=12; $i++){
440
                my $n= $self->object_get_attribute("ROUTER${i}","NUM");
441
                $n=0 if(!defined $n);
442
                if($n>0){
443
                        my $router_pos= ($offset==0)? 'i' : "i+$offset";
444
                        #my $instant=get_router_genvar_instance_v($self,$i,$router_pos,$NE,$NR,$MAX_P);
445
 
446
                        $routers=$routers."
447
\tfor( i=0; i<$n; i=i+1) begin : router_${i}_port_lp
448
 
449
        router_top #(
450
                .P($i)
451
        )
452
        router_${i}_port
453
        (
454
                .clk(clk),
455
                .reset(reset),
456
                .current_r_addr($router_pos),
457
                .chan_in  (router_chan_in\[$router_pos\]),
458
                .chan_out (router_chan_out\[$router_pos\])
459
        );
460
 
461
 
462
 
463
\tend
464
                        ";
465
 
466
                        for ( my $j=0;$j<$n; $j++){
467
                                my $rname ="ROUTER${i}_$j";
468
                                my ($ass_v,$ass_h)=get_wires_assignment_genvar_v($self,$rname,0,\%new_h);
469
 
470
                                $assign=$assign.$ass_v;
471
                                $assign_h.=$ass_h;
472
                        }
473
 
474
                $offset+=       $n;
475
 
476
                }
477
        }
478
 
479
 
480
$routers.="endgenerate\n";
481
 
482
 
483
 
484
 
485
 
486
 
487
         print $fd "
488
module   ${name}_noc_genvar
489
   import pronoc_pkg::*;
490
        (
491
 
492
    reset,
493
    clk,
494
    chan_in_all,
495
    chan_out_all
496
);
497
 
498
         function integer log2;
499
      input integer number; begin
500
         log2=(number <=1) ? 1: 0;
501
         while(2**log2<number) begin
502
            log2=log2+1;
503
         end
504
      end
505
    endfunction // log2
506
 
507
        localparam
508
                NE = $NE,
509
                NR = $NR,
510
                RAw=log2(NR),
511
                MAX_P=$MAX_P;
512
 
513
 
514
$ports_def
515
 
516
$router_wires
517
 
518
$endps_wires
519
 
520
$routers
521
 
522
$assign
523
 
524
 
525
 
526
endmodule
527
";
528
 
529
        close $fd;
530
        add_info($info,"$top file is created\n  ");
531
 
532
        my $project_dir = get_project_dir();
533
        $project_dir= "$project_dir/mpsoc";
534
        my $src_verilator_dir="$project_dir/src_verilator/topology/custom";
535
        mkpath("$src_verilator_dir",1,01777) unless -f $src_verilator_dir;
536
    $top="$src_verilator_dir/${name}_noc.h";
537
    open $fd, ">$top" or $r = "$!\n";
538
    if(defined $r) {
539
        add_colored_info($info,"Error in creating $top: $r",'red');
540
                return;
541
    }
542
    print $fd "
543
 
544
 
545
 
546
void topology_connect_all_nodes (void){
547
         $assign_h
548
}
549
 
550
void topology_init(void){
551
        $init_h
552
}
553
";
554
    close $fd;
555
        add_info($info,"$top file is created\n  ");
556
 
557
}
558
 
559
 
560
 
561
 
562
sub get_router_genvar_instance_v{
563
        my ($self,$Pnum,$router_pos,$NE,$NR,$MAX_P)=@_;
564
 
565
        #read ruter parameters and ports
566
        my @parameters=@{$self->object_get_attribute ('Verilog','Router_param')};
567
    my @ports= @{$self->object_get_attribute('Verilog','Router_ports')};
568
 
569
 
570
 
571
        my $router_v="
572
 
573
        router_top #(
574
                .P($Pnum)
575
        )
576
        router_${Pnum}_port
577
        (
578
                .clk(clk),
579
                .reset(reset),
580
                .current_r_addr($router_pos),
581
                .chan_in (router_chan_in\[$router_pos\]),
582
                .chan_out(router_chan_out\[$router_pos\])
583
        );
584
 
585
 
586
 
587
";
588
 
589
return $router_v;
590
 
591
 
592
}
593
 
594
 
595
sub get_wires_assignment_genvar_v{
596
        my ($self,$rname,$reverse,$cref)=@_;
597
    $reverse = 0 if(!defined $reverse);
598
        my $instance= $self->object_get_attribute("$rname","NAME");
599
        my $Pnum=$self->object_get_attribute("$rname",'PNUM');
600
 
601
        #read ruter parameters and ports
602
         my @parameters=@{$self->object_get_attribute ('Verilog','Router_param')};
603
     my @ports= @{$self->object_get_attribute('Verilog','Router_ports')};
604
 
605
        my $assign="";
606
        my $ass_h="";
607
 
608
        my @ends=get_list_of_all_endpoints($self);
609
    my @routers=get_list_of_all_routers($self);
610
 
611
        my $pos = get_scolar_pos($rname,@routers);
612
        my $type = "ROUTER";
613
        if(!defined $pos){
614
                $pos = get_scolar_pos($rname,@ends);
615
                $type = "ENDP";
616
        }
617
 
618
        my %rinfo = %{$cref} if (defined $cref);
619
 
620
for (my $i=0;$i<$Pnum; $i++){
621
        my $pname= "Port[${i}]";
622
        my $connect = $self->{$rname}{'PCONNECT'}{$pname};
623
        my $iplus=$i+1;
624
        if(defined $connect){
625
                my ($cname,$pnode)=split(/\s*,\s*/,$connect);
626
                my $cinstance= $self->object_get_attribute("$cname","NAME");
627
                my $ctype = $self->object_get_attribute("$cname",'TYPE');
628
                my ($cp)= sscanf("Port[%u]","$pnode");
629
                $assign.="//Connect $instance input ports $i to  $cinstance output ports $cp\n";
630
                $ass_h.="//Connect $instance input ports $i to  $cinstance output ports $cp\n";
631
 
632
                my $cpos =($ctype eq 'ENDP')?  get_scolar_pos($cname,@ends) :  get_scolar_pos($cname,@routers);
633
 
634
                my $cpplus=$cp+1;
635
                my $cposplus = $cpos+1;
636
                my $posplus=$pos+1;
637
                #{name=> "flit_in_all", type=>"input", width=>"PFw", connect=>"flit_out_all",  pwidth=>"Fw" },
638
 
639
                my $TNUM_pos  = $rinfo{"TNUM_${pos}"};
640
                my $RNUM_pos  = $rinfo{"RNUM_${pos}"};
641
                my $TNUM_cpos = $rinfo{"TNUM_${cpos}"};
642
                my $RNUM_cpos = $rinfo{"RNUM_${cpos}"};
643
 
644
                #$assign = $assign."//connet  $instance input port $i to  $cinstance output port $cp\n";
645
                if($type  ne 'ENDP'  &&  $ctype eq 'ENDP'){
646
                        $assign=  $assign."\t\tassign  router_chan_in \[$pos\]\[$i\] = chan_in_all \[$cpos\];\n" if($reverse==0);
647
                        $assign=  $assign."\t\tassign  chan_in_all \[$cpos\] = router_chan_in \[$pos\]\[$i\];\n" if($reverse==1);
648
 
649
                        $assign=  $assign."\t\tassign  chan_out_all \[$cpos\] = router_chan_out \[$pos\]\[$i\];\n" if($reverse==0);
650
                        $assign=  $assign."\t\tassign  router_chan_out \[$pos\]\[$i\] = chan_out_all \[$cpos\];\n" if($reverse==1);
651
 
652
                        $ass_h.=  "\tconnect_r2e($TNUM_pos,$RNUM_pos,$i,$cpos);\n"      if (defined $TNUM_pos);
653
 
654
 
655
                }elsif ($type  ne 'ENDP'  &&  $ctype ne 'ENDP'){
656
                        $assign=  $assign."\t\tassign  router_chan_in \[$pos\]\[$i\] = router_chan_out \[$cpos\]\[$cp\];\n" if($reverse==0);
657
                        $assign=  $assign."\t\tassign  router_chan_out \[$cpos\]\[$cp\] = router_chan_in \[$pos\]\[$i\];\n" if($reverse==1);
658
                        $ass_h.=  "\tconect_r2r($TNUM_pos,$RNUM_pos,$i,$TNUM_cpos,$RNUM_cpos,$cp);\n" if (defined $TNUM_pos);
659
 
660
                }
661
 
662
 
663
 
664
 
665
 
666
        }else {
667
                        my $TNUM_pos  = $rinfo{"TNUM_${pos}" };
668
                        my $RNUM_pos  = $rinfo{"RNUM_${pos}" };
669
 
670
                        $assign = $assign."//Connect $instance port $i to  ground\n";
671
                        $ass_h.="//Connect $instance port $i to  ground\n";
672
                        $assign=  $assign."\t\tassign  router_chan_in  \[$pos\]\[$i\] ={CHANEL_w{1'b0}};\n      " if($reverse==0);
673
                        $assign=  $assign."\t\tassign  router_chan_out \[$pos\]\[$i\] ={CHANEL_w{1'b0}};\n      " if($reverse==1);
674
                        $ass_h.=  "\tconnect_r2gnd($TNUM_pos,$RNUM_pos,$i);\n" if (defined $TNUM_pos);
675
        }
676
 
677
}
678
 
679
        return ($assign,$ass_h);
680
}
681
 
682
 
683
 
684
 
685
 
686
sub generate_routing_v {
687
        my ($self,$info,$dir)=@_;
688
 
689
        my @ends=get_list_of_all_endpoints($self);
690
        my @routers=get_list_of_all_routers($self);
691
 
692
#########################       
693
#  conventional_routing
694
#########################
695
 
696
 
697
        #create routing file
698
        my $name=$self->object_get_attribute('save_as');
699
        my $rname=$self->object_get_attribute('routing_name');
700
        my $Vname="T${name}R${rname}";
701
 
702
        my $r;
703
        my $top="$dir/${Vname}_conventional_routing.v";
704
    open my $fd, ">$top" or $r = "$!\n";
705
    if(defined $r) {
706
        add_colored_info($info,"Error in creating $top: $r",'red');
707
                return;
708
    }
709
    print $fd autogen_warning();
710
    print $fd get_license_header($top);
711
 
712
 
713
 
714
 
715
 
716
        my $route_str="\talways@(*)begin
717
\t\tdestport=0;
718
\t\tcase(src_e_addr) //source address of each individual NI is fixed. So this CASE will be optimized by the synthesizer for each endpoint.
719
";
720
 
721
        foreach my $src (@ends){
722
                my $PNUM=$self->object_get_attribute($src,"PNUM");
723
                my $src_num=get_scolar_pos($src,@ends);
724
            my %route;
725
                $route_str=$route_str."\t\t$src_num: begin
726
\t\t\tcase(dest_e_addr)
727
";
728
 
729
                foreach my $dst (@ends){
730
                            my $dest_num = get_scolar_pos($dst,@ends);
731
                                my $ref = $self->object_get_attribute('Route',"${src}::$dst");
732
                                next if(!defined $ref);
733
                                my @path = @{$ref};
734
                                my ($p1,$p2)= get_connection_port_num_between_two_nodes($self,$path[1],$path[2] );
735
                                #print " ($p1,$p2)= get_connection_port_num_between_two_nodes($self,$path[1],$path[2] );\n";
736
                                $route{$p1} = (defined $route{$p1})? $route{$p1}.",$dest_num" : "$dest_num";
737
                }
738
                foreach my $q (sort {$a <=> $b} keys %route){
739
                        $route_str=$route_str."\t\t\t$route{$q}: begin
740
\t\t\t\tdestport= $q;
741
\t\t\tend
742
";
743
                }
744
                $route_str=$route_str."
745
\t\t\tdefault: begin
746
\t\t\t\tdestport= {DSTPw{1\'bX}};
747
\t\t\tend
748
\t\t\tendcase\n\t\tend//$src_num\n";
749
        }
750
        $route_str=$route_str."
751
\t\tdefault: begin
752
\t\t\tdestport= {DSTPw{1\'bX}};
753
\t\tend
754
\t\tendcase\n\tend\n";
755
 
756
 
757
 
758
         print $fd "module ${Vname}_conventional_routing  #(
759
\tparameter RAw = 3,
760
\tparameter EAw = 3,
761
\tparameter DSTPw=4
762
)
763
(
764
\tdest_e_addr,
765
\tsrc_e_addr,
766
\tdestport
767
);
768
 
769
\tinput   [EAw-1   :0] dest_e_addr;
770
\tinput   [EAw-1   :0] src_e_addr;
771
\toutput reg [DSTPw-1 :0] destport;
772
 
773
 
774
$route_str
775
 
776
 
777
endmodule
778
 
779
";
780
close($fd);
781
add_info($info,"$top file is created\n  ");
782
 
783
##################
784
#   look_ahead_routing
785
###################
786
 
787
#create routing file
788
        $top="$dir/${Vname}_look_ahead_routing.v";
789
    open  $fd, ">$top" or $r = "$!\n";
790
    if(defined $r) {
791
        add_colored_info($info,"Error in creating $top: $r",'red');
792
                return;
793
    }
794
    print $fd autogen_warning();
795
    print $fd get_license_header($top);
796
 
797
 
798
        $route_str="\talways@(*)begin
799
\t\tdestport=0;
800
\t\tcase(current_r_addr) //current_r_addr of each individual router is fixed. So this CASE will be optimized by the synthesizer for each router.
801
";
802
 
803
 
804
 
805
foreach my $router (@routers){
806
                my $PNUM=$self->object_get_attribute($router,"PNUM");
807
                my $router_num=get_scolar_pos($router,@routers);
808
            my %route;
809
                $route_str=$route_str."\t\t$router_num: begin
810
\t\t\tcase({src_e_addr,dest_e_addr})
811
";
812
        # for each src-dest check if $router include in path 
813
        foreach my $src (@ends){
814
                foreach my $dst (@ends){
815
                        my $ref = $self->object_get_attribute('Route',"${src}::$dst");
816
                        next if(!defined $ref);
817
                        my @path = @{$ref};
818
                    my $loc= get_scolar_pos($router,@path);
819
                    next if(!defined $loc);# this router does not exist in path skip it
820
                    my $next_router1=$path[$loc+1];
821
                    my $next_router2=$path[$loc+2];
822
                    next if(!defined $next_router2);
823
                    my ($p1,$p2)= get_connection_port_num_between_two_nodes($self,$next_router1,$next_router2);
824
                    next if(!defined $p1);
825
                    my $src_num=get_scolar_pos($src,@ends);
826
                    my $dest_num = get_scolar_pos($dst,@ends);
827
                        $route{$p1} = (defined $route{$p1})? $route{$p1}.",{E$src_num,E$dest_num}" : "{E$src_num,E$dest_num}";
828
 
829
                        #print "@path\n";
830
                        #print "(current_router, next_router1, next_router2)=($router, $next_router1, $next_router2)\n";
831
                        #print "($p1,$p2)= get_connection_port_num_between_two_nodes(\$self,$next_router1,$next_router2)\n";    
832
                        #print "\$route{$p1} ={E$src_num,E$dest_num}\n";
833
                        #print"***************************\n"; 
834
 
835
                }
836
        }
837
        foreach my $q (sort {$a <=> $b} keys %route){
838
                        $route_str=$route_str."\t\t\t$route{$q}: begin
839
\t\t\t\tdestport= $q;
840
\t\t\tend
841
";
842
 
843
        }
844
 
845
        $route_str.="\t\t\tdefault: begin
846
\t\t\t\tdestport= {DSTPw{1\'bX}};
847
\t\t\tend
848
\t\t\tendcase\n\t\tend//$router_num\n";
849
        }
850
$route_str.="\t\tdefault: begin
851
\t\t\tdestport= {DSTPw{1\'bX}};
852
\t\tend
853
\t\tendcase\n\tend\n";
854
 
855
 
856
 
857
my $localparam="";
858
        my $i=0;
859
        foreach my $src (@ends){
860
                $localparam= $localparam."localparam [EAw-1 : 0]\tE$i=$i;\n";
861
                $i++;
862
        }
863
 
864
 
865
 
866
 
867
 print $fd "
868
/*******************
869
*  ${Vname}_look_ahead_routing
870
*******************/
871
module ${Vname}_look_ahead_routing  #(
872
\tparameter RAw = 3,
873
\tparameter EAw = 3,
874
\tparameter DSTPw=4
875
)
876
(
877
\treset,
878
\tclk,
879
\tcurrent_r_addr,
880
\tdest_e_addr,
881
\tsrc_e_addr,
882
\tdestport
883
);
884
 
885
\tinput   [RAw-1   :0] current_r_addr;
886
\tinput   [EAw-1   :0] dest_e_addr;
887
\tinput   [EAw-1   :0] src_e_addr;
888
\toutput  [DSTPw-1 :0] destport;
889
\tinput reset,clk;
890
 
891
        reg [EAw-1   :0] dest_e_addr_delay;
892
        reg [EAw-1   :0] src_e_addr_delay;
893
 
894
        always @(posedge clk)begin
895
                if(reset)begin
896
                        dest_e_addr_delay<={EAw{1'b0}};
897
                        src_e_addr_delay<={EAw{1'b0}};
898
                end else begin
899
                        dest_e_addr_delay<=dest_e_addr;
900
                        src_e_addr_delay<=src_e_addr;
901
                end
902
        end
903
 
904
        ${Vname}_look_ahead_routing_comb  #(
905
                .RAw(RAw),
906
                .EAw(EAw),
907
                .DSTPw(DSTPw)
908
        )
909
        lkp_cmb
910
        (
911
                .current_r_addr(current_r_addr),
912
                .dest_e_addr(dest_e_addr_delay),
913
                .src_e_addr(src_e_addr_delay),
914
                .destport(destport)
915
        );
916
 
917
 
918
 
919
endmodule
920
 
921
/*******************
922
*  ${Vname}_look_ahead_routing_comb
923
*******************/
924
 
925
 module ${Vname}_look_ahead_routing_comb  #(
926
\tparameter RAw = 3,
927
\tparameter EAw = 3,
928
\tparameter DSTPw=4
929
)
930
(
931
\tcurrent_r_addr,
932
\tdest_e_addr,
933
\tsrc_e_addr,
934
\tdestport
935
);
936
 
937
\tinput   [RAw-1   :0] current_r_addr;
938
\tinput   [EAw-1   :0] dest_e_addr;
939
\tinput   [EAw-1   :0] src_e_addr;
940
\toutput reg [DSTPw-1 :0] destport;
941
 
942
$localparam
943
 
944
$route_str
945
 
946
 
947
endmodule
948
 
949
 
950
";
951
 
952
close($fd);
953
add_info($info,"$top file is created\n  ");
954
 
955
#########################       
956
#  conventional_routing_genvar
957
#########################
958
 
959
 
960
        #create routing file
961
        $top="$dir/${Vname}_conventional_routing_genvar.v";
962
    open $fd, ">$top" or $r = "$!\n";
963
    if(defined $r) {
964
        add_colored_info($info,"Error in creating $top: $r",'red');
965
                return;
966
    }
967
    print $fd autogen_warning();
968
    print $fd get_license_header($top);
969
 
970
 
971
 
972
 
973
 
974
        $route_str="\tgenerate
975
 
976
";
977
 
978
        foreach my $src (@ends){
979
                my $PNUM=$self->object_get_attribute($src,"PNUM");
980
                my $src_num=get_scolar_pos($src,@ends);
981
            my %route;
982
                $route_str=$route_str."\tif(SRC_E_ADDR == $src_num) begin : SRC$src_num
983
\t\talways@(*)begin
984
\t\t\tdestport= 0;
985
\t\t\tcase(dest_e_addr)
986
";
987
 
988
                foreach my $dst (@ends){
989
                            my $dest_num = get_scolar_pos($dst,@ends);
990
                                my $ref = $self->object_get_attribute('Route',"${src}::$dst");
991
                                next if(!defined $ref);
992
                                my @path = @{$ref};
993
                                my ($p1,$p2)= get_connection_port_num_between_two_nodes($self,$path[1],$path[2] );
994
                                #print " ($p1,$p2)= get_connection_port_num_between_two_nodes($self,$path[1],$path[2] );\n";
995
                                $route{$p1} = (defined $route{$p1})? $route{$p1}.",$dest_num" : "$dest_num";
996
                }
997
                foreach my $q (sort {$a <=> $b} keys %route){
998
                        $route_str=$route_str."\t\t\t$route{$q}: begin
999
\t\t\t\tdestport= $q;
1000
\t\t\tend
1001
";
1002
                }
1003
                $route_str=$route_str."\t\t\tdefault: begin
1004
\t\t\t\tdestport= {DSTPw{1\'bX}};
1005
\t\t\tend
1006
 
1007
\t\t\tendcase\n\t\tend\n\tend//SRC$src_num\n\n";
1008
        }
1009
        $route_str=$route_str."\tendgenerate\n";
1010
 
1011
 
1012
 
1013
         print $fd "module ${Vname}_conventional_routing_genvar  #(
1014
\tparameter RAw = 3,
1015
\tparameter EAw = 3,
1016
\tparameter DSTPw=4,
1017
\tparameter SRC_E_ADDR=0
1018
)
1019
(
1020
\tdest_e_addr,
1021
\tdestport
1022
);
1023
 
1024
\tinput   [EAw-1   :0] dest_e_addr;
1025
\toutput reg [DSTPw-1 :0] destport;
1026
 
1027
 
1028
$route_str
1029
 
1030
 
1031
endmodule
1032
 
1033
";
1034
close($fd);
1035
add_info($info,"$top file is created\n  ");
1036
 
1037
##################
1038
#   look_ahead_routing_genvar
1039
###################
1040
 
1041
#create routing file
1042
        $top="$dir/${Vname}_look_ahead_routing_genvar.v";
1043
    open  $fd, ">$top" or $r = "$!\n";
1044
    if(defined $r) {
1045
        add_colored_info($info,"Error in creating $top: $r",'red');
1046
                return;
1047
    }
1048
    print $fd autogen_warning();
1049
    print $fd get_license_header($top);
1050
 
1051
 
1052
 
1053
        $route_str="\talways@(*)begin
1054
\t\tdestport=0;
1055
\t\tcase(current_r_addr) //current_r_addr of each individual router is fixed. So this CASE will be optimized by the synthesizer for each router.
1056
";
1057
 
1058
$route_str="\tgenerate\n";
1059
 
1060
 
1061
foreach my $router (@routers){
1062
                my $PNUM=$self->object_get_attribute($router,"PNUM");
1063
                my $router_num=get_scolar_pos($router,@routers);
1064
            my %route;
1065
                $route_str=$route_str."\tif(CURRENT_R_ADDR == $router_num) begin :R$router_num
1066
\t\talways@(*)begin
1067
\t\t\tdestport= 0;
1068
\t\t\tcase({src_e_addr,dest_e_addr})
1069
";
1070
        # for each src-dest check if $router include in path 
1071
        foreach my $src (@ends){
1072
                foreach my $dst (@ends){
1073
                        my $ref = $self->object_get_attribute('Route',"${src}::$dst");
1074
                        next if(!defined $ref);
1075
                        my @path = @{$ref};
1076
                    my $loc= get_scolar_pos($router,@path);
1077
                    next if(!defined $loc);# this router does not exist in path skip it
1078
                    my $next_router1=$path[$loc+1];
1079
                    my $next_router2=$path[$loc+2];
1080
                    next if(!defined $next_router2);
1081
                    my ($p1,$p2)= get_connection_port_num_between_two_nodes($self,$next_router1,$next_router2);
1082
                    next if(!defined $p1);
1083
                    my $src_num=get_scolar_pos($src,@ends);
1084
                    my $dest_num = get_scolar_pos($dst,@ends);
1085
                        $route{$p1} = (defined $route{$p1})? $route{$p1}.",{E$src_num,E$dest_num}" : "{E$src_num,E$dest_num}";
1086
 
1087
                        #print "@path\n";
1088
                        #print "(current_router, next_router1, next_router2)=($router, $next_router1, $next_router2)\n";
1089
                        #print "($p1,$p2)= get_connection_port_num_between_two_nodes(\$self,$next_router1,$next_router2)\n";    
1090
                        #print "\$route{$p1} ={E$src_num,E$dest_num}\n";
1091
                        #print"***************************\n"; 
1092
 
1093
                }
1094
        }
1095
        foreach my $q (sort {$a <=> $b} keys %route){
1096
                        $route_str=$route_str."\t\t\t$route{$q}: begin
1097
\t\t\t\tdestport= $q;
1098
\t\t\tend
1099
";
1100
 
1101
        }
1102
 
1103
        $route_str=$route_str."\t\t\tendcase\n\t\tend\n\tend//R$router_num\n\n";
1104
        }
1105
        $route_str=$route_str."\tendgenerate\n";
1106
 
1107
 
1108
 
1109
 print $fd "
1110
/*****************************
1111
*       ${Vname}_look_ahead_routing_genvar
1112
******************************/
1113
module ${Vname}_look_ahead_routing_genvar  #(
1114
\tparameter RAw = 3,
1115
\tparameter EAw = 3,
1116
\tparameter DSTPw=4,
1117
\tparameter CURRENT_R_ADDR=0
1118
)
1119
(
1120
\tdest_e_addr,
1121
\tsrc_e_addr,
1122
\tdestport,
1123
\treset,
1124
\tclk
1125
);
1126
 
1127
\tinput   [EAw-1   :0] dest_e_addr;
1128
\tinput   [EAw-1   :0] src_e_addr;
1129
\toutput  [DSTPw-1 :0] destport;
1130
\tinput reset,clk;
1131
 
1132
        reg [EAw-1   :0] dest_e_addr_delay;
1133
        reg [EAw-1   :0] src_e_addr_delay;
1134
 
1135
        always @(posedge clk)begin
1136
                if(reset)begin
1137
                        dest_e_addr_delay<={EAw{1'b0}};
1138
                        src_e_addr_delay<={EAw{1'b0}};
1139
                end else begin
1140
                        dest_e_addr_delay<=dest_e_addr;
1141
                        src_e_addr_delay<=src_e_addr;
1142
                end
1143
        end
1144
 
1145
        ${name}_look_ahead_routing_genvar_comb  #(
1146
                .RAw(RAw),
1147
                .EAw(EAw),
1148
                .DSTPw(DSTPw),
1149
                .CURRENT_R_ADDR(CURRENT_R_ADDR)
1150
        )
1151
        lkp_cmb
1152
        (
1153
 
1154
                .dest_e_addr(dest_e_addr_delay),
1155
                .src_e_addr(src_e_addr_delay),
1156
                .destport(destport)
1157
        );
1158
 
1159
 
1160
 
1161
endmodule
1162
 
1163
/*******************
1164
* ${Vname}_look_ahead_routing_genvar_comb
1165
********************/
1166
 
1167
 
1168
 module ${Vname}_look_ahead_routing_genvar_comb  #(
1169
\tparameter RAw = 3,
1170
\tparameter EAw = 3,
1171
\tparameter DSTPw=4,
1172
\tparameter CURRENT_R_ADDR=0
1173
)
1174
(
1175
\tdest_e_addr,
1176
\tsrc_e_addr,
1177
\tdestport
1178
);
1179
 
1180
\tinput   [EAw-1   :0] dest_e_addr;
1181
\tinput   [EAw-1   :0] src_e_addr;
1182
\toutput  reg [DSTPw-1 :0] destport;
1183
 
1184
$localparam
1185
 
1186
$route_str
1187
 
1188
 
1189
endmodule
1190
 
1191
 
1192
";
1193
 
1194
 
1195
close($fd);
1196
add_info($info,"$top file is created\n  ");
1197
 
1198
}
1199
 
1200
 
1201
 
1202
sub generate_connection_v{
1203
        my($self,$info,$dir)=@_;
1204
 
1205
        #create connection top file
1206
        my $name=$self->object_get_attribute('save_as');
1207
 
1208
        my $r;
1209
        my $top="$dir/${name}_connection.sv";
1210
    open my $fd, ">$top" or $r = "$!\n";
1211
    if(defined $r) {
1212
        add_colored_info($info,"Error in creating $top: $r",'red');
1213
                return;
1214
    }
1215
    print $fd autogen_warning();
1216
    print $fd get_license_header($top);
1217
 
1218
 
1219
 
1220
 
1221
 
1222
 
1223
 
1224
   my @parameters=@{$self->object_get_attribute ('Verilog','Router_param')};
1225
   my @ports= @{$self->object_get_attribute('Verilog','Router_ports')};
1226
 
1227
 
1228
 
1229
    my @ends=get_list_of_all_endpoints($self);
1230
    my @routers=get_list_of_all_routers($self);
1231
 
1232
    my $MAX_P=0;
1233
    foreach my $p (@routers){
1234
        my $Pnum=$self->object_get_attribute("$p",'PNUM');
1235
        $MAX_P =$Pnum  if($Pnum>$MAX_P );
1236
    }
1237
 
1238
    my $NE= scalar @ends;
1239
    my $NR= scalar @routers;
1240
 
1241
 
1242
 
1243
        my @nodes=get_list_of_all_routers($self);
1244
        my $i=0;
1245
 
1246
        my $ports="\treset,
1247
\tclk,
1248
\tstart_i,
1249
\tstart_o,
1250
\ter_addr,
1251
\tcurrent_r_addr,
1252
\tchan_in_all,
1253
\tchan_out_all,
1254
\trouter_chan_in,
1255
\trouter_chan_out
1256
";
1257
 
1258
 
1259
    my $ports_def="
1260
\tinput reset;
1261
\tinput clk;
1262
\tinput start_i;
1263
\toutput [RAw-1 : 0] er_addr [NE-1 : 0]; // provide router address for each connected endpoint
1264
\toutput [RAw-1 : 0] current_r_addr [NR-1 : 0]; // provide each router current address  ;
1265
\toutput [NE-1 : 0] start_o;
1266
\toutput smartflit_chanel_t chan_in_all [NE-1 : 0];
1267
\tinput  smartflit_chanel_t chan_out_all [NE-1 : 0];
1268
\tinput  smartflit_chanel_t    router_chan_in   [NR-1 :0][MAX_P-1 : 0];
1269
\toutput smartflit_chanel_t    router_chan_out  [NR-1 :0][MAX_P-1 : 0];
1270
 
1271
";
1272
 
1273
        my $router_wires="";
1274
        my $endps_wires="";
1275
 
1276
 
1277
 
1278
 
1279
        foreach my $d (@ports){
1280
                my $range = ($d->{width} eq 1)? " " :  " [$d->{width}-1 : 0]";
1281
                my $pdef_range = ($d->{pwidth} eq 1)? "[NE-1 : 0]" : "[$d->{pwidth}-1 : 0]";
1282
                my $pdef_range2 = ($d->{pwidth} eq 1)? "" : "[NE-1 : 0]";
1283
                #$ports=$ports.",\n\trouter_$d->{name},\n\trouter_$d->{connect}";
1284
                my $type=$d->{type};
1285
                my $ctype= ($type eq 'input')? 'output' : 'input';
1286
                if( $d->{endp} eq "yes"){
1287
                        #$ports_def=$ports_def."\t$type\t$pdef_range ni_$d->{pname} $pdef_range2;\n";
1288
                        #$ports_def=$ports_def."\t$ctype\t$pdef_range ni_$d->{pconnect} $pdef_range2;\n";                       
1289
                        #$ports=$ports.",\n\tni_$d->{pname},\n\tni_$d->{pconnect}";
1290
                }
1291
                if($d->{width} eq 1){
1292
                        #$ports_def=$ports_def. "\t$type\t[NR-1 :0] router_$d->{name};\n";
1293
                        #$ports_def=$ports_def. "\t$ctype\t[NR-1 :0] router_$d->{connect};\n";
1294
                }else{
1295
                        #$ports_def=$ports_def. "\t$type\t$range router_$d->{name} [NR-1 :0];\n";
1296
                        #$ports_def=$ports_def. "\t$ctype\t$range router_$d->{connect} [NR-1 :0];\n";
1297
                }
1298
 
1299
 
1300
        }
1301
 
1302
 
1303
 
1304
 
1305
        my $routers='
1306
        genvar i;
1307
        generate
1308
        ';
1309
        my $offset=0;
1310
        my $assign="";
1311
 
1312
        for ( my $i=2;$i<=12; $i++){
1313
                my $n= $self->object_get_attribute("ROUTER${i}","NUM");
1314
                $n=0 if(!defined $n);
1315
                if($n>0){
1316
                        my $router_pos= ($offset==0)? 'i' : "i+$offset";
1317
                        my $instant=get_router_genvar_instance_v($self,$i,$router_pos,$NE,$NR,$MAX_P);
1318
 
1319
                        $routers=$routers."
1320
\tfor( i=0; i<$n; i=i+1) begin : router_${i}_port_lp
1321
\t\t$instant
1322
 
1323
\tend
1324
                        ";
1325
 
1326
                        for ( my $j=0;$j<$n; $j++){
1327
                                my $rname ="ROUTER${i}_$j";
1328
                                my ($ass_v, $ass_h)=    get_wires_assignment_genvar_v($self,$rname,1);
1329
                                $assign=$assign.$ass_v;
1330
                        }
1331
 
1332
                $offset+=       $n;
1333
 
1334
                }
1335
        }
1336
 
1337
 
1338
 
1339
        foreach my $end (@ends){
1340
                #$assign=$assign.get_wires_assignment_genvar_v($self,$end,1);           
1341
        }
1342
 
1343
        $assign=$assign."\n";
1344
 
1345
 
1346
        my $pos=0;
1347
        $assign.="//The router address connected to each endpoint\n";
1348
        foreach my $end (@ends){
1349
                my $connect = $self->{$end}{'PCONNECT'}{'Port[0]'};
1350
                my ($Rname,$Rport)=split(/\s*,\s*/,$connect);
1351
                my $R = get_scolar_pos($Rname,@routers);
1352
                my $rname = $self->object_get_attribute("$Rname","NAME");
1353
                my $tname = $self->object_get_attribute("$end","NAME");
1354
                $assign=$assign."\tassign er_addr [$pos] = $R; //$tname -> $rname\n";
1355
                $pos++;
1356
        }
1357
 
1358
        $assign=$assign."\n";
1359
 
1360
        $pos=0;
1361
        foreach my $router (@routers){
1362
                my $rname = $self->object_get_attribute("$router","NAME");
1363
                $assign=$assign."\tassign current_r_addr [$pos] = $pos; // $rname\n";
1364
                $pos++;
1365
        }
1366
 
1367
 
1368
 
1369
 
1370
                 print $fd "
1371
module  ${name}_connection
1372
        import pronoc_pkg::*;
1373
(
1374
    $ports
1375
);
1376
 
1377
         function integer log2;
1378
      input integer number; begin
1379
         log2=(number <=1) ? 1: 0;
1380
         while(2**log2<number) begin
1381
            log2=log2+1;
1382
         end
1383
      end
1384
    endfunction // log2
1385
 
1386
        localparam
1387
                NE = $NE,
1388
                NR = $NR,
1389
                RAw=log2(NR),
1390
                MAX_P=$MAX_P;
1391
 
1392
 
1393
 
1394
 
1395
 
1396
 
1397
 
1398
 
1399
 
1400
        localparam
1401
                P= MAX_P,
1402
        PV = V * P,
1403
        PFw = P * Fw,
1404
        CONG_ALw = CONGw * P,
1405
        PRAw = P * RAw;
1406
 
1407
 
1408
 
1409
 
1410
 
1411
 
1412
$ports_def
1413
 
1414
$router_wires
1415
 
1416
$endps_wires
1417
 
1418
 
1419
$assign
1420
 
1421
 
1422
        start_delay_gen #(
1423
        .NC(NE)
1424
    )
1425
    delay_gen
1426
    (
1427
        .clk(clk),
1428
        .reset(reset),
1429
        .start_i(start_i),
1430
        .start_o(start_o)
1431
    );
1432
 
1433
 
1434
endmodule
1435
";
1436
 
1437
        add_info($info,"$top file is created\n  ");
1438
        close $fd;
1439
 
1440
 
1441
 
1442
}
1443
 
1444
 
1445
 
1446
 
1447
 
1448
sub add_routing_instance_v{
1449
        my ($self,$info,$dir)=@_;
1450
        my $name=$self->object_get_attribute('save_as');
1451
        my $rname=$self->object_get_attribute('routing_name');
1452
        my $Vname="T${name}R${rname}";
1453
        #####################################
1454
        #                       custom_ni_routing
1455
        ####################################
1456
        my $str="
1457
        //do not modify this line ===${Vname}===
1458
    if(TOPOLOGY == \"$name\" && ROUTE_NAME== \"$rname\" ) begin : $Vname
1459
 
1460
        ${Vname}_conventional_routing  #(
1461
            .RAw(RAw),
1462
            .EAw(EAw),
1463
            .DSTPw(DSTPw)
1464
        )
1465
        the_conventional_routing
1466
        (
1467
            .dest_e_addr(dest_e_addr),
1468
            .src_e_addr(src_e_addr),
1469
            .destport(destport)
1470
        );
1471
 
1472
    end
1473
 
1474
    endgenerate
1475
 
1476
";
1477
 
1478
        my $file = "$dir/../common/custom_ni_routing.v";
1479
        #check if ***$name**** exist in the file
1480
        unless (-f $file){
1481
                add_colored_info($info,"$file dose not exist\n",'red');
1482
                return;
1483
        }
1484
        my $r = check_file_has_string($file, "===${Vname}===");
1485
        if ($r==1){
1486
                add_info($info,"The instance  ${Vname}_conventional_routing exists in $file. This file is not modified\n  ",'blue');
1487
 
1488
        }else{
1489
                my $text = read_file_cntent($file,' ');
1490
        my @a = split('endgenerate',$text);
1491
        save_file($file,"$a[0] $str $a[1]");
1492
        add_info($info,"$file has been modified. The  ${Vname}_conventional_routing has been added to the file\n  ",'blue');
1493
 
1494
        }
1495
 
1496
 
1497
 
1498
        #####################################
1499
        #                       custom_lkh_routing
1500
        ####################################
1501
         $str="
1502
        //do not modify this line ===${Vname}===
1503
    if(TOPOLOGY == \"$name\" && ROUTE_NAME== \"$rname\" ) begin : ${Vname}
1504
 
1505
           ${Vname}_look_ahead_routing  #(
1506
            .RAw(RAw),
1507
            .EAw(EAw),
1508
            .DSTPw(DSTPw)
1509
        )
1510
        the_lkh_routing
1511
        (
1512
            .current_r_addr(current_r_addr),
1513
            .dest_e_addr(dest_e_addr),
1514
            .src_e_addr(src_e_addr),
1515
            .destport(destport),
1516
            .reset(reset),
1517
            .clk(clk)
1518
        );
1519
 
1520
    end
1521
 
1522
    endgenerate
1523
 
1524
";
1525
 
1526
        $file = "$dir/../common/custom_lkh_routing.v";
1527
 
1528
        unless (-f $file){
1529
                add_colored_info($info,"$file dose not exist\n",'red');
1530
                return;
1531
        }
1532
        $r = check_file_has_string($file, "===${Vname}===");
1533
        if ($r==1){
1534
                add_info($info,"The instance ${Vname}_look_ahead_routing exist in $file. This file is not modified\n  ",'blue');
1535
 
1536
        }else{
1537
                my $text = read_file_cntent($file,' ');
1538
        my @a = split('endgenerate',$text);
1539
        save_file($file,"$a[0] $str $a[1]");
1540
        add_info($info,"$file has been modified. The  ${Vname}_look_ahead_routing has been added to the file\n  ",'blue');
1541
 
1542
        }
1543
 
1544
 
1545
}
1546
 
1547
sub add_noc_instance_v{
1548
        my ($self,$info,$dir)=@_;
1549
        my $name=$self->object_get_attribute('save_as');
1550
 
1551
        #####################################
1552
        #                       add connection
1553
        ####################################
1554
 
1555
        my $ports="\t\t.reset(reset),
1556
\t\t.clk(clk),
1557
\t\t.start_i(start_i),
1558
\t\t.start_o(start_o),
1559
\t\t.er_addr(er_addr),
1560
\t\t.current_r_addr(current_r_addr),
1561
\t\t.chan_in_all(chan_in_all),
1562
\t\t.chan_out_all(chan_out_all),
1563
\t\t.router_chan_in(router_chan_in),
1564
\t\t.router_chan_out(router_chan_out)
1565
 
1566
 
1567
";
1568
 
1569
 
1570
 
1571
 
1572
        my $str="
1573
        //do not modify this line ===${name}===
1574
    if(TOPOLOGY == \"$name\" ) begin : T$name
1575
 
1576
        ${name}_connection  connection
1577
        (
1578
$ports
1579
        );
1580
 
1581
    end
1582
 
1583
    endgenerate
1584
 
1585
";
1586
 
1587
        #my $file = "$dir/../common/custom_noc_connection.sv";  
1588
        #check if ***$name**** exist in the file
1589
        #unless (-f $file){
1590
        #       add_colored_info($info,"$file dose not exist\n",'red');
1591
        #       return; 
1592
        #}      
1593
        #my $r = check_file_has_string($file, "===${name}==="); 
1594
        #if ($r==1){
1595
                #add_info($info,"The instance  ${name}_connection exists in $file. This file is not modified\n  ",'blue');
1596
 
1597
        #}else{
1598
                #my $text = read_file_cntent($file,' ');
1599
       # my @a = split('endgenerate',$text);
1600
      #  save_file($file,"$a[0] $str $a[1]");
1601
       # add_info($info,"$file has been modified. The  ${name}_connection has been added to the file\n  ",'blue');
1602
 
1603
        #}
1604
 
1605
 
1606
        #####################################
1607
        #               add NoC 
1608
        ####################################
1609
 
1610
 
1611
         my $param_str ="\t\t.TOPOLOGY(TOPOLOGY),
1612
\t\t.ROUTE_NAME(ROUTE_NAME)";
1613
 
1614
   my @parameters=@{$self->object_get_attribute ('Verilog','Router_param')};
1615
 
1616
        foreach my $d (@parameters){
1617
                $param_str = $param_str.",\n\t\t.$d->{param_name}($d->{param_name})";
1618
        }
1619
 
1620
        $ports="\t\t.reset(reset),
1621
\t\t.clk(clk)";
1622
 
1623
 
1624
 
1625
 
1626
        $str="
1627
        //do not modify this line ===${name}===
1628
    if(TOPOLOGY == \"$name\" ) begin : T$name
1629
 
1630
                ${name}_noc_genvar the_noc
1631
                (
1632
                    .reset(reset),
1633
                    .clk(clk),
1634
                    .chan_in_all(chan_in_all),
1635
                    .chan_out_all(chan_out_all)
1636
                );
1637 51 alirezamon
    end
1638 48 alirezamon
    endgenerate
1639
 
1640
        ";
1641
 
1642
 
1643
 
1644
        my $file = "$dir/../common/custom_noc_top.sv";
1645
        #check if ***$name**** exist in the file
1646
        unless (-f $file){
1647
                add_colored_info($info,"$file dose not exist\n",'red');
1648
                return;
1649
        }
1650
        my $r = check_file_has_string($file, "===${name}===");
1651
        if ($r==1){
1652
                add_info($info,"The instance  ${name}_noc exists in $file. This file is not modified\n  ",'blue');
1653
 
1654
        }else{
1655
                my $text = read_file_cntent($file,' ');
1656
        my @a = split('endgenerate',$text);
1657
        save_file($file,"$a[0] $str $a[1]");
1658
        add_info($info,"$file has been modified. The  ${name}_noc has been added to the file\n  ",'blue');
1659
        }
1660
 
1661
 
1662
 
1663
 
1664
 
1665
 
1666
 
1667
 
1668
 
1669
 
1670
 
1671
}
1672
 
1673
 
1674
1

powered by: WebSVN 2.1.0

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