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 56

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

powered by: WebSVN 2.1.0

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