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 25

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
require "widget.pl";
6
 
7
 
8
use constant RESET_CMD          => " $ENV{'PRONOC_WORK'}/toolchain/bin/jtag_main -n 127 -d \"I:1,D:1:1,I:0\" ";
9
use constant UNRESET_CMD        => " $ENV{'PRONOC_WORK'}/toolchain/bin/jtag_main -n 127 -d \"I:1,D:1:0,I:0\" ";
10
use constant READ_DONE_CMD      => " $ENV{'PRONOC_WORK'}/toolchain/bin/jtag_main -n 127 -d \"I:2,R:1:0,I:0\" ";
11
use constant UPDATE_WB_ADDR     => 0x7;
12
use constant UPDATE_WB_WR_DATA  => 0x6;
13
use constant UPDATE_WB_RD_DATA  => 0x5;
14
use constant RD_WR_STATUS       => 0x4;
15
use constant PROBE_ST           => 0x2;
16
use constant SOURCE_ST          => 0x1;
17
use constant BYPAS_ST           => 0x0;
18
 
19
 
20
sub get_data{
21
 
22
        my ( $x, $y, $ref, $traffic, $ratio_in,$num, $line_num, $dest)=@_;
23
        my %noc_info= %$ref;
24
        my $C=$noc_info{C};
25
        my $xn=$noc_info{NX};
26
        my $yn=$noc_info{NY};
27
        my $MAX_PCK_NUM   = $noc_info{MAX_PCK_NUM};
28
        my $MAX_SIM_CLKs  = $noc_info{MAX_SIM_CLKs};
29
        my $MAX_PCK_SIZ   = $noc_info{MAX_PCK_SIZ};
30
 
31
 
32
        my $Xw          =   log2($xn);   # number of node in x axis
33
        my $Yw          =   log2($yn);   # number of node in y axis
34
        my $Cw          =  ($C > 1)? log2($C): 1;
35
        #$Fw          =   2+V+Fpay,
36
        my $RATIOw      =   log2(100),
37
        my $PCK_CNTw    =   log2($MAX_PCK_NUM+1),
38
        my $CLK_CNTw    =   log2($MAX_SIM_CLKs+1),
39
        my $PCK_SIZw    =   log2($MAX_PCK_SIZ+1);
40
 
41
        my $Dw=$PCK_CNTw+ $RATIOw + $PCK_SIZw + $Xw + $Yw + $Cw +1;
42
        my $val=0;
43
        my $q=0;
44
        my $i=0;
45
        my $last_adr=($traffic eq 'random' && $line_num<($xn* $yn)-2 )? 0 : 1;
46
        #print "my $last_adr=($traffic eq 'random' && $line_num<($xn* $yn)-2 )? 0 : 1; \n";
47
        my @fileds=get_ram_line($C, $x, $y, $xn, $yn, $traffic,$ratio_in,$line_num,$dest,$last_adr);
48
        my ($pck_num_to_send_,$ratio_in_,$pck_size_,$dest_x_,$dest_y_,$pck_class_in_,$last_adr_)=@fileds;
49
        my @sizes= ($PCK_CNTw, $RATIOw , $PCK_SIZw , $Xw , $Yw , $Cw ,1);
50
 
51
        foreach my $p (@fileds){
52
                $val= $val << $q;
53
                $val= $val + $p;
54
                $i++;
55
                $q=$sizes[$i] if(defined $sizes[$i]);
56
        }
57
 
58
        my $sum = 0;
59
 
60
        foreach my $num (@sizes){
61
                        $sum = $sum + $num;
62
        }
63
        my $result = sprintf("%010x", $val);
64
        #print"$result\n";      
65
        return ($result,$last_adr,$Dw);
66
 
67
 
68
 
69
 
70
 
71
#ram_do= {pck_num_to_send_,ratio_in_,pck_size_,dest_x_,dest_y_,pck_class_in_,last_adr_}; 
72
 
73
 
74
}
75
 
76
sub get_ram_line{
77
        my ($C, $x, $y, $xn, $yn, $traffic,$ratio_in,$line_num,$dest,$last_adr_)=@_;
78
 
79
        my $pck_num_to_send_=2000000;
80
        my $pck_size_=4;
81
        my $pck_class_in_=0;
82
 
83
 
84
        my $xw=log2($xn);
85
        my $yw=log2($yn);
86
 
87
        #print "$traffic\n";
88
        my $dest_x_;
89
        my $dest_y_;
90
 
91
        if( $traffic eq "transposed 1"){
92
                 $dest_x_= $xn-$y-1;
93
                 $dest_y_= $yn-$x-1;
94
 
95
        } elsif( $traffic eq "transposed 2"){
96
 
97
                $dest_x_  = $y;
98
                $dest_y_  = $x;
99
        } elsif( $traffic eq "bit reverse"){
100
                my $joint_addr= ($x << log2($xn))+$y;
101
                my $reverse_addr=0;
102
                my $pos=0;
103
                for(my $i=0; $i<($xw+$yw); $i++){#reverse the address
104
                         $pos= ((($xw+$yw)-1)-$i);
105
                         $reverse_addr|= (($joint_addr >> $pos) & 0x01) << $i;
106
                   # reverse_addr[i]  = joint_addr [((Xw+Yw)-1)-i];
107
                }
108
                $dest_x_  = $reverse_addr>>$yw;
109
                $dest_y_  = $reverse_addr&(0xFF>> (8-$yw));
110
 
111
         } elsif( $traffic  eq "bit complement") {
112
 
113
                 $dest_x_   = (~$x) &(0xFF>> (8-$xw));
114
                 $dest_y_   = (~$y) &(0xFF>> (8-$yw));
115
 
116
 
117
    }  elsif( $traffic eq "tornado") {
118
 
119
                #[(x+(k/2-1)) mod k, (y+(k/2-1)) mod k],
120
                 $dest_x_   = (($x + (($xn/2)-1))%$xn);
121
                 $dest_y_   = (($y + (($yn/2)-1))%$yn);
122
 
123
        } elsif( $traffic eq "random") {
124
                 #my $num=($y * $xn) +  $x;
125
                 $pck_num_to_send_=2;
126
                 $dest_x_   = $dest % $xn;
127
                 $dest_y_   = $dest  / $xn;
128
 
129
 
130
 
131
        }else{#off
132
                 print "***********************************$traffic is not defined*******************************************\n";
133
                 $dest_x_= $x;
134
                 $dest_y_= $y;
135
 
136
        }
137
 
138
        #print"  ($pck_num_to_send_,$ratio_in,$pck_size_,$dest_x_,$dest_y_,$pck_class_in_,$last_adr_);\n";
139
        return  ($pck_num_to_send_,$ratio_in,$pck_size_,$dest_x_,$dest_y_,$pck_class_in_,$last_adr_);
140
 
141
 
142
}
143
 
144
 
145
 
146
 
147
 
148
sub help {
149
                print
150
"       usage: ./ram_gen X  Y TRAFFIC
151
                X:  number of node in X direction 2<x<=16
152
                Y:  number of node in Y direction 2<y<=16
153
                TRAFFIC : select one of the following traffic patterns :
154
                        tornado,
155
                        transposed 1,
156
                        transposed 2,
157
                        random,
158
 
159
";
160
 
161
}
162
 
163
 
164
 
165
 
166
 
167
 
168
sub gen_ram{
169
        my ($data,$mem_width)=get_data(@_);
170
        my $result = sprintf("%8x", $data);
171
 
172
 
173
 
174
        return $result;
175
 
176
 
177
}
178
 
179
sub random_dest_gen {
180
        my $n=shift;
181
        my @c=(0..$n-1);
182
        my @o;
183
        for (my $i=0; $i<$n; $i++){
184
                my @l= shuffle @c;
185
                @l=remove_scolar_from_array(\@l,$i);
186
                $o[$i]=\@l;
187
 
188
        }
189
        return \@o;
190
 
191
}
192
 
193
sub run_cmd_update_info {
194
        my ($cmd,$info)=@_;
195
        my ($stdout,$exit,$stderr)=run_cmd_in_back_ground_get_stdout($cmd);
196
                if($exit){
197
                        add_info($info, "$stdout\n") if(defined $stdout);
198
                        add_info($info, "$stderr\n") if(defined $stderr);
199
 
200
                }
201
        return $exit;
202
}
203
 
204
 
205
 
206
 
207
 
208
 
209
 
210
 
211
sub programe_pck_gens{
212
        my ($ref, $traffic,$ratio_in,$info)= @_;
213
        my %noc_info= %$ref;
214
        my $C=$noc_info{C};
215
        my $xn=$noc_info{NX};
216
        my $yn=$noc_info{NY};
217
    #print( "@_\n" );
218
        my @traffics=("tornado", "transposed 1", "transposed 2", "bit reverse", "bit complement","random", "hot spot" );
219
        my $xc=$xn * $yn;
220
        my @randoms=@{random_dest_gen($xc)};
221
 
222
        if ( !defined $xn || $xn!~ /\s*\d+\b/ ){ add_info($info,"programe_pck_gens:invalid X value\n"); help(); return 0;}
223
        if ( !defined $yn || $yn!~ /\s*\d+\b/ ){ add_info($info,"programe_pck_gens:invalid Y value\n"); help(); return 0;}
224
        if ( !grep( /^$traffic$/, @traffics ) ){add_info($info,"programe_pck_gens:$traffic is an invalid Traffic name\n"); help(); return 0;}
225
        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;}
226
        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;}
227
 
228
        #reset the FPGA board   
229
        #run_cmd_in_back_ground("quartus_stp -t ./lib/tcl/mem.tcl reset");
230
        return if(run_cmd_update_info(RESET_CMD,$info));
231
 
232
 
233
my $argument='';
234
my $argument2='';
235
 
236
for (my $x=0; $x<$xn; $x=$x+1){
237
        for (my $y=0; $y<$yn; $y=$y+1){
238
                my $num=($y * $xn) +    $x;
239
                $num= ($num<=9)? "0$num" : $num;
240
                #add_info($info, "programe M$num\n");
241
                my $line=0;
242
                my ($ram_val,$end,$Dw);
243
                my $repeat=($traffic eq 'random')? "0x2710" : "0x0"; # 10000 : 0;
244
 
245
                $argument=undef;
246
                do{
247
                        ($ram_val,$end,$Dw)=get_data($x, $y, $ref, $traffic,$ratio_in,$num,$line,@{$randoms[$num]}[$line]);
248
                        if(!defined $argument ) { #first row
249
                                $argument="-n $num -d \"I:".UPDATE_WB_ADDR.",D:$Dw:0,I:".UPDATE_WB_WR_DATA.",D:$Dw:0x$ram_val";
250
                        }
251
                        #$argument="$argument M$num $line $ram_val";
252
                        else {
253
                                $argument=$argument.",D:$Dw:0x$ram_val";
254
 
255
                        }
256
                        #$argument="$argument M$num $line $ram_val";
257
                        $line++;
258
                        #print "\$line=$line\n";
259
                } while($end == 0);
260
                $argument=$argument.",I:0\"";
261
                #program the memory
262
                #print "$cmd\n";
263
                my $cmd="$ENV{'PRONOC_WORK'}/toolchain/bin/jtag_main $argument";
264
                return if(run_cmd_update_info ($cmd,$info));
265
                my $source_index=$num+128;
266
 
267
                $cmd= "$ENV{'PRONOC_WORK'}/toolchain/bin/jtag_main -n $source_index -d \"I:".SOURCE_ST.",D:100:$repeat,I:0\"";
268
                return if(run_cmd_update_info ($cmd,$info));
269
                #$argument2="$argument2 P$num $repeat";
270
 
271
 
272
 
273
                #my $file="./RAM/M$num.mif\n";
274
                #unless(open FILE, '>'.$file) { die "\nUnable to create $file\n";}
275
 
276
                # Write data to the file.
277
                #my $ram_content= gen_ram(0, $x, $y, $xn, $yn, $traffic,"M$num");
278
                #print FILE $ram_content;
279
                # close the file.
280
                #close FILE;
281
 
282
        }
283
}
284
#print "quartus_stp -t ./lib/tcl/mem.tcl $argument\n";
285
# ($result,$exit)=run_cmd_in_back_ground_get_stdout("quartus_stp -t ./lib/tcl/mem.tcl $argument");
286
#add_info($info,"update packet generators\n");
287
#print "($result,$exit)\n";
288
#return 0 if ($exit);
289
#print "quartus_stp -t ./lib/tcl/source.tcl $argument2\n";
290
#($result,$exit)=run_cmd_in_back_ground_get_stdout("quartus_stp -t ./lib/tcl/source.tcl $argument2");
291
#print "($result,$exit)\n";
292
#return 0 if ($exit);
293
 
294
# deassert the reset
295
 
296
        return if(run_cmd_update_info (UNRESET_CMD,$info));
297
#run_cmd_in_back_ground("quartus_stp -t ./lib/tcl/mem.tcl unreset");
298
#add_info($info,"$r\n");
299
 
300
return 1;
301
 
302
}
303
 
304
 
305
 
306
sub read_pack_gen{
307
        my ($ref,$info)= @_;
308
        my %noc_info= %$ref;
309
        my $xn=$noc_info{NX};
310
        my $yn=$noc_info{NY};
311
#wait for done 
312
    add_info($info, "wait for done\n");
313
    my $done=0;
314
    my $counter=0;
315
    while ($done ==0){
316
 
317
                #my ($result,$exit) = run_cmd_in_back_ground_get_stdout("quartus_stp -t ./lib/tcl/read.tcl done");
318
                my ($result,$exit) = run_cmd_in_back_ground_get_stdout(READ_DONE_CMD);
319
                my @q =split  (/###read data#/,$result);
320
                #print "\$result=$result\n";
321
 
322
 
323
                $done=($q[1] eq "0x0")? 0 : 1;
324
                #print "\$q[1]=$q[1] done=$done\n";
325
                usleep(9000);
326
                $counter++;
327
                if($counter == 15){ # 
328
                        add_info($info,"Done is not asserted. I reset the board and try again\n");
329
                        return if(run_cmd_update_info (RESET_CMD,$info));
330
                        #run_cmd_in_back_ground("quartus_stp -t ./lib/tcl/mem.tcl reset");
331
                        usleep(300000);
332
                        return if(run_cmd_update_info (UNRESET_CMD,$info));
333
                        #run_cmd_in_back_ground("quartus_stp -t ./lib/tcl/mem.tcl unreset");                    
334
                }
335
                if($counter>30){
336
                          #something is wrong
337
                        add_info($info,"Done is not asserted again. I  am going to ignore this test case");
338
                        return undef;
339
                }
340
        }
341
 
342
        add_info($info,"Done is asserted\n");
343
        #my $i=0;
344
        my %results;
345
        my $sum_of_latency=0;
346
        my $sum_of_pck=0;
347
        for (my $x=0; $x<$xn; $x=$x+1){
348
                for (my $y=0; $y<$yn; $y=$y+1){
349
                        my $num=($y * $xn) +    $x;
350
                        my $source_index=$num+128;
351
                        my $cmd= "$ENV{'PRONOC_WORK'}/toolchain/bin/jtag_main -n $source_index -d \"I:".PROBE_ST.",R:100:0,I:0\"";
352
                        my ($result,$exit) = run_cmd_in_back_ground_get_stdout($cmd);
353
                        my @q =split  (/###read data#/,$result);
354
 
355
 
356
 
357
                my $d=$q[1];
358
                #print "num=$num:    ddddd=$d\n";       
359
                my $s= substr $d,2;
360
                #print "dddddddd=$s\n"; 
361
                my $latency =substr $s, 0,9;
362
                my $got_pck= substr $s, -16, 8;
363
                my $sent_pck= substr $s, -8;
364
                #print "$latency, $got_pck, $sent_pck\n";       
365
 
366
 
367
                $results{$num}{latency}=hex($latency);
368
                $results{$num}{got_pck}=hex($got_pck);
369
                $results{$num}{sent_pck}=hex($sent_pck);
370
                $sum_of_latency+=hex($latency);
371
                $sum_of_pck+=hex($got_pck);
372
                #$i=$i+2;
373
        }}
374
 
375
        foreach my $p (sort keys %results){
376
 
377
 
378
                #print "$p  : \n latency: $results{$p}{latency}\n";
379
                #print " got_pck : $results{$p}{got_pck}\n";
380
                #print "sent_pck:$results{$p}{sent_pck}\n\n";
381
 
382
        }
383
        my $avg= ($sum_of_pck>0)? $sum_of_latency/$sum_of_pck : 0;
384
        return sprintf("%.1f", $avg);
385
}
386
 

powered by: WebSVN 2.1.0

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