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/] [emulate_ram_gen.pl] - Blame information for rev 38

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

Line No. Rev Author Line
1 25 alirezamon
#!/usr/bin/perl -w
2
use strict;
3
use warnings;
4
use List::Util 'shuffle';
5 28 alirezamon
require "widget.pl";
6 25 alirezamon
 
7
 
8 30 alirezamon
use constant SIM_RAM_GEN        => 0;
9 28 alirezamon
 
10 38 alirezamon
use constant JTAG_STATIC_INDEX  => 124;
11
use constant JTAG_RAM_INDEX     => 125;
12
use constant JTAG_COUNTER_INDEX=>126;
13 28 alirezamon
use constant JTAG_DONE_RESET_INDEX      => 127;
14 38 alirezamon
use constant STATISTIC_NUM =>8;
15 28 alirezamon
 
16 38 alirezamon
use constant CLK_CNTw=> 30; #log2(MAX_SIM_CLKs); 
17 28 alirezamon
 
18 38 alirezamon
 
19
#use constant RESET_NOC                 => " $ENV{'JTAG_INTFC'} -n ".JTAG_DONE_RESET_INDEX." -d \"I:1,D:2:1,I:0\" ";
20
#use constant UNRESET_NOC       => " $ENV{'JTAG_INTFC'} -n ".JTAG_DONE_RESET_INDEX." -d \"I:1,D:2:0,I:0\" ";
21
 
22
use constant READ_DONE_CMD      => " \" -n ".JTAG_DONE_RESET_INDEX." -d I:2,R:2:0,I:0 \" ";
23
use constant READ_COUNTER_CMD => " \" -n ".JTAG_COUNTER_INDEX." -d I:2,R:".CLK_CNTw.":0,I:0 \" ";
24
 
25
 
26 28 alirezamon
use constant UPDATE_WB_ADDR     => 0x7;
27 25 alirezamon
use constant UPDATE_WB_WR_DATA  => 0x6;
28
use constant UPDATE_WB_RD_DATA  => 0x5;
29
use constant RD_WR_STATUS       => 0x4;
30
use constant PROBE_ST           => 0x2;
31
use constant SOURCE_ST          => 0x1;
32
use constant BYPAS_ST           => 0x0;
33 28 alirezamon
use constant RAM_BIN_FILE       => "$ENV{'PRONOC_WORK'}/emulate/emulate_ram.bin";
34
use constant RAM_SIM_FILE       => "$ENV{'PRONOC_WORK'}/emulate/ram";
35
 
36 25 alirezamon
 
37
 
38
 
39
 
40 28 alirezamon
sub reset_cmd {
41 38 alirezamon
        my ($ctrl_reset, $noc_reset,$jtag_intfc)=@_;
42 28 alirezamon
        my $reset_vector= (($ctrl_reset & 0x1) << 1) +  ($noc_reset & 0x1);
43 38 alirezamon
        my $cmd = "sh $jtag_intfc \" -n ".JTAG_DONE_RESET_INDEX."  -d I:1,D:2:$reset_vector,I:0 \" ";
44 28 alirezamon
        #print "$cmd\n";
45
        return  $cmd;
46 25 alirezamon
 
47 28 alirezamon
}
48 25 alirezamon
 
49 38 alirezamon
sub set_time_limit_cmd {
50
        my ($time_limit,$jtag_intfc)=@_;
51
        my $hex = sprintf("0x%X", $time_limit);
52
        my $cmd = "sh $jtag_intfc \" -n ".JTAG_COUNTER_INDEX."  -d I:1,D:".CLK_CNTw.":$hex,I:0 \" ";
53
        print "$cmd\n";
54
        return  $cmd;
55
}
56 25 alirezamon
 
57
 
58 28 alirezamon
sub help {
59
                print
60
"       usage: ./ram_gen X  Y TRAFFIC
61
                X:  number of node in X direction 2<x<=16
62
                Y:  number of node in Y direction 2<y<=16
63
                TRAFFIC : select one of the following traffic patterns :
64
                        tornado,
65
                        transposed 1,
66
                        transposed 2,
67
                        random,
68
 
69
";
70 25 alirezamon
 
71 28 alirezamon
}
72 25 alirezamon
 
73 28 alirezamon
 
74
 
75
 
76
 
77
 
78
sub random_dest_gen {
79
        my $n=shift;
80
        my @c=(0..$n-1);
81
        my @o;
82
        for (my $i=0; $i<$n; $i++){
83
                my @l= shuffle @c;
84
                @l=remove_scolar_from_array(\@l,$i);
85
                $o[$i]=\@l;
86
 
87
        }
88
        return \@o;
89
 
90
}
91
 
92
sub run_cmd_update_info {
93
        my ($cmd,$info)=@_;
94
        my ($stdout,$exit,$stderr)=run_cmd_in_back_ground_get_stdout($cmd);
95
                if($exit){
96 38 alirezamon
                        add_colored_info($info, "$stdout\n",'red') if(defined $stdout);
97
                        add_colored_info($info, "$stderr\n",'red') if(defined $stderr);
98 28 alirezamon
 
99
                }
100
        #print  "\n$cmd \n $stdout";
101
        return $exit;
102
}
103
 
104
 
105
sub synthetic_destination{
106
        my($traffic,$x,$y,$xn,$yn,$line_num,$rnd)=@_;
107
        my $dest_x;
108
        my $dest_y;
109
        my $xw          =   log2($xn);
110
        my $yw          =   log2($yn);
111
 
112 25 alirezamon
        if( $traffic eq "transposed 1"){
113 28 alirezamon
                 $dest_x= $xn-$y-1;
114
                 $dest_y= $yn-$x-1;
115 25 alirezamon
 
116
        } elsif( $traffic eq "transposed 2"){
117
 
118 28 alirezamon
                $dest_x  = $y;
119
                $dest_y  = $x;
120 25 alirezamon
        } elsif( $traffic eq "bit reverse"){
121
                my $joint_addr= ($x << log2($xn))+$y;
122
                my $reverse_addr=0;
123
                my $pos=0;
124
                for(my $i=0; $i<($xw+$yw); $i++){#reverse the address
125
                         $pos= ((($xw+$yw)-1)-$i);
126
                         $reverse_addr|= (($joint_addr >> $pos) & 0x01) << $i;
127
                   # reverse_addr[i]  = joint_addr [((Xw+Yw)-1)-i];
128
                }
129 28 alirezamon
                $dest_x  = $reverse_addr>>$yw;
130
                $dest_y  = $reverse_addr&(0xFF>> (8-$yw));
131 25 alirezamon
         } elsif( $traffic  eq "bit complement") {
132
 
133 28 alirezamon
                 $dest_x   = (~$x) &(0xFF>> (8-$xw));
134
                 $dest_y   = (~$y) &(0xFF>> (8-$yw));
135 25 alirezamon
 
136
 
137 28 alirezamon
        }elsif( $traffic eq "tornado") {
138 25 alirezamon
 
139
                #[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k],
140 28 alirezamon
                 $dest_x   = (($x + (($xn/2)-1))%$xn);
141
                 $dest_y   = (($y + (($yn/2)-1))%$yn);
142
        }elsif( $traffic eq "random") {
143 25 alirezamon
                 #my $num=($y * $xn) +  $x;
144
 
145 28 alirezamon
                my $xc=$xn * $yn;
146
                my @randoms=@{$rnd};
147
                my $num=($y * $xn) +    $x;
148
                my $dest = @{$randoms[$num]}[$line_num-1];
149
                #print "$num:$dest, "; # \@{ \$randoms\[$num\]\}\[$line_num\]"; 
150
                $dest_x   = $dest % $xn;
151
                $dest_y   = $dest  / $xn;
152 25 alirezamon
 
153 28 alirezamon
        } else{#off
154 25 alirezamon
                 print "***********************************$traffic is not defined*******************************************\n";
155 28 alirezamon
                 $dest_x= $x;
156
                 $dest_y= $y;
157 25 alirezamon
 
158
        }
159
 
160 28 alirezamon
        return ($dest_x,$dest_y);
161 25 alirezamon
 
162
}
163
 
164
 
165
 
166
 
167
 
168 28 alirezamon
 
169
sub gen_synthetic_traffic_ram_line{
170 38 alirezamon
        my ($emulate,  $x, $y,  $sample,$ratio ,$line_num,$rnd)=@_;
171 28 alirezamon
 
172 25 alirezamon
 
173 28 alirezamon
 
174 38 alirezamon
        my $ref=$emulate->object_get_attribute("$sample","noc_info");
175 28 alirezamon
        my %noc_info= %$ref;
176
        my $xn=$noc_info{NX};
177
        my $yn=$noc_info{NY};
178 38 alirezamon
        my $traffic=$emulate->object_get_attribute($sample,"traffic");
179 25 alirezamon
 
180 28 alirezamon
 
181 38 alirezamon
        my $pck_num_to_send=$emulate->object_get_attribute($sample,"PCK_NUM_LIMIT");
182
        my $pck_size=$emulate->object_get_attribute($sample,"PCK_SIZE");
183 28 alirezamon
        my $pck_class_in=0;
184
 
185
 
186
        if($line_num==0){ #first ram line shows how many times the ram content must be read 
187
                 #In random traffic each node sends 2 packets to other NC-1  nodes for (pck_num_to_send/2) times 
188
                        my $ram_cnt=  ($traffic eq 'random')? ($pck_num_to_send/(2*(($xn * $yn)-1)))+1:0 ;
189
                        return (0,$ram_cnt);
190
 
191
        }
192
        return (0,0) if($line_num>1  && $traffic ne 'random');
193
        return (0,0) if( $line_num>= $xn * $yn);
194 25 alirezamon
 
195 28 alirezamon
 
196 25 alirezamon
 
197 28 alirezamon
        #assign {pck_num_to_send_in,ratio_in, pck_size_in,dest_x_in, dest_y_in,pck_class_in, last_adr_in}= q_a;
198
        my $last_adr  = ( $traffic ne 'random') ? 1 :
199
                         ($line_num ==($xn * $yn)-1)? 1 :0;
200 25 alirezamon
 
201 28 alirezamon
        my ($dest_x, $dest_y)=synthetic_destination($traffic,$x,$y,$xn,$yn,$line_num,$rnd);
202 25 alirezamon
 
203 28 alirezamon
        my $vs= ( $traffic eq 'random')? 2 : $pck_num_to_send;
204
        $vs=($vs << 2 )+ ($ratio >>5) ;
205 25 alirezamon
 
206 28 alirezamon
        my $vl= ($ratio %32);
207
        $vl=($vl << PCK_SIZw )+$pck_size;
208
        $vl=($vl << MAXXw )+$dest_x;
209
        $vl=($vl << MAXYw )+$dest_y;
210
        $vl=($vl << MAXCw )+$pck_class_in;
211
        $vl=($vl << 1 )+$last_adr;
212 25 alirezamon
 
213 28 alirezamon
        return ($vs,$vl);
214 25 alirezamon
 
215 28 alirezamon
 
216 25 alirezamon
 
217
 
218
 
219
}
220
 
221 28 alirezamon
 
222
 
223
 
224
 
225
sub generate_synthetic_traffic_ram{
226 38 alirezamon
        my ($emulate,$x,$y,$sample,$ratio , $file,$rnd,$num)=@_;
227
 
228 28 alirezamon
        my $line_num;
229
        my $line_value;
230
        my $ram;
231
        if(SIM_RAM_GEN){
232
                my $ext= sprintf("%02u.txt",$num);
233
                open( $ram, '>', RAM_SIM_FILE.$ext) || die "Can not create: \">lib/emulate/emulate_ram.bin\" $!";
234
        }
235 38 alirezamon
        for ($line_num= 0; $line_num<RAM_SIZE; $line_num++ ) {
236
                my ($value_s,$value_l)=gen_synthetic_traffic_ram_line ($emulate,  $x, $y,  $sample, $ratio ,$line_num,$rnd);
237 28 alirezamon
 
238
 
239
                #printf ("\n%08x\t",$value_s);
240
                #printf ("%08x\t",$value_l);
241
                if(SIM_RAM_GEN){
242
                        my $s=sprintf("%08X%08x",$value_s,$value_l);
243
                        print $ram "$s\n";
244 25 alirezamon
                }
245 28 alirezamon
                print_32_bit( $file, $value_s); # most significent 32 bit
246
                print_32_bit( $file, $value_l); # list significent 32 bit
247 25 alirezamon
 
248 28 alirezamon
        }
249
 
250 25 alirezamon
 
251 28 alirezamon
        if(SIM_RAM_GEN){
252
                close($ram);
253
        }
254
        #print "\n";
255 25 alirezamon
 
256 28 alirezamon
        #last ram three rows reserved for reading data from emulator
257 25 alirezamon
 
258 28 alirezamon
}
259 25 alirezamon
 
260
 
261 28 alirezamon
sub print_32_bit {
262
        my ($file,$v)=@_;
263
        for (my $i= 24; $i >=0 ; $i-=8) {
264
                my $byte= ($v >> $i ) & 0xFF;
265
                print $file pack('C*',$byte);
266
                #printf ("%02x\t",$byte);
267
        }
268
}
269 25 alirezamon
 
270
 
271 28 alirezamon
 
272
sub generate_emulator_ram {
273 38 alirezamon
        my ($emulate, $sample,$ratio_in,$info)=@_;
274
        my $ref=$emulate->object_get_attribute($sample,"noc_info");
275 25 alirezamon
        my %noc_info= %$ref;
276
        my $C=$noc_info{C};
277
        my $xn=$noc_info{NX};
278
        my $yn=$noc_info{NY};
279 28 alirezamon
        my $xc=$xn*$yn;
280
        my $rnd=random_dest_gen($xc); # generate a matrix of sudo random number
281 38 alirezamon
        my $traffic=$emulate->object_get_attribute($sample,"traffic");
282 25 alirezamon
        my @traffics=("tornado", "transposed 1", "transposed 2", "bit reverse", "bit complement","random", "hot spot" );
283 28 alirezamon
 
284 25 alirezamon
        if ( !defined $xn || $xn!~ /\s*\d+\b/ ){ add_info($info,"programe_pck_gens:invalid X value\n"); help(); return 0;}
285
        if ( !defined $yn || $yn!~ /\s*\d+\b/ ){ add_info($info,"programe_pck_gens:invalid Y value\n"); help(); return 0;}
286
        if ( !grep( /^$traffic$/, @traffics ) ){add_info($info,"programe_pck_gens:$traffic is an invalid Traffic name\n"); help(); return 0;}
287
        if ( $xn <2 || $xn >16 ){ add_info($info,"programe_pck_gens:invalid X value: ($xn). should be between 2 and 16 \n"); help(); return 0;}
288
        if ( $yn <2 || $yn >16 ){ add_info($info,"programe_pck_gens:invalid Y value:($yn). should be between 2 and 16 \n"); help(); return 0;}
289 28 alirezamon
        #open file pointer
290
        #open(my $file, RAM_BIN_FILE) || die "Can not create: \">lib/emulate/emulate_ram.bin\" $!";
291
        open(my $file, '>', RAM_BIN_FILE) || die "Can not create: \">lib/emulate/emulate_ram.bin\" $!";
292 25 alirezamon
 
293 28 alirezamon
        #generate each node ram data
294 25 alirezamon
        for (my $y=0; $y<$yn; $y=$y+1){
295 28 alirezamon
                for (my $x=0; $x<$xn; $x=$x+1){
296
                        my $num=($y * $xn) +    $x;
297 38 alirezamon
                        generate_synthetic_traffic_ram($emulate,$x,$y,$sample,$ratio_in, $file,$rnd,$num);
298 25 alirezamon
 
299 28 alirezamon
                }
300
        }
301
        close($file);
302
        return 1;
303 25 alirezamon
 
304 28 alirezamon
}
305 25 alirezamon
 
306 28 alirezamon
sub programe_pck_gens{
307 38 alirezamon
        my ($emulate, $sample,$ratio_in,$info,$jtag_intfc)= @_;
308 25 alirezamon
 
309 38 alirezamon
         if(!generate_emulator_ram($emulate, $sample,$ratio_in,$info)){
310
                add_colored_info($info, "Error in generate_emulator_ram function\n",'red');
311
                return 0;
312
 
313
         }
314 25 alirezamon
 
315 28 alirezamon
        #reset the FPGA board   
316
        #run_cmd_in_back_ground("quartus_stp -t ./lib/tcl/mem.tcl reset");
317 38 alirezamon
        return 0 if(run_cmd_update_info(reset_cmd(1,1,$jtag_intfc),$info)); #reset both noc and jtag
318
        return 0 if(run_cmd_update_info(reset_cmd(0,1,$jtag_intfc),$info)); #enable jtag keep noc in reset
319
        #set time limit 
320
        my $time_limit = $emulate->object_get_attribute($sample,"SIM_CLOCK_LIMIT");
321
        return 0 if(run_cmd_update_info(set_time_limit_cmd($time_limit,$jtag_intfc),$info));
322
 
323
 
324
 
325 28 alirezamon
        #programe packet generators rams
326 38 alirezamon
        my $cmd= "sh $jtag_intfc \"-n ".JTAG_RAM_INDEX."  -w 8 -i ".RAM_BIN_FILE." -c\" ";
327 28 alirezamon
        #my ($result,$exit) = run_cmd_in_back_ground_get_stdout($cmd);
328 25 alirezamon
 
329 28 alirezamon
        return 0 if(run_cmd_update_info ($cmd,$info));
330
        #print $result;
331
 
332 38 alirezamon
        return 0 if(run_cmd_update_info(reset_cmd(1,1,$jtag_intfc),$info)); #reset both
333
        return 0 if(run_cmd_update_info(reset_cmd(0,0,$jtag_intfc),$info)); #enable both
334 25 alirezamon
#run_cmd_in_back_ground("quartus_stp -t ./lib/tcl/mem.tcl unreset");
335
#add_info($info,"$r\n");
336
 
337
return 1;
338
 
339
}
340
 
341
 
342 28 alirezamon
sub read_jtag_memory{
343 38 alirezamon
        my ($addr,$jtag_intfc,$info)=@_;
344
        my $cmd= "sh $jtag_intfc \" -n ".JTAG_STATIC_INDEX." -w 8 -d I:".UPDATE_WB_ADDR.",D:64:$addr,I:5,R:64:$addr,I:0\"";
345 28 alirezamon
        #print "$cmd\n";        
346 38 alirezamon
        my ($result,$exit,$stderr) = run_cmd_in_back_ground_get_stdout($cmd);
347
        if($exit){
348
                        add_colored_info($info, "$result\n",'red') if(defined $result);
349
                        add_colored_info($info, "$stderr\n",'red') if(defined $stderr);
350
                        return undef;
351
 
352
        }
353
        #print "$result\n";     
354
 
355 28 alirezamon
        my @q =split  (/###read data#/,$result);
356
        my $d=$q[1];
357
        my $s= substr $d,2;
358
        #print "$s\n";
359
        return hex($s);
360
}
361 25 alirezamon
 
362 28 alirezamon
 
363 38 alirezamon
sub read_statistic_mem {
364
        my($yn,$xn,$jtag_intfc,$info)=@_;
365
        my %results;
366
        my $sum_of_latency=0;
367
        my $sum_of_pck=0;
368
        my $total_router=0;
369
        for (my $y=0; $y<$yn; $y=$y+1){
370
                for (my $x=0; $x<$xn; $x=$x+1){
371
                        my $num=($y * $xn) +    $x;
372
                        my $read_addr=($num * STATISTIC_NUM);
373 28 alirezamon
 
374 38 alirezamon
                        my $sent_pck_addr=  sprintf ("%X",$read_addr);
375
                        my $got_pck_addr =  sprintf ("%X",$read_addr+1);
376
                        my $latency_addr =  sprintf ("%X",$read_addr+2);
377
                        my $worst_latency_addr =  sprintf ("%X",$read_addr+3);
378 28 alirezamon
 
379 38 alirezamon
                        $results{$num}{sent_pck}=read_jtag_memory($sent_pck_addr,$jtag_intfc,$info);
380
                        $results{$num}{got_pck}=read_jtag_memory($got_pck_addr,$jtag_intfc,$info);
381
                        $results{$num}{latency}=read_jtag_memory($latency_addr,$jtag_intfc,$info);
382
                        $results{$num}{worst_latency}=read_jtag_memory($worst_latency_addr,$jtag_intfc,$info);
383
                        add_info($info, "$num, ");
384
 
385
                        $sum_of_latency+=$results{$num}{latency};
386
                        $sum_of_pck+=$results{$num}{got_pck};
387
                        $total_router++ if($results{$num}{sent_pck}>0);
388
                #$i=$i+2;
389
        }}
390
 
391
 
392
 
393
        add_info($info, "\n");
394
 
395
        return (\%results,$sum_of_latency,$sum_of_pck,$total_router);
396
 
397
}
398 28 alirezamon
 
399
 
400 38 alirezamon
sub read_statistic_mem_fast {
401
        my($yn,$xn,$jtag_intfc,$info)=@_;
402
        my %results;
403
        my $sum_of_latency=0;
404
        my $sum_of_pck=0;
405
        my $total_router=0;
406
        #read static memory
407
        my $end= STATISTIC_NUM * 8 *$yn * $xn;
408
        $end=sprintf ("%X",$end);
409
        my $cmd= "sh $jtag_intfc \"-n ".JTAG_STATIC_INDEX."  -w 8 -r -s 0 -e $end\"";
410
        #print "$cmd\n";
411
        my ($result,$exit,$stderr) = run_cmd_in_back_ground_get_stdout($cmd);
412
        if($exit){
413
                        add_colored_info($info, "$result\n",'red') if(defined $result);
414
                        add_colored_info($info, "$stderr\n",'red') if(defined $stderr);
415
                        return undef;
416
 
417
        }
418
        #print "$result\n";
419
        my @q =split  (/###read data#\n/,$result);
420
        my @data= split  (/\n/,$q[1]);
421
        #print "$data[0]\n";
422
 
423
 
424
 
425
 
426
        for (my $y=0; $y<$yn; $y=$y+1){
427
                for (my $x=0; $x<$xn; $x=$x+1){
428
                        my $num=($y * $xn) +    $x;
429
                        my $read_addr=($num * STATISTIC_NUM);
430
 
431
                        my $sent_pck_addr=  $read_addr;
432
                        my $got_pck_addr =  $read_addr+1;
433
                        my $latency_addr =  $read_addr+2;
434
                        my $worst_latency_addr =  $read_addr+3;
435
 
436
                        $results{$num}{sent_pck}=hex($data[$sent_pck_addr]);
437
                        $results{$num}{got_pck}=hex($data[$got_pck_addr]);
438
                        $results{$num}{latency}=hex($data[$latency_addr]);
439
                        $results{$num}{worst_latency}=hex($data[$worst_latency_addr]);
440
                        #add_info($info, "$num, ");
441
 
442
                        $sum_of_latency+=$results{$num}{latency};
443
                        $sum_of_pck+=$results{$num}{got_pck};
444
                        $total_router++ if($results{$num}{sent_pck}>0);
445
                #$i=$i+2;
446
        }}
447
 
448
 
449
 
450
        #add_info($info, "\n");
451
 
452
        return (\%results,$sum_of_latency,$sum_of_pck,$total_router);
453
 
454
}
455
 
456
 
457 25 alirezamon
sub read_pack_gen{
458 38 alirezamon
        my ($emulate,$sample,$info,$jtag_intfc,$ratio_in)= @_;
459
        my $ref=$emulate->object_get_attribute($sample,"noc_info");
460 25 alirezamon
        my %noc_info= %$ref;
461
        my $xn=$noc_info{NX};
462
        my $yn=$noc_info{NY};
463
#wait for done 
464
    add_info($info, "wait for done\n");
465
    my $done=0;
466
    my $counter=0;
467
    while ($done ==0){
468 28 alirezamon
                usleep(300000);
469 25 alirezamon
                #my ($result,$exit) = run_cmd_in_back_ground_get_stdout("quartus_stp -t ./lib/tcl/read.tcl done");
470 38 alirezamon
                my ($result,$exit) = run_cmd_in_back_ground_get_stdout("sh $jtag_intfc".READ_DONE_CMD);
471 28 alirezamon
                if($exit != 0 ){
472 38 alirezamon
                        add_colored_info($info,$result,'red');
473 28 alirezamon
                        return undef;
474
                }
475 25 alirezamon
                my @q =split  (/###read data#/,$result);
476
                #print "\$result=$result\n";
477
 
478
 
479
                $done=($q[1] eq "0x0")? 0 : 1;
480
                #print "\$q[1]=$q[1] done=$done\n";
481 28 alirezamon
 
482 25 alirezamon
                $counter++;
483
                if($counter == 15){ # 
484
                        add_info($info,"Done is not asserted. I reset the board and try again\n");
485 38 alirezamon
                        return if(run_cmd_update_info (reset_cmd(1,1,$jtag_intfc),$info));
486 25 alirezamon
                        #run_cmd_in_back_ground("quartus_stp -t ./lib/tcl/mem.tcl reset");
487
                        usleep(300000);
488 38 alirezamon
                        return if(run_cmd_update_info (reset_cmd(0,0,$jtag_intfc),$info));
489 25 alirezamon
                        #run_cmd_in_back_ground("quartus_stp -t ./lib/tcl/mem.tcl unreset");                    
490
                }
491
                if($counter>30){
492
                          #something is wrong
493 38 alirezamon
                        add_colored_info($info,"Done is not asserted again. I  am going to ignore this test case\n",'green');
494 25 alirezamon
                        return undef;
495
                }
496
        }
497
 
498 38 alirezamon
        add_info($info,"Done is asserted\nStart reading statistic data from cores:\n\t");
499 28 alirezamon
        #print" Done is asserted\n";
500 25 alirezamon
        #my $i=0;
501 38 alirezamon
        #my ($results_ref,$sum_of_latency,$sum_of_pck,$total_router)= read_statistic_mem($yn,$xn,$jtag_intfc,$info);
502
        my ($results_ref,$sum_of_latency,$sum_of_pck,$total_router)= read_statistic_mem_fast($yn,$xn,$jtag_intfc,$info);
503
        my %results=%$results_ref;
504 25 alirezamon
 
505 38 alirezamon
 
506 25 alirezamon
        foreach my $p (sort keys %results){
507 38 alirezamon
                update_result($emulate,$sample,"packet_rsvd_result",$ratio_in,$p,$results{$p}{got_pck} );
508
                update_result($emulate,$sample,"packet_sent_result",$ratio_in,$p,$results{$p}{sent_pck});
509
                update_result($emulate,$sample,"worst_delay_rsvd_result",$ratio_in,$p,$results{$p}{worst_latency});
510 25 alirezamon
                #print "$p  : \n latency: $results{$p}{latency}\n";
511 38 alirezamon
                #print "got_pck : $results{$p}{got_pck}\n";
512 25 alirezamon
                #print "sent_pck:$results{$p}{sent_pck}\n\n";
513 38 alirezamon
                #print "worst_delay:$results{$p}{worst_latency}\n\n";
514 25 alirezamon
 
515
        }
516 38 alirezamon
        #print "total active router=$total_router\n";
517
        #read clock counter
518
        my $clk_counter;
519
        my ($result,$exit) = run_cmd_in_back_ground_get_stdout("sh $jtag_intfc".READ_COUNTER_CMD);
520
        if($exit != 0 ){
521
                add_colored_info($info,$result,'red');
522
 
523
        }else {
524
 
525
                my @q =split  (/###read data#/,$result);
526
                my $d=$q[1];
527
                my $s= substr $d,2;
528
                $clk_counter= hex($s);
529
 
530
        }
531 28 alirezamon
 
532 38 alirezamon
        my $avg_latency= ($sum_of_pck>0)? $sum_of_latency/$sum_of_pck : 0;
533
        my $packet_size=$emulate->object_get_attribute($sample,"PCK_SIZE");
534
        my $avg_throughput= ($sum_of_pck>0 && $total_router>0 && $clk_counter>0 )? (($sum_of_pck * $packet_size *100)/ $total_router )/$clk_counter:0;
535
        #print "($sum_of_pck * $packet_size *100)/ $total_router )/$clk_counter = $avg_throughput)";
536
 
537
        #print "$avg = $sum_of_latency/$sum_of_pck ";
538
        $avg_latency= sprintf("%.1f", $avg_latency);
539
 
540
         update_result ($emulate,$sample,"latency_result",$ratio_in,$avg_latency);
541
         update_result ($emulate,$sample,"throughput_result",$ratio_in,$avg_throughput);
542
         update_result ($emulate,$sample,"exe_time_result",$ratio_in,$clk_counter);
543
 
544
 
545
        return 1;
546 25 alirezamon
}
547
 

powered by: WebSVN 2.1.0

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