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

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

Line No. Rev Author Line
1 16 alirezamon
use strict;
2
use warnings;
3 43 alirezamon
use FindBin;
4
use lib $FindBin::Bin;
5
 
6 16 alirezamon
use mpsoc;
7
use soc;
8
use ip;
9
use ip_gen;
10
use Cwd;
11
use rvp;
12
 
13
 
14
sub mpsoc_generate_verilog{
15 48 alirezamon
        my ($mpsoc,$sw_dir,$txview)=@_;
16 25 alirezamon
        my $mpsoc_name=$mpsoc->object_get_attribute('mpsoc_name');
17 34 alirezamon
        my $top_ip=ip_gen->top_gen_new();
18
 
19 48 alirezamon
 
20 34 alirezamon
 
21 48 alirezamon
 
22 16 alirezamon
        my $param_as_in_v;
23 28 alirezamon
        # generate top 
24 16 alirezamon
 
25 28 alirezamon
 
26 48 alirezamon
 
27 16 alirezamon
        #generate socs_parameter
28
        my $socs_param= gen_socs_param($mpsoc);
29
 
30
        #generate noc_parameter
31 25 alirezamon
        my ($noc_param,$pass_param)=gen_noc_param_v($mpsoc);
32 16 alirezamon
 
33
        #generate the noc
34 43 alirezamon
        my $noc_v=gen_noc_v($mpsoc,$pass_param);
35 16 alirezamon
 
36 48 alirezamon
        #generate socs  
37
        my ($socs_v,$io_short,$io_full,$top_io_short,$top_io_full,$top_io_pass,$href)=gen_socs_v($mpsoc,$top_ip,$sw_dir,$txview);
38
        my %jtag_info=%{$href};
39
        my $jtag_v=add_jtag_ctrl (\%jtag_info,$txview);
40 16 alirezamon
 
41 48 alirezamon
        my ($clk_set, $clk_io_sim,$clk_io_full, $clk_assigned_port)= get_top_clk_setting($mpsoc);
42
 
43
        $top_io_short=$top_io_short.",\n$clk_io_sim" if (defined $clk_io_sim);
44
    $top_io_full=$top_io_full."\n$clk_io_full";
45
    $top_io_pass=$top_io_pass.",\n$clk_assigned_port" if (defined $clk_assigned_port);
46
 
47 16 alirezamon
        #functions
48
        my $functions=get_functions();
49
 
50 48 alirezamon
        my $global_localparam=get_golal_param_v();
51 34 alirezamon
 
52 48 alirezamon
        my $mpsoc_v = (defined $param_as_in_v )? "`timescale     1ns/1ps\nmodule $mpsoc_name\n\t import pronoc_pkg::*;\n\t #(\n $param_as_in_v\n)(\n$io_short\n);\n": "`timescale        1ns/1ps\nmodule $mpsoc_name\n \t import pronoc_pkg::*;\n\t(\n$io_short\n);\n";
53
        $mpsoc_v=$mpsoc_v. "
54
$functions
55
$global_localparam
56
$socs_param
57
$io_full
58
$noc_v
59
$socs_v
60
endmodule
61
";
62 16 alirezamon
 
63 42 alirezamon
 
64 48 alirezamon
        my $top_v = (defined $param_as_in_v )? "`timescale       1ns/1ps\nmodule ${mpsoc_name}_top #(\n $param_as_in_v\n)(\n$top_io_short\n);\n": "`timescale    1ns/1ps\nmodule ${mpsoc_name}_top (\n $top_io_short\n);\n";
65 28 alirezamon
 
66 48 alirezamon
$top_v=$top_v."
67
$global_localparam
68
$socs_param
69
$top_io_full
70
$clk_set
71
$jtag_v
72
\t${mpsoc_name} the_${mpsoc_name} (
73
$top_io_pass
74 28 alirezamon
 
75 48 alirezamon
\t);
76
endmodule
77
";
78
 
79
 
80
 
81 16 alirezamon
 
82 28 alirezamon
 
83 48 alirezamon
#       my $mp=get_top_ip($mpsoc,'mpsoc');
84 28 alirezamon
 
85 48 alirezamon
#       mkpath("$dir/lib/ip/mpsoc/",1,01777);   
86
#       open(FILE,  ">$dir/lib/ip/mpsoc/MPSOC.IP") || die "Can not open: $!";
87
#       print FILE perl_file_header("MPSOC.IP");
88
#       print FILE Data::Dumper->Dump([\%$mp],["ipgen"]);
89
#       close(FILE) || die "Error closing file: $!";
90 28 alirezamon
 
91
 
92 48 alirezamon
#       my ($mp_v,$top_v)=soc_generate_verilog($top_soc,"target_dir/sw1",$txview);
93 28 alirezamon
 
94
 
95
 
96
        #my $ins= gen_mpsoc_instance_v($mpsoc,$mpsoc_name,$param_pass_v);
97
 
98
        #add_text_to_string(\$top_v,$local_param_v_all."\n".$io_full_v_all);
99
        #add_text_to_string(\$top_v,$ins);
100 34 alirezamon
        $mpsoc->object_add_attribute('top_ip',undef,$top_ip);
101 48 alirezamon
 
102
        my @chains = (sort { $b <=> $a } keys  %jtag_info);
103
        $mpsoc->object_add_attribute('JTAG','M_CHAIN',$chains[0]);
104
 
105
        return ($mpsoc_v,$top_v,$noc_param);
106 16 alirezamon
}
107
 
108 48 alirezamon
sub add_sources_to_top_ip{
109
        my ($mpsoc,$top_ip)=@_;
110
        my $sourc_short;
111
        my $source_full="";
112
        my @sources=('clk','reset');
113
        foreach my $s (@sources){
114
                my $num = $mpsoc->object_get_attribute('SOURCE_SET',"${s}_number");
115
                $num=1 if (!defined $num);
116
                for (my $n=0;$n<$num;$n++){
117
                        my $name=$mpsoc->object_get_attribute('SOURCE_SET',"${s}_${n}_name");
118
                        $name=$s if(!defined $name);
119
                        $top_ip->top_add_port('IO',$name,'', 'input' ,"plug:$s\[$n\]","${s}_i");
120
                        $sourc_short= (defined $sourc_short)? $sourc_short.",\n\t$name" : "\t$name";
121
                        #$source_full=$source_full. "// synthesis attribute keep of $name is true;\n" if($s eq 'clk');
122
                        $source_full=$source_full."\tinput $name;\n";
123
                }
124
                #$top_ip->top_add_port('IO','clk','', 'input' ,'plug:clk[0]','clk_i');
125
        }
126
        return ($sourc_short, $source_full);
127
}
128
 
129
 
130
sub get_clk_constrain_file{
131
        my ($self)=@_;
132
        my $s='clk';
133
        my $num = $self->object_get_attribute('SOURCE_SET',"${s}_number");
134
        my $top_name=$self->object_get_attribute('mpsoc_name');
135
        $top_name=$self->object_get_attribute('soc_name') if(!defined $top_name);
136
        my $xdc="";
137
        return  if (!defined $num);
138
        for (my $n=0;$n<$num;$n++){
139
                my $clk_name=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_name");
140
                my $period=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_period");
141
                my $fall=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_fall");
142
                my $rise=$self->object_get_attribute('SOURCE_SET',"${s}_${n}_rise");
143
                my $fal_ns=  ($period * $fall)/100;
144
                my $rise_ns= ($period * $rise)/100;
145
 
146
                $xdc=$xdc."create_clock -period $period -name internal_clk$n -waveform {$rise_ns $fal_ns} -add \[get_nets uut/the_${top_name}/${clk_name}\]\n";
147
 
148
        }
149
        return $xdc;
150
 
151
}
152
 
153
 
154
 
155
sub add_jtag_ctrl {
156
        my ($ref,$txview)=@_;
157
        my %jtag_info=%{$ref};
158
 
159
        my $jtag_v="\t//Allow software to remote reset/enable the cpu via jtag
160
\twire jtag_cpu_en, jtag_system_reset;
161
";
162
        my @chains = (sort { $b <=> $a } keys  %jtag_info);
163
        my $altera=0;
164
        my $xilinx=0;
165
        my $glob_en;
166
        foreach my $c (@chains){
167
                my $xilinx_jtag_ctrl_in;
168
                my $xilinx_jtag_ctrl_out;
169
                my $r = $jtag_info{$c}{'wire'};
170
                my $index = $jtag_info{$c}{'index'};
171
 
172
                my @array = (defined $r)? @{$r} :();
173
                my $wires_def = join ("\n",@array);
174
                $jtag_v=$jtag_v."\n//\tJtag chain $c Wire def\n$wires_def\n" if(@array);
175
                $r= $jtag_info{$c}{'altera_num'};
176
                @array = (defined $r)? @{$r} :();
177
                my $altera_jtag_ctrl =(@array)? scalar @array : 0;
178
                $r= $jtag_info{$c}{'xilinx_num'};
179
                @array = (defined $r)? @{$r} :();
180
                my $xilinx_jtag_ctrl =(@array)? scalar @array : 0;
181
                $altera+=$altera_jtag_ctrl;
182
                $xilinx+=$xilinx_jtag_ctrl;
183
                if ($xilinx_jtag_ctrl>0){
184
                        $r=$jtag_info{$c}{'input'};
185
                        @array = (defined $r)? @{$r} :();
186
                        $xilinx_jtag_ctrl_in = ($xilinx_jtag_ctrl!=1)? '{'.join(',',@array).'}' : $array[0];
187
                        $r=$jtag_info{$c}{'output'};
188
                        @array = (defined $r)? @{$r} :();
189
                        $xilinx_jtag_ctrl_out= ($xilinx_jtag_ctrl!=1)? '{'.join(',',@array).'}' : $array[0];
190
                        my $ctrl = (defined $glob_en)? "
191
                .system_reset( ),
192
                .cpu_en( ),
193
        " : "//The global reset/enable signals are connected to the tap with the largest jtag chain number
194
                .system_reset(jtag_system_reset),
195
                .cpu_en(jtag_cpu_en),
196
        ";
197
 
198
 
199
 
200
 
201
                        $glob_en=1;
202
                        $jtag_v=$jtag_v."
203
        xilinx_jtag_wb  #(
204
                .JTAG_CHAIN($c),
205
                .JWB_NUM($xilinx_jtag_ctrl)
206
        )
207
        jwb_$c
208
        (
209
                $ctrl
210
                .reset(jtag_debug_reset_in),
211
                .wb_to_jtag_all($xilinx_jtag_ctrl_out),
212
                .jtag_to_wb_all($xilinx_jtag_ctrl_in)
213
        );
214
";
215
 
216
 
217
                }
218
 
219
        }#for
220
 
221
        if($altera>0 && $xilinx>0){
222
                my $r = $jtag_info{0}{'inst'};
223
                my @array = (defined $r)? @{$r} :();
224
                my $inst=join ("\n\t",@array);
225
                add_colored_info($txview,"Found JTAG communication ports from different FPGA vendors:\n$inst.",'red');
226
        }
227
        elsif($altera>0){
228
                $jtag_v=$jtag_v."
229
                jtag_system_en #(
230
                        .FPGA_VENDOR(\"ALTERA\")
231
                ) jtag_en (
232
                        .cpu_en(jtag_cpu_en),
233
                        .system_reset(jtag_system_reset)
234
 
235
                );
236
        ";
237
        }
238
 
239
        elsif($altera==0 && $xilinx==0){
240
                $jtag_v=$jtag_v."
241
        //No jtag connection has found in the design
242
                jtag_system_en #(
243
                        .FPGA_VENDOR(FPGA_VENDOR)
244
                ) jtag_en (
245
                        .cpu_en(jtag_cpu_en),
246
                        .system_reset(jtag_system_reset)
247
 
248
                );
249
";
250
 
251
 
252
        }
253
 
254
return $jtag_v;
255
 
256
}
257
 
258
 
259
 
260
 
261 16 alirezamon
sub get_functions{
262
        my $p='
263
//functions
264
        function integer log2;
265
                input integer number; begin
266
                        log2=0;
267
                        while(2**log2<number) begin
268
                                log2=log2+1;
269
                        end
270
        end
271
        endfunction // log2
272 43 alirezamon
 
273 16 alirezamon
        ';
274
 
275
        return $p;
276
}
277
 
278
 
279
sub  gen_socs_param{
280
        my $mpsoc=shift;
281
        my $socs_param="
282
//SOC parameters\n";
283 43 alirezamon
        my ($NE, $NR, $RAw,  $EAw, $Fw) = get_topology_info($mpsoc);
284
        my $processors_en=0;
285
    for (my $tile=0;$tile<$NE;$tile++){
286 16 alirezamon
                        my ($soc_name,$n,$soc_num)=$mpsoc->mpsoc_get_tile_soc_name($tile);
287
                        if(defined $soc_name) {
288
                                my $param=      gen_soc_param($mpsoc,$soc_name,$soc_num,$tile);
289 48 alirezamon
                                $socs_param=$socs_param.$param;
290 16 alirezamon
                        }
291 43 alirezamon
        }#$tile
292 16 alirezamon
        $socs_param="$socs_param \n";
293 43 alirezamon
        return $socs_param;
294 16 alirezamon
}
295
 
296
 
297
sub  gen_soc_param {
298 48 alirezamon
        my ($mpsoc,$soc_name,$soc_num,$tile_num)=@_;
299 16 alirezamon
        my $top=$mpsoc->mpsoc_get_soc($soc_name);
300 48 alirezamon
        my $setting=$mpsoc->mpsoc_get_tile_param_setting($tile_num);
301 16 alirezamon
        my %params;
302 48 alirezamon
        #if ($setting eq 'Custom'){
303
        %params= $top->top_get_custom_soc_param($tile_num);
304
        #}else{
305
        #        %params=$top->top_get_default_soc_param();
306
        #}
307
        my $params="\n\t //Parameter setting for $soc_name  located in tile: $tile_num \n";
308
        $params{'CORE_ID'}=$tile_num;
309
        foreach my $p (get_param_list_in_order(\%params)){
310
                        $params{$p}=add_instantc_name_to_parameters(\%params,"T$tile_num",$params{$p});
311
 
312
                        $params="$params\t localparam T${tile_num}_$p=$params{$p};\n";
313 16 alirezamon
        }
314
        return $params;
315
}
316
 
317
 
318 48 alirezamon
 
319 16 alirezamon
sub gen_noc_param_v{
320 48 alirezamon
        my ($mpsoc,$sample)=@_;
321 16 alirezamon
        my $param_v="\n\n//NoC parameters\n";
322 48 alirezamon
        my $pass_param="";
323 25 alirezamon
        my @params=$mpsoc->object_get_attribute_order('noc_param');
324 48 alirezamon
        my $custom_topology = $mpsoc->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
325 54 alirezamon
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
326 48 alirezamon
        my %noc_info;
327
        if(defined $sample ){
328
                my $ref=$mpsoc->object_get_attribute($sample,"noc_info");
329 54 alirezamon
                %noc_info= %$ref;
330
                ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info_from_parameters($ref);
331 48 alirezamon
        }
332
 
333 16 alirezamon
        foreach my $p (@params){
334 48 alirezamon
 
335
                my $val= (defined $sample) ? $noc_info{$p} :$mpsoc->object_get_attribute('noc_param',$p);
336
                next if($p eq "CUSTOM_TOPOLOGY_NAME");
337
                $val=$custom_topology if($p eq "TOPOLOGY" && $val eq "\"CUSTOM\"");
338 54 alirezamon
                if($p eq 'MCAST_ENDP_LIST'){
339
 
340
                        $val="$NE".$val;
341
                }
342 48 alirezamon
                $param_v= $param_v."\tlocalparam $p=$val;\n";
343
                $pass_param=$pass_param."\t\t.$p($p),\n";
344 25 alirezamon
                #print "$p:$val\n";
345 16 alirezamon
 
346
        }
347 25 alirezamon
        my $class=$mpsoc->object_get_attribute('noc_param',"C");
348 16 alirezamon
        my $str;
349
        if( $class > 1){
350 30 alirezamon
                for (my $i=0; $i<=$class-1; $i++){
351
                        my $n="Cn_$i";
352
                        my $val=$mpsoc->object_get_attribute('class_param',$n);
353 48 alirezamon
                        $param_v=$param_v."\tlocalparam $n=$val;\n";
354 30 alirezamon
                }
355 16 alirezamon
                $str="CLASS_SETTING={";
356
                for (my $i=$class-1; $i>=0;$i--){
357
                        $str=($i==0)?  "${str}Cn_0};\n " : "${str}Cn_$i,";
358
                }
359
        }else {
360
                $str="CLASS_SETTING={V{1\'b1}};\n";
361
        }
362 48 alirezamon
        $param_v=$param_v."\tlocalparam $str";
363
        $pass_param=$pass_param."\t\t.CLASS_SETTING(CLASS_SETTING),\n";
364 25 alirezamon
        my $v=$mpsoc->object_get_attribute('noc_param',"V")-1;
365
        my $escape=$mpsoc->object_get_attribute('noc_param',"ESCAP_VC_MASK");
366
        if (! defined $escape){
367 48 alirezamon
                $param_v=$param_v."\tlocalparam [$v     :0] ESCAP_VC_MASK=1;\n";
368
                $pass_param=$pass_param.".\t\tESCAP_VC_MASK(ESCAP_VC_MASK),\n";
369 25 alirezamon
        }
370 48 alirezamon
        $param_v=$param_v." \tlocalparam  CVw=(C==0)? V : C * V;\n";
371
        $pass_param=$pass_param."\t\t.CVw(CVw)\n";
372 25 alirezamon
        return ($param_v,$pass_param);
373 16 alirezamon
 
374
}
375
 
376
 
377 32 alirezamon
sub gen_noc_param_h{
378
        my $mpsoc=shift;
379
        my $param_h="\n\n//NoC parameters\n";
380
 
381 48 alirezamon
        my $topology = $mpsoc->object_get_attribute('noc_param','TOPOLOGY');
382
        $topology =~ s/"//g;
383
        $param_h.="\t#define  IS_${topology}\n";
384
 
385 54 alirezamon
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
386 48 alirezamon
 
387 54 alirezamon
 
388
 
389
 
390 32 alirezamon
        my @params=$mpsoc->object_get_attribute_order('noc_param');
391 48 alirezamon
        my $custom_topology = $mpsoc->object_get_attribute('noc_param','CUSTOM_TOPOLOGY_NAME');
392 32 alirezamon
        foreach my $p (@params){
393
                my $val=$mpsoc->object_get_attribute('noc_param',$p);
394 48 alirezamon
                next if($p eq "CUSTOM_TOPOLOGY_NAME");
395
                $val=$custom_topology if($p eq "TOPOLOGY" && $val eq "\"CUSTOM\"");
396 54 alirezamon
                if($p eq "MCAST_ENDP_LIST" || $p eq "ESCAP_VC_MASK"){
397
                        $val="$NE".$val if($p eq 'MCAST_ENDP_LIST');
398
                        $val =~ s/\'/\\\'/g;
399
                        $val="\"$val\"";
400
                }
401
 
402 48 alirezamon
                $param_h=$param_h."\t#define $p\t$val\n";
403 32 alirezamon
 
404
                #print "$p:$val\n";
405
 
406
        }
407
        my $class=$mpsoc->object_get_attribute('noc_param',"C");
408
        my $str;
409
        if( $class > 1){
410
                for (my $i=0; $i<=$class-1; $i++){
411
                        my $n="Cn_$i";
412
                        my $val=$mpsoc->object_get_attribute('class_param',$n);
413 48 alirezamon
                        $param_h=$param_h."\t#define $n\t$val\n";
414 32 alirezamon
                }
415
                $str="CLASS_SETTING  {";
416
                for (my $i=$class-1; $i>=0;$i--){
417
                        $str=($i==0)?  "${str}Cn_0};\n " : "${str}Cn_$i,";
418
                }
419
        }else {
420
                $str="CLASS_SETTING={V{1\'b1}}\n";
421
        }
422
        #add_text_to_string (\$param_h,"\t#define $str");
423
 
424
        my $v=$mpsoc->object_get_attribute('noc_param',"V")-1;
425
        my $escape=$mpsoc->object_get_attribute('noc_param',"ESCAP_VC_MASK");
426
        if (! defined $escape){
427
                #add_text_to_string (\$param_h,"\tlocalparam [$v        :0] ESCAP_VC_MASK=1;\n");
428
                #add_text_to_string (\$pass_param,".ESCAP_VC_MASK(ESCAP_VC_MASK),\n"); 
429
        }
430
        #add_text_to_string (\$param_h," \tlocalparam  CVw=(C==0)? V : C * V;\n");
431
        #add_text_to_string (\$pass_param,".CVw(CVw)\n");
432
 
433
 
434 54 alirezamon
        #remove 'b and 'h
435
        #$param_h =~ s/\d\'b/ /g;
436
        #$param_h =~ s/\'h/ /g;
437 32 alirezamon
 
438 48 alirezamon
        return  $param_h;
439 32 alirezamon
}
440 16 alirezamon
 
441
 
442 32 alirezamon
 
443
 
444
 
445 16 alirezamon
sub gen_noc_v{
446 43 alirezamon
        my ($mpsoc,$pass_param) = @_;
447
        my ($NE, $NR, $RAw, $EAw, $Fw) = get_topology_info($mpsoc);
448 16 alirezamon
 
449 48 alirezamon
 
450
    my $noc_clk   =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"NoC_clk");
451
        my $noc_reset =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"NoC_reset");
452
        $noc_clk   = 'clk0'   if(!defined $noc_clk  );
453
        $noc_reset = 'reset0' if(!defined $noc_reset);
454
 
455 43 alirezamon
        my $noc_v="
456
 
457
        //connection wire to NoC
458 48 alirezamon
        smartflit_chanel_t ni_chan_in  [NE-1 : 0];
459
        smartflit_chanel_t ni_chan_out [NE-1 : 0];
460 16 alirezamon
 
461 48 alirezamon
        wire                                    noc_clk_in,noc_reset_in;
462
 
463
    //NoC
464
        noc_top the_noc
465
        (
466
                .reset(noc_reset_in),
467
                .clk(noc_clk_in),
468
                .chan_in_all(ni_chan_out),
469 54 alirezamon
                .chan_out_all(ni_chan_in),
470
                .router_event( )
471 48 alirezamon
        );
472
 
473 16 alirezamon
 
474 43 alirezamon
 
475
 
476 16 alirezamon
        clk_source  src         (
477 48 alirezamon
                .clk_in($noc_clk),
478
                .clk_out(noc_clk_in),
479
                .reset_in($noc_reset),
480
                .reset_out(noc_reset_in)
481 16 alirezamon
        );
482 48 alirezamon
";
483 16 alirezamon
 
484 48 alirezamon
;
485 16 alirezamon
        return $noc_v;
486
 
487
}
488
 
489
 
490
 
491
 
492
sub gen_socs_v{
493 48 alirezamon
        my ($mpsoc,$top_ip,$sw_dir,$txview)=@_;
494 28 alirezamon
 
495 48 alirezamon
        #add clk reset signals
496
        my ($sourc_short, $source_full)=add_sources_to_top_ip($mpsoc,$top_ip);
497
 
498
 
499
        my $io_short=$sourc_short;
500
        my $top_io_short="\tjtag_debug_reset_in";
501
 
502
 
503
#       my $jtag_def="// Allow software to remote reset/enable the cpu via jtag
504
#\twire jtag_cpu_en, jtag_system_reset; 
505
#\twire processors_en_anded_jtag = processors_en & jtag_cpu_en;
506
#       
507
#";
508
 
509
        my $io_full=$source_full;
510
        my $top_io_full= "\tinput jtag_debug_reset_in;\n";
511
        my $top_io_pass="//";
512
 
513
        my %jtag_info;
514
        %jtag_info=append_to_hash (\%jtag_info,0,'wire',"wire processors_en_anded_jtag = processors_en & jtag_cpu_en;\n");
515
        #my $altera_jtag_ctrl=0;
516
        #my $xilinx_jtag_ctrl=0; #if it becomes larger than 0 then add jtag to wb module 
517
        #my $jtag_insts="";
518
        #my $xilinx_jtag_ctrl_in="";
519
        #my $xilinx_jtag_ctrl_out=""; 
520
 
521
 
522
        my $socs_v="";
523
        my ($NE, $NR, $RAw, $EAw, $Fw)= get_topology_info ($mpsoc);
524
 
525
 
526 43 alirezamon
        my $processors_en=0;
527 48 alirezamon
        for (my $tile_num=0;$tile_num<$NE;$tile_num++){
528
                        my ($soc_name,$n,$soc_num)=$mpsoc->mpsoc_get_tile_soc_name($tile_num);
529 43 alirezamon
 
530
                        if(defined $soc_name) {
531 48 alirezamon
                                my ($soc_v,$en,$io_short1,$io_full1,$top_io_short1,$top_io_full1,$top_io_pass1,$ref)=
532
                                gen_soc_v($mpsoc,$top_ip,$sw_dir,$soc_name,$tile_num,$soc_num,$txview,\%jtag_info);
533
                                %jtag_info=%{$ref};
534
                                $socs_v=$socs_v.$soc_v;
535
                                $io_short    = $io_short    .$io_short1;
536
                                $io_full     = $io_full     .$io_full1;
537
                                $top_io_short= $top_io_short.$top_io_short1;
538
                                $top_io_full = $top_io_full. $top_io_full1;
539
                                $top_io_pass = $top_io_pass. $top_io_pass1;
540
                        #       $jtag_def    = $jtag_def    .$jtag_def1;
541
                        #       $jtag_insts=$jtag_insts.$jtag_insts1; 
542
                        #       $altera_jtag_ctrl+=$altera_jtag_ctrl1;
543
                        #       $xilinx_jtag_ctrl+=$xilinx_jtag_ctrl1;
544
                        #       $xilinx_jtag_ctrl_in =(length ($xilinx_jtag_ctrl_in )>2)? "$xilinx_jtag_ctrl_in,$xilinx_jtag_ctrl_in1"  : $xilinx_jtag_ctrl_in.$xilinx_jtag_ctrl_in1;
545
                        #       $xilinx_jtag_ctrl_out=(length ($xilinx_jtag_ctrl_out)>2)? "$xilinx_jtag_ctrl_out,$xilinx_jtag_ctrl_out1" :$xilinx_jtag_ctrl_out.$xilinx_jtag_ctrl_out1;
546
 
547 16 alirezamon
                                $processors_en|=$en;
548 28 alirezamon
 
549 16 alirezamon
                        }else{
550
                                #this tile is not connected to any ip. the noc input ports will be connected to ground
551 48 alirezamon
                                my $soc_v="\n\n // Tile:$tile_num    is not assigned to any ip\n";
552 16 alirezamon
                                $soc_v="$soc_v
553
 
554 48 alirezamon
        assign ni_credit_out[$tile_num]={V{1'b0}};
555
        assign ni_flit_out[$tile_num]={Fw{1'b0}};
556
        assign ni_flit_out_wr[$tile_num]=1'b0;
557 16 alirezamon
        ";
558 48 alirezamon
                $socs_v=$socs_v.$soc_v;
559 16 alirezamon
 
560
                        }
561
 
562 43 alirezamon
        }
563 16 alirezamon
 
564
    if($processors_en){
565 48 alirezamon
        $io_short=$io_short.",\n\tprocessors_en";
566
        $io_full=$io_full."\tinput processors_en;";
567
        $top_io_short=$top_io_short.",\n\tprocessors_en";
568
        $top_io_full=$top_io_full."\t input processors_en;";
569
        $top_io_pass=$top_io_pass.",\n\t\t.processors_en(processors_en_anded_jtag)";
570
                $top_ip->top_add_port('IO','processors_en','' ,'input','plug:enable[0]','enable_i');
571 16 alirezamon
 
572
    }
573 48 alirezamon
 
574
 #  $io_short=$io_short.",\n\tjtag_system_reset";
575
 #  $io_full=$io_full."\n\tinput jtag_system_reset;"; 
576
 #  $top_io_pass=$top_io_pass.",\n\t\t.jtag_system_reset(jtag_system_reset)";
577
 
578
 
579
        return ($socs_v,$io_short,$io_full,$top_io_short,$top_io_full,$top_io_pass,\%jtag_info);
580 16 alirezamon
 
581
}
582
 
583 48 alirezamon
 
584
 
585 16 alirezamon
##############
586
#       gen_soc_v
587
##############
588
 
589
 
590 48 alirezamon
#$mpsoc,$top_ip,$sw_dir,$soc_name,$id,$soc_num,$txview
591
sub   gen_soc_v{
592
        my ($mpsoc,$top_ip,$sw_path,$soc_name,$tile_num,$soc_num,$txview,$href)=@_;
593
        my %jtag_info = %{$href};
594
 
595
        my $io_short="";
596
        my $io_full="";
597
        my $top_io_short="";
598
        my $top_io_full="";
599
        my $top_io_pass="";
600 16 alirezamon
 
601 48 alirezamon
 
602
 
603 16 alirezamon
        my $processor_en=0;
604 48 alirezamon
 
605
 
606
 
607
 
608
 
609 43 alirezamon
        my ($NE, $NR, $RAw, $EAw, $Fw)= get_topology_info ($mpsoc);
610
        my $e_addr=endp_addr_encoder($mpsoc,$tile_num);
611
        my $router_num = get_connected_router_id_to_endp($mpsoc,$tile_num);
612
        my $r_addr=router_addr_encoder($mpsoc,$router_num);
613 16 alirezamon
 
614 43 alirezamon
 
615
 
616 48 alirezamon
        my $soc_v="\n\n // Tile:$tile_num ($e_addr)\n   \t$soc_name #(\n";
617
 
618 34 alirezamon
        # Global parameter
619 48 alirezamon
        $soc_v=$soc_v."\t\t.CORE_ID($tile_num),\n\t\t.SW_LOC(\"$sw_path/tile$tile_num\")";
620 16 alirezamon
 
621 43 alirezamon
 
622 16 alirezamon
        # ni parameter
623
        my $top=$mpsoc->mpsoc_get_soc($soc_name);
624 30 alirezamon
        my @nis=get_NI_instance_list($top);
625
        my @noc_param=$top->top_get_parameter_list($nis[0]);
626
        my $inst_name=$top->top_get_def_of_instance($nis[0],'instance');
627 16 alirezamon
 
628
        #other parameters
629
        my %params=$top->top_get_default_soc_param();
630
 
631 43 alirezamon
 
632
 
633 16 alirezamon
        foreach my $p (@noc_param){
634
                my $parm_next = $p;
635
                $parm_next =~ s/${inst_name}_//;
636
                my $param=  ",\n\t\t.$p($parm_next)";
637 48 alirezamon
                $soc_v=$soc_v.$param;
638 16 alirezamon
        }
639
        foreach my $p (sort keys %params){
640 48 alirezamon
                my $parm_next= "T${tile_num}_$p";
641 16 alirezamon
                my $param=  ",\n\t\t.$p($parm_next)";
642 48 alirezamon
                $soc_v=$soc_v.$param;
643 16 alirezamon
 
644
        }
645
 
646 48 alirezamon
        $soc_v=$soc_v."\n\t)the_${soc_name}_$soc_num(\n";
647 16 alirezamon
 
648
        my @intfcs=$top->top_get_intfc_list();
649
 
650
        my $i=0;
651 25 alirezamon
 
652
        my $dir = Cwd::getcwd();
653
        my $mpsoc_name=$mpsoc->object_get_attribute('mpsoc_name');
654 28 alirezamon
        my $target_dir  = "$ENV{'PRONOC_WORK'}/MPSOC/$mpsoc_name";
655 48 alirezamon
        my $soc_file="$target_dir/src_verilog/tiles/$soc_name.sv";
656 25 alirezamon
 
657 34 alirezamon
        my $vdb =read_verilog_file($soc_file);
658 25 alirezamon
 
659
        my %soc_localparam = $vdb->get_modules_parameters($soc_name);
660
 
661
 
662 16 alirezamon
        foreach my $intfc (@intfcs){
663
 
664
                # ni intfc
665
                if( $intfc eq 'socket:ni[0]'){
666
                        my @ports=$top->top_get_intfc_ports_list($intfc);
667
 
668
                        foreach my $p (@ports){
669
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
670 43 alirezamon
                                my $q=  ($intfc_port eq "current_e_addr")? "$EAw\'d$e_addr" :
671
                                                ($intfc_port eq "current_r_addr")? "$RAw\'d$r_addr" :
672
                                                "ni_$intfc_port\[$tile_num\]";
673 48 alirezamon
                                $soc_v=$soc_v.',' if ($i);
674
                                $soc_v=$soc_v."\n\t\t.$p($q)";
675 16 alirezamon
                                $i=1;
676
 
677
 
678
                        }
679
                }
680
                # clk source
681 48 alirezamon
                elsif( $intfc =~ /plug:clk\[/ ){
682 16 alirezamon
                        my @ports=$top->top_get_intfc_ports_list($intfc);
683
                        foreach my $p (@ports){
684
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
685 48 alirezamon
                                $soc_v=$soc_v.',' if ($i);
686
                                my $src =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"T${tile_num}_$p");
687
                                $src = 'clk0' if(!defined $src);
688
                                $soc_v=$soc_v."\n\t\t.$p($src)";
689 16 alirezamon
                            $i=1;
690
 
691
                        }
692
                }
693
                #reset
694 48 alirezamon
                elsif( $intfc =~ /plug:reset\[/){
695 16 alirezamon
                        my @ports=$top->top_get_intfc_ports_list($intfc);
696
                        foreach my $p (@ports){
697
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
698 48 alirezamon
                                $soc_v=$soc_v.',' if ($i);
699
                                my $src =  $mpsoc->object_get_attribute('SOURCE_SET_CONNECT',"T${tile_num}_$p");
700
                                $src = 'reset0' if(!defined $src);
701
                                $soc_v=$soc_v."\n\t\t.$p(${src} )";#| jtag_system_reset)";
702 16 alirezamon
                            $i=1;
703
 
704 48 alirezamon
                        }
705 16 alirezamon
                }
706 42 alirezamon
                #enable
707 48 alirezamon
                elsif( $intfc =~ /plug:enable\[/){
708 16 alirezamon
                        my @ports=$top->top_get_intfc_ports_list($intfc);
709
                        foreach my $p (@ports){
710
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
711 48 alirezamon
                                $soc_v=$soc_v.',' if ($i);
712
                                $soc_v=$soc_v."\n\t\t.$p(processors_en)";
713 16 alirezamon
                            $processor_en=1;
714 48 alirezamon
                            $i=1;
715
                        }
716 16 alirezamon
                }
717 42 alirezamon
                #RxD_sim
718
                elsif( $intfc eq 'socket:RxD_sim[0]'){
719
                        #This interface is for simulation only donot include it in top module
720
                        my @ports=$top->top_get_intfc_ports_list($intfc);
721
                        foreach my $p (@ports){
722 48 alirezamon
                                $soc_v=$soc_v.',' if ($i);
723
                                $soc_v=$soc_v."\n\t\t.$p( )";
724 42 alirezamon
                                $i=1;
725
                        }
726
 
727 48 alirezamon
                }
728
                #jtag_to_wb
729
                elsif( $intfc =~ /socket:jtag_to_wb\[/){ #check JTAG connect parameter. if it is XILINX then connect it to jtag tap
730
                        my @ports=$top->top_get_intfc_ports_list($intfc);
731
 
732
                        my $setting=$mpsoc->mpsoc_get_tile_param_setting($tile_num);
733
                        my %topparams;
734
                        #if ($setting eq 'Custom'){
735
                                 %topparams= $top->top_get_custom_soc_param($tile_num);
736
                #       }else{
737
                        #        %topparams=$top->top_get_default_soc_param();
738
                        #}
739 42 alirezamon
 
740 48 alirezamon
 
741
                        #my $JTAG_CONNECT=$soc->soc_get_module_param_value ($id,'JTAG_CONNECT');
742
 
743 16 alirezamon
                        foreach my $p (@ports){
744 48 alirezamon
                                my($id,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
745
                                my $inst_name=$top->top_get_def_of_instance($id,'instance');
746
                                my $JTAG_CONNECT=  $topparams{"${inst_name}_JTAG_CONNECT"};
747
                                my $chain=$topparams{"${inst_name}_JTAG_CHAIN"};
748
                                my $index=$topparams{"${inst_name}_JTAG_INDEX"};
749
                                #print Dumper (\%topparams);
750
                                #print "my $JTAG_CONNECT=  \$topparams{${inst_name}_JTAG_CONNECT}\n";
751
 
752
                                #print "$inst,$range,$type,$intfc_name,$intfc_port-> $JTAG_CONNECT;";
753
                                if($JTAG_CONNECT  =~ /XILINX_JTAG_WB/){
754 25 alirezamon
 
755 48 alirezamon
                                        my ($io_port,$type,$new_range,$intfc_name,$intfc_port)= get_top_port_io_info($top,$p,$tile_num,\%params,\%soc_localparam);
756
                                        my $port_def=(length ($new_range)>1 )?  "\t$type\t [ $new_range    ] $io_port;\n": "\t$type\t\t\t$io_port;\n";
757
                                        $top_ip->top_add_port("T${tile_num}" ,$io_port, $new_range ,$type,$intfc_name,$intfc_port);
758
 
759
                                        my $wire_def=(length ($new_range)>1 )?  "\twire\t [ $new_range    ] $io_port;": "\twire\t\t\t$io_port;";
760
                                #       my $new_range = add_instantc_name_to_parameters(\%params,"${soc_name}_$soc_num",$range);
761
 
762
                                #       $jtag_def=$jtag_def."$wire_def";
763
                                        %jtag_info=append_to_hash (\%jtag_info,$chain,'wire',"$wire_def");
764
 
765
 
766
                                        $soc_v=$soc_v.',' if ($i);
767
                                        $soc_v=$soc_v."\n\t\t.$p($io_port)";
768
                                        $i=1;
769
                                        if($type eq 'input'){
770
                                                %jtag_info=check_jtag_indexs(\%jtag_info,$chain,$index,$txview,$inst_name,$tile_num);
771
                                                #$jtag_insts=$jtag_insts."$id XILINX JTAG,";
772
                                                %jtag_info=append_to_hash (\%jtag_info,0,'inst',"$id XILINX JTAG");
773
                                                #$xilinx_jtag_ctrl++;
774
                                                %jtag_info=append_to_hash (\%jtag_info,$chain,'xilinx_num',1);
775
                                                #$xilinx_jtag_ctrl_in=(length ($xilinx_jtag_ctrl_in)>2)? "$xilinx_jtag_ctrl_in,$io_port" : "$io_port";
776
                                                %jtag_info=append_to_hash (\%jtag_info,$chain,'input',$io_port);
777
                                        }else {
778
                                                #$xilinx_jtag_ctrl_out=(length($xilinx_jtag_ctrl_out)>2)? "$xilinx_jtag_ctrl_out,$io_port" : "$io_port";
779
                                                %jtag_info=append_to_hash (\%jtag_info,$chain,'output',$io_port);
780
                                        }
781
                                        $io_short=$io_short.",\n\t$io_port";
782
                                        $io_full=$io_full."$port_def";
783
                                        $top_io_pass=$top_io_pass.",\n\t\t.$io_port($io_port)";
784
#
785
                                }else{#Dont not connect
786
                                        $soc_v=$soc_v.',' if ($i);
787
                                        $soc_v=$soc_v."\n\t\t.$p( )";
788
                                        $i=1;
789 25 alirezamon
                                }
790 16 alirezamon
 
791 48 alirezamon
                                if($JTAG_CONNECT =~ /ALTERA_JTAG_WB/){
792
                                        if($type eq 'input'){
793
                                                #$jtag_insts=$jtag_insts."$id ALTERA JTAG,";
794
                                                #$altera_jtag_ctrl++;
795
                                                %jtag_info=append_to_hash (\%jtag_info,0,'inst',"$id ALTERA JTAG");
796
                                                %jtag_info=append_to_hash (\%jtag_info,0,'altera_num',1);
797
                                                %jtag_info=check_jtag_indexs(\%jtag_info,0,$index,$txview,$inst_name,$tile_num);
798
 
799
                                        }
800
                                }
801 16 alirezamon
 
802
                        }
803
 
804 48 alirezamon
                }
805 16 alirezamon
 
806 48 alirezamon
                else {
807
                #other interface
808
                        my @ports=$top->top_get_intfc_ports_list($intfc);
809
                        foreach my $p (@ports){
810
                                my ($io_port,$type,$new_range,$intfc_name,$intfc_port)= get_top_port_io_info($top,$p,$tile_num,\%params,\%soc_localparam);
811
 
812
                                $io_short=$io_short.",\n\t$io_port";
813
                                $top_io_short=$top_io_short.",\n\t$io_port";
814
                                $top_io_pass=$top_io_pass.",\n\t\t.$io_port($io_port)";
815
                                #io definition
816
                                #my $new_range = add_instantc_name_to_parameters(\%params,"${soc_name}_$soc_num",$range);
817
                                my $port_def=(length ($new_range)>1 )?  "\t$type\t [ $new_range    ] $io_port;\n": "\t$type\t\t\t$io_port;\n";
818
                                $top_ip->top_add_port("T${tile_num}" ,$io_port, $new_range ,$type,$intfc_name,$intfc_port);
819
 
820
                                $io_full=$io_full."$port_def";
821
                                $top_io_full=$top_io_full."$port_def";
822
                                $soc_v=$soc_v.',' if ($i);
823
                                $soc_v=$soc_v."\n\t\t.$p($io_port)";
824
                                $i=1;
825
 
826
                        }
827
                }
828 16 alirezamon
        }
829
 
830
 
831
 
832 48 alirezamon
        $soc_v=$soc_v."\n\t);\n";
833 16 alirezamon
 
834 48 alirezamon
 
835
        return ($soc_v,$processor_en,$io_short,$io_full,$top_io_short,  $top_io_full,$top_io_pass,\%jtag_info);
836 16 alirezamon
 
837
}
838
 
839
 
840 48 alirezamon
sub check_jtag_indexs{
841
        my ($ref,$chain,$index,$txview,$inst_name,$core_id)=@_;
842
        my %jtag_info = %{$ref} if (defined $ref);
843
 
844
        chomp $index;
845
        # replace coreid parameter
846
        ($index=$index)=~ s/CORE_ID/$core_id/g;
847
        $index = eval $index;
848
        my $inst1 =$jtag_info{$chain}{'index'}{$index};
849
        my $id1 = $jtag_info{$chain}{'core_id'}{$index};
850
        if (defined $inst1){
851
                add_colored_info($txview,"Error: The JTAG INDEX number $index in JTAG Chain $chain is not unique. The same index number is used in tile($id1):$inst1  & tile($core_id):$inst_name  IPs. It should be used in only one module.\n",'red');
852 16 alirezamon
        }
853 48 alirezamon
        $jtag_info{$chain}{'index'}{$index}=$inst_name;
854
        $jtag_info{$chain}{'core_id'}{$index}=$core_id;
855
        #print "\$jtag_info{$chain}{'index'}{$index}=$inst_name\n";
856
        return %jtag_info;
857 16 alirezamon
}
858
 
859
 
860 25 alirezamon
 
861 48 alirezamon
sub get_top_clk_setting{
862
        my $mpsoc=shift;
863
    #get mpsoc with clock setting interface
864
        my $dir = Cwd::getcwd();
865
        my $soc =get_source_set_top($mpsoc);
866 25 alirezamon
 
867 48 alirezamon
    my @instances=$soc->soc_get_all_instances();
868
    my $top_ip=ip_gen->top_gen_new();
869
    my $body_v;
870
    my $param_pass_v="";
871
    my $io_sim_v;
872
        my $io_top_sim_v;
873
        my $core_id= 0 ;
874
        my $param_as_in_v="";
875
        my $local_param_v_all="";
876
        my $inst_v_all="";
877
    my $param_v_all="";
878
    my $wire_def_v_all="";
879
        my $plugs_assign_v_all="";
880
        my $sockets_assign_v_all="";
881
        my $io_full_v_all="";
882
        my $io_top_full_v_all="";
883
        my $io_sim_v_all;
884
        my $system_v_all="";
885
 
886
        my $wires=soc->new_wires();
887
        my $intfc=interface->interface_new();
888
        my $clk_assigned_port;
889
    foreach my $id (@instances){
890
        my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v,$io_top_full_v,$io_sim_v,
891
                $top_io_short,$param_as_in_v,$param_pass_v,$system_v,$assigned_ports,$top_io_pass,$src_io_short, $src_io_full)=gen_module_inst($id,$soc,$top_ip,$intfc,$wires);
892
 
893
                #my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v,$io_top_full_v,$system_v,$assigned_ports)=gen_module_inst($id,$soc,\$io_sim_v,\$io_top_sim_v,\$param_as_in_v,$top_ip,$intfc,$wires,\$param_pass_v,\$system_v);
894
                my $inst        = $soc->soc_get_instance_name($id);
895
                if ($id ne 'TOP'){
896
                        add_text_to_string(\$body_v,"/*******************\n*\n*\t$inst\n*\n*\n*********************/\n");
897
                        add_text_to_string(\$system_v_all,"$system_v\n")        if(defined($system_v));
898
                        add_text_to_string(\$local_param_v_all,"$local_param_v\n")      if(defined($local_param_v));
899
                        add_text_to_string(\$wire_def_v_all,"$wire_def_v\n")                    if(defined($wire_def_v));
900
                        add_text_to_string(\$inst_v_all,$inst_v)                                                if(defined($inst_v));
901
                        add_text_to_string(\$plugs_assign_v_all,"$plugs_assign_v\n")    if(defined($plugs_assign_v));
902
                        add_text_to_string(\$sockets_assign_v_all,"$sockets_assign_v\n")if(defined($sockets_assign_v));
903
                        add_text_to_string(\$io_full_v_all,"$io_full_v\n")                              if(length($io_full_v)>3);
904
                        add_text_to_string(\$io_top_full_v_all,"$io_top_full_v\n")              if(length($io_top_full_v)>3);
905
                        $io_sim_v_all     = (defined $io_sim_v_all    )? "$io_sim_v_all,\n$io_sim_v"         : $io_sim_v                if(defined($io_sim_v));
906
                }else{
907
                        add_text_to_string(\$system_v_all,"$system_v\n")        if(defined($system_v));
908
                        add_text_to_string(\$wire_def_v_all,"$wire_def_v\n")                    if(defined($wire_def_v));
909
                        add_text_to_string(\$plugs_assign_v_all,"$plugs_assign_v\n")    if(defined($plugs_assign_v));
910
                        add_text_to_string(\$sockets_assign_v_all,"$sockets_assign_v\n")if(defined($sockets_assign_v));
911
                        add_text_to_string(\$io_full_v_all,"$io_full_v\n")                              if(length($io_full_v)>3);
912
                        $io_sim_v_all     = (defined $io_sim_v_all    )? "$io_sim_v_all,\n$io_sim_v"         : $io_sim_v                if(defined($io_sim_v));
913
                        add_text_to_string(\$io_top_full_v_all,"$io_top_full_v\n")                      if(length($io_top_full_v)>3);
914
                        $clk_assigned_port= (defined $clk_assigned_port)? "$clk_assigned_port,\n$assigned_ports"  : $assigned_ports if(defined $assigned_ports);
915
                }
916
 
917
    }
918
 
919
 
920
 
921
 
922
 
923
 
924
    my $unused_wiers_v=assign_unconnected_wires($wires,$intfc);
925
    $unused_wiers_v= "" if(!defined $unused_wiers_v);
926
 
927
   my $soc_v = "
928
   $system_v_all
929
   $local_param_v_all
930
   $wire_def_v_all
931
   $unused_wiers_v
932
   $inst_v_all
933
   $plugs_assign_v_all
934
   $sockets_assign_v_all
935 25 alirezamon
 
936 48 alirezamon
";
937
        my $clk_io_full= $io_full_v_all;
938
        my $clk_io_sim=$io_sim_v_all;
939
        return ($soc_v,$clk_io_sim,$clk_io_full,$clk_assigned_port);
940 25 alirezamon
 
941 48 alirezamon
}
942 25 alirezamon
 
943 48 alirezamon
sub get_top_port_io_info{
944
        my ($top,$port,$tile_num,$params_ref,$local_param_ref)=@_;
945
        my %params =%{$params_ref} if(defined $params_ref);
946
        my %localparams=%{$local_param_ref} if(defined $local_param_ref);
947
        my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($port);
948
        my $io_port="T${tile_num}_${port}";
949
    #resolve range parameter
950
        if (defined $range ){
951
                        my @a= split (/\b/,$range);
952
                        foreach my $l (@a){
953
                                #if defined in parameter list ignore it
954
                                next  if(defined $params{$l});
955
                                ($range=$range)=~ s/\b$l\b/$localparams{$l}/g      if(defined $localparams{$l});
956
                        }
957
        }
958
        my $new_range = add_instantc_name_to_parameters(\%params,"T${tile_num}",$range);
959
        return ($io_port,$type,$new_range,$intfc_name,$intfc_port);
960
}
961 25 alirezamon
 
962
 
963
 
964
 
965 48 alirezamon
 
966 25 alirezamon
 
967
 
968
 
969 16 alirezamon
1

powered by: WebSVN 2.1.0

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