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/] [Integration_test/] [FPGA-kc07/] [src/] [src.pl] - Blame information for rev 56

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 56 alirezamon
#!/usr/bin/perl -w
2
 
3
use Proc::Background;
4
use File::Path qw( rmtree );
5
 
6
my $script_path = dirname(__FILE__);
7
my $dirname = "$script_path/..";
8
my $root = "$dirname/../..";
9
my $rtl_dir = "$ENV{PRONOC_WORK}/verify/rtl";
10
my $work    = "$ENV{PRONOC_WORK}/verify/work";
11
my $src = "$script_path";
12
my $report = "$dirname/report";
13
 
14
require "$root/perl_gui/lib/perl/common.pl";
15
require "$root/perl_gui/lib/perl/topology.pl";
16
 
17
use strict;
18
use warnings;
19
 
20
my $pp;
21
$pp= do "$src/deafult_noc_param";
22
die "Error reading: $@" if $@;
23
 
24
my $param = $pp->{'noc_param'};
25
my %default_noc_param=%{$param};
26
my @params=object_get_attribute_order($pp,'noc_param');
27
 
28
 
29
 
30
#read default param
31
 
32
 
33
sub gen_noc_param_h{
34
        my $mpsoc=shift;
35
        my $param_h="\n\n//NoC parameters\n";
36
 
37
        my $topology = $mpsoc->object_get_attribute('noc_param','TOPOLOGY');
38
        $topology =~ s/"//g;
39
        $param_h.="\t#define  IS_${topology}\n";
40
 
41
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
42
 
43
        my @params=$mpsoc->object_get_attribute_order('noc_param');
44
        my $custom_topology = $mpsoc->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
45
        foreach my $p (@params){
46
                my $val=$mpsoc->object_get_attribute('noc_param',$p);
47
                next if($p eq "CUSTOM_TOPOLOGY_NAME");
48
                $val=$custom_topology if($p eq "TOPOLOGY" && $val eq "\"CUSTOM\"");
49
                if($p eq "MCAST_ENDP_LIST" || $p eq "ESCAP_VC_MASK"){
50
                        $val="$NE".$val if($p eq 'MCAST_ENDP_LIST');
51
                        $val =~ s/\'/\\\'/g;
52
                        $val="\"$val\"";
53
                }
54
 
55
 
56
                $param_h=$param_h."\t#define $p\t$val\n";
57
 
58
 
59
 
60
        }
61
        my $class=$mpsoc->object_get_attribute('noc_param',"C");
62
        my $str;
63
        if( $class > 1){
64
                for (my $i=0; $i<=$class-1; $i++){
65
                        my $n="Cn_$i";
66
                        my $val=$mpsoc->object_get_attribute('class_param',$n);
67
                        $param_h=$param_h."\t#define $n\t$val\n";
68
                }
69
                $str="CLASS_SETTING  {";
70
                for (my $i=$class-1; $i>=0;$i--){
71
                        $str=($i==0)?  "${str}Cn_0};\n " : "${str}Cn_$i,";
72
                }
73
        }else {
74
                $str="CLASS_SETTING={V{1\'b1}}\n";
75
        }
76
        #add_text_to_string (\$param_h,"\t#define $str");
77
 
78
        my $v=$mpsoc->object_get_attribute('noc_param',"V")-1;
79
        my $escape=$mpsoc->object_get_attribute('noc_param',"ESCAP_VC_MASK");
80
        if (! defined $escape){
81
                #add_text_to_string (\$param_h,"\tlocalparam [$v        :0] ESCAP_VC_MASK=1;\n");
82
                #add_text_to_string (\$pass_param,".ESCAP_VC_MASK(ESCAP_VC_MASK),\n"); 
83
        }
84
        #add_text_to_string (\$param_h," \tlocalparam  CVw=(C==0)? V : C * V;\n");
85
        #add_text_to_string (\$pass_param,".CVw(CVw)\n");
86
 
87
        #remove 'b and 'h
88
        #$param_h =~ s/\d\'b/ /g;
89
        #$param_h =~ s/\'h/ /g;
90
 
91
 
92
        return  $param_h;
93
}
94
 
95
 
96
 
97
 
98
sub get_model_parameter {
99
        my $model =shift;
100
        my $o;
101
        $o= do $model;
102
        my %new_param=%{$o};
103
    die "Error reading: $@" if $@;
104
        my %temp;
105
        foreach my $p (@params){
106
                $temp{$p} = $default_noc_param{$p};
107
        }
108
        foreach my $p (sort keys %new_param){
109
                $temp{$p} = $new_param{$p};
110
        }
111
        return %temp;
112
}
113
 
114
sub gen_noc_localparam_v {
115
        my ($m,$ref) = @_;
116
        my %model = %{$ref};
117
        my %temp;
118
 
119
 
120
        foreach my $p (@params){
121
                $temp{$p} = $default_noc_param{$p};
122
        $m->{noc_param}{$p}=$default_noc_param{$p};
123
        }
124
        foreach my $p (sort keys %model){
125
                $temp{$p} = $model{$p};
126
                $m->{noc_param}{$p}=$model{$p};
127
        }
128
 
129
        object_add_attribute_order($m,'noc_param',@params);
130
 
131
        my $param_v="`ifdef NOC_LOCAL_PARAM \n";
132
        foreach my $p (@params){
133
                $param_v.="localparam $p = $temp{$p};\n";
134
        }
135
        $param_v.="`endif\n";
136
 
137
        my ($nr,$ne,$router_p,$ref_tops,$includ_h) = get_noc_verilator_top_modules_info($m);
138
        my %tops = %{$ref_tops};
139
        $tops{Vtraffic} = "--top-module traffic_gen_top";
140
        $tops{Vpck_inj} = "--top-module packet_injector_verilator";
141
 
142
 
143
 
144
 
145
        my $param_h=gen_noc_param_h($m);
146
        $includ_h = gen_sim_parameter_h($param_h,$includ_h,$ne,$nr,$router_p,'16');
147
 
148
        return ($param_v,$includ_h,\%tops);
149
 
150
}
151
 
152
 
153
sub copy_src_files{
154
 
155
        if(defined $ENV{PRONOC_WORK}){
156
                rmtree("$rtl_dir");
157
                unless (-d "$rtl_dir"){
158
                        print "make a working directory inside $rtl_dir\n";
159
                        mkdir("$rtl_dir", 0700);
160
 
161
                }
162
        }else{
163
                        print  "Please set PRONOC_WORK variable first!";
164
                        exit;
165
        }
166
 
167
        dircopy("$root/rtl/src_noc"    , "$rtl_dir/src_noc"    ) or die("$!\n") unless (-d "$rtl_dir/src_noc"    );
168
    dircopy("$root/rtl/src_topolgy", "$rtl_dir/src_topolgy") or die("$!\n") unless (-d "$rtl_dir/src_topolgy");
169
 
170
    unlink "$rtl_dir/src_noc/noc_localparam.v";
171
    for my $file (glob "$root/rtl/*.v") {
172
                 copy $file, "$rtl_dir" or die $! ;
173
        }
174
 
175
 
176
 
177
}
178
 
179
 
180
 
181
 
182
sub gen_file_list{
183
        my $path=shift;
184
        my $f="+incdir+$rtl_dir/
185
+incdir+$rtl_dir/src_noc/
186
+incdir+$path
187
";
188
 
189
        my @files = File::Find::Rule->file()
190
                          ->name( '*.v','*.V','*.sv' )
191
                          ->in( "$rtl_dir" );
192
 
193
        #make sure source files have key word 'module' 
194
        my @sources;
195
        foreach my $p (@files){
196
                push (@sources,$p)      if(check_file_has_string($p,'endpackage'));
197
        }
198
        foreach my $p (@files){
199
                push (@sources,$p)      if(check_file_has_string($p,'module'));
200
        }
201
        my $files = join ("\n",@sources);
202
        $f.=$files;
203
 
204
 
205
        open(FILE,  ">$path/file_list.f") || die "Can not open: $!";
206
        print FILE $f;
207
        close FILE;
208
}
209
 
210
 
211
 
212
sub gen_models {
213
        my @models = glob("$dirname/models/*");
214
    mkdir("$work", 0700);
215
        foreach my $m (@models){
216
                print "$m\n";
217
                #make noc localparam
218
                my $o;
219
                $o= do $m;
220
        die "Error reading: $@" if $@;
221
                my $param = $o->{'noc_param'};
222
                my ($fname,$fpath,$fsuffix) = fileparse("$m",qr"\..[^.]*$");
223
 
224
 
225
                my $name = $fname;
226
                my $make =$o->{'makefile'};
227
 
228
 
229
                my      ($param_v,$include_h,$tops)=   gen_noc_localparam_v( $o,$param);
230
 
231
                mkdir("$work/$name", 0700);
232
                save_file("$work/$name/noc_localparam.v",$param_v);
233
 
234
                #generate file list             
235
                gen_file_list("$work/$name");
236
 
237
 
238
 
239
 
240
        }
241
 
242
}
243
 
244
 
245
 
246
 
247
 
248
 
249
sub compile_models{
250
        my($self,$inref)=@_;
251
    my ($paralel_run,$MIN,$MAX,$STEP) = @{$inref};
252
        my @models = glob("$dirname/models/*");
253
        #generate compile command
254
        my $i=0;
255
        my $cmd;
256
        foreach my $m (@models){
257
                my ($fname,$fpath,$fsuffix) = fileparse("$m",qr"\..[^.]*$");
258
                $cmd.=" cd $work/$fname;  bash verilator.sh >  $work/$fname/out.log 2>&1  &\n";
259
                $i++;
260
                $cmd.="wait\n" if(($i % $paralel_run)==0) ;
261
        }
262
        $cmd.="wait\n" if(($i % $paralel_run)!=0) ;
263
        #run command in terminal
264
        print "*******************compile models******************\n$cmd\n";
265
        my $proc1 = Proc::Background->new($cmd);
266
        $proc1->alive;
267
        $proc1->wait;
268
        $proc1->die;
269
 
270
}
271
 
272
 
273
 
274
 
275
 
276
 
277
sub check_compilation_log {
278
        my ($name,$ref,$inref) = @_;
279
    my @log_report_match =@{$ref};
280
        my ($paralel_run,$MIN,$MAX,$STEP) = @{$inref};
281
        my $logfile     = "$work/$name/out.log";
282
 
283
        my @found;
284
        foreach my $m (@log_report_match){
285
                open my $INPUT, '<', $logfile;
286
                push(@found , grep ( /$m/, <$INPUT>)) ;
287
                close($INPUT);
288
        }
289
 
290
        foreach my $line (@found) {
291
              append_text_to_file($report,"\t $line\n");
292
    }
293
}
294
 
295
 
296
 
297
 
298
 
299
sub check_compilation {
300
        my ($self,$ref1,$ref2)=@_;
301
        my @models = glob("$dirname/models/*");
302
        foreach my $m (@models){
303
                my ($name,$fpath,$fsuffix) = fileparse("$m",qr"\..[^.]*$");
304
                append_text_to_file($report,"****************************$name : Compile *******************************:\n");
305
                #check if testbench is generated successfully   
306
                if(-f "$work/$name/obj_dir/testbench"){
307
                        append_text_to_file($report,"\t model is generated successfully.\n");
308
                        check_compilation_log($name,$ref1,$ref2);
309
 
310
                }else{
311
                        append_text_to_file($report,"\t model generation is FAILED.\n");
312
                        check_compilation_log($name,$ref1,$ref2);
313
                }
314
 
315
        }
316
}
317
 
318
 
319
sub run_all_models {
320
        my ($self,$inref) =@_;
321
    my ($paralel_run,$MIN,$MAX,$STEP) = @{$inref};
322
        my @models = glob("$dirname/models/*");
323
    foreach my $m (@models){
324
                run_traffic ($self,$m,'random',$inref);
325
        }
326
        foreach my $m (@models){
327
                run_traffic ($self,$m,'transposed 1',$inref);
328
        }
329
}
330
 
331
 
332
 
333
sub run_traffic {
334
        my ($self,$model,$traffic,$inref)=@_;
335
     my ($paralel_run,$MIN,$MAX,$STEP) = @{$inref};
336
        my ($name,$fpath,$fsuffix) = fileparse("$model",qr"\..[^.]*$");
337
 
338
        my %param = get_model_parameter($model);
339
        my $min_pck = $param{'MIN_PCK_SIZE'};
340
 
341
    append_text_to_file($report,"****************************$name      : $traffic traffic *******************************:\n");
342
        unless (-f "$work/$name/obj_dir/testbench"){
343
                append_text_to_file($report,"\t failed. Simulation model is not avaialable\n");
344
                return;
345
        }
346
 
347
 
348
 
349
        my $file_name="${traffic}_results";
350
    $file_name =~ s/\s+//g;
351
 
352
        mkdir("$work/$name/$file_name/", 0700);
353
 
354
        my $i=0;
355
        my $cmd;
356
 
357
 
358
        for (my $inject=$MIN; $inject<=$MAX; $inject+=$STEP){
359
                $cmd.="$work/$name/obj_dir/testbench -t \"$traffic\"   -m \"R,$min_pck,10\"  -n  20000  -c      10000   -i $inject -p \"100,0,0,0,0\" >  $work/$name/$file_name/sim$inject 2>&1  &\n";
360
                $i++;
361
                $cmd.="wait\n" if(($i % $paralel_run)==0) ;
362
        }
363
        $cmd.="wait\n" if(($i % $paralel_run)!=0) ;
364
        #run command in terminal
365
        print "*******************run models******************\n$cmd\n";
366
        my $proc1 = Proc::Background->new($cmd);
367
        $proc1->alive;
368
        $proc1->wait;
369
        $proc1->die;
370
 
371
        check_sim_results($self,$name,$traffic,$inref);
372
 
373
}
374
 
375
 
376
sub extract_result {
377
        my ($self,$file,$filed)=@_;
378
 
379
        my @r = unix_grep($file,$filed);
380
    my $string = $r[0];
381
    $string =~ s/[^0-9.]+//g;
382
        return $string;
383
 
384
}
385
 
386
sub get_zero_load_and_saturation{
387
        my ($self,$name,$traffic,$path)=@_;
388
        my %results;
389
        my $ref = $self->{'name'}{"$name"}{'traffic'}{$traffic}{"packet_latency"};
390
        return if !defined $ref;
391
        %results = %{$ref};
392
 
393
        my $zero_latency=9999999;
394
    my $saturat_inject=100;
395
    my $zero_inject;
396
    my $saturat_latency='-';
397
 
398
        my $txt = "#name:$name\n";
399
 
400
        foreach my $inj (sort {$a <=> $b} keys %results){
401
                $txt.="$inj $results{$inj}\n";
402
                if ($zero_latency > $results{$inj}) {
403
                        $zero_latency = $results{$inj};
404
                        $zero_inject  = $inj;
405
                }
406
        }
407
        # assum saturation happens when the latency is 5 times of zero load
408
        foreach my $inj (sort {$a <=> $b} keys %results){
409
                if($results{$inj} >= 5 * $zero_latency ) {
410
                        if($saturat_inject > $inj){
411
                                $saturat_inject =$inj;
412
                                $saturat_latency=$results{$inj};
413
                        }
414
                }
415
        }
416
        $txt.="\n";
417
        save_file("$path/packet_latency.sv",$txt);
418
 
419
 
420
        return ($zero_inject,$zero_latency, $saturat_inject,$saturat_latency);
421
}
422
 
423
 
424
 
425
 
426
sub check_sim_results{
427
        my ($self,$name,$traffic,$inref)=@_;
428
    my ($paralel_run,$MIN,$MAX,$STEP) = @{$inref};
429
    my $file_name="${traffic}_results";
430
    $file_name =~ s/\s+//g;
431
        my $results_path = "$work/$name/$file_name";
432
 
433
        #my @results = glob("$results_path/*");
434
        #check for error
435
 
436
        for (my $inject=$MIN; $inject<=$MAX; $inject+=$STEP){
437
                my $file = "$results_path/sim$inject";
438
 
439
                my @errors = unix_grep("$file","ERROR:");
440
                if (scalar @errors  ){
441
                        append_text_to_file($report,"\t Error in running simulation: @errors \n");
442
                        $self->{'name'}{"$name"}{'traffic'}{$traffic}{'overal_result'}="Failed";
443
                        $self->{'name'}{"$name"}{'traffic'}{$traffic}{'message'}="@errors";
444
                        return;
445
                }
446
                my @r = unix_grep($file,"total,");
447
        my $string = $r[0];
448
                my @fileds=split(',',$string);
449
                my $val=$fileds[11];
450
                $val =~ s/[^0-9.]+//g;
451
        #       my $val = extract_result($self,$file,"average packet latency");         
452
                if(length $val ==0){
453
                        $self->{'name'}{"$name"}{'traffic'}{$traffic}{'overal_result'}="Failed";
454
                        $self->{'name'}{"$name"}{'traffic'}{$traffic}{'message'}="The average packet latency is undefined for $inject";
455
                        return;
456
                }
457
                $self->{'name'}{"$name"}{'traffic'}{$traffic}{"packet_latency"}{$inject}="$val";
458
 
459
        }
460
        my  ($z,$zl, $s,$sl) = get_zero_load_and_saturation ($self,$name,$traffic,$results_path);
461
        print "($z,$zl, $s,$sl)\n";
462
 
463
        #save results in a text file 
464
 
465
 
466
 
467
        append_text_to_file($report,"\t Passed:   zero load ($z,$zl) saturation ($s,$sl)\n");
468
    $self->{'name'}{"$name"}{'traffic'}{$traffic}{'overal_result'}="passed";
469
}
470
 

powered by: WebSVN 2.1.0

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