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 56

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

powered by: WebSVN 2.1.0

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