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 44

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

powered by: WebSVN 2.1.0

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