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

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

Line No. Rev Author Line
1 16 alirezamon
use Glib qw/TRUE FALSE/;
2
#use Gtk2 '-init';
3
 
4
use lib 'lib/perl';
5
 
6
use strict;
7
use warnings;
8
use soc;
9
use ip;
10
use ip_gen;
11
use Cwd;
12
 
13
 
14
 
15
 
16
 
17
######################
18
#   soc_generate_verilog
19
#####################
20
 
21
sub soc_generate_verilog{
22 34 alirezamon
        my ($soc,$sw_path)= @_;
23 25 alirezamon
        my $soc_name=$soc->object_get_attribute('soc_name');
24 16 alirezamon
        #my $top_ip=ip_gen->ip_gen_new();
25
        my $top_ip=ip_gen->top_gen_new();
26
        if(!defined $soc_name){$soc_name='soc'};
27
 
28
        my @instances=$soc->soc_get_all_instances();
29
        my $io_sim_v;
30 28 alirezamon
        my $core_id= $soc->object_get_attribute('global_param','CORE_ID');
31
        $core_id= 0 if(!defined $core_id);
32 34 alirezamon
        my $param_as_in_v="\tparameter\tCORE_ID=$core_id,
33
\tparameter\tSW_LOC=\"$sw_path\"";
34 28 alirezamon
 
35
 
36
 
37
 
38 34 alirezamon
        my $param_pass_v="\t.CORE_ID(CORE_ID),\n\t.SW_LOC(SW_LOC)";
39 16 alirezamon
        my $body_v;
40
 
41
        my ($param_v_all, $local_param_v_all, $wire_def_v_all, $inst_v_all, $plugs_assign_v_all, $sockets_assign_v_all,$io_full_v_all);
42 17 alirezamon
        my $wires=soc->new_wires();
43
        my $intfc=interface->interface_new();
44 25 alirezamon
 
45 16 alirezamon
        foreach my $id (@instances){
46 25 alirezamon
                my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v)=gen_module_inst($id,$soc,\$io_sim_v,\$param_as_in_v,$top_ip,$intfc,$wires,\$param_pass_v);
47 16 alirezamon
                my $inst        = $soc->soc_get_instance_name($id);
48
                add_text_to_string(\$body_v,"/*******************\n*\n*\t$inst\n*\n*\n*********************/\n");
49
 
50
                add_text_to_string(\$local_param_v_all,"$local_param_v\n")      if(defined($local_param_v));
51
                add_text_to_string(\$wire_def_v_all,"$wire_def_v\n")                    if(defined($wire_def_v));
52
                add_text_to_string(\$inst_v_all,$inst_v)                                                if(defined($inst_v));
53
                add_text_to_string(\$plugs_assign_v_all,"$plugs_assign_v\n")    if(defined($plugs_assign_v));
54
                add_text_to_string(\$sockets_assign_v_all,"$sockets_assign_v\n")if(defined($sockets_assign_v));
55
                add_text_to_string(\$io_full_v_all,"$io_full_v\n")                              if(defined($io_full_v));
56
 
57
                #print  "$param_v $local_param_v $wire_def_v $inst_v $plugs_assign_v $sockets_assign_v $io_full_v";
58
 
59
        }
60 17 alirezamon
        my ($addr_map,$addr_localparam,$module_addr_localparam)= generate_address_cmp($soc,$wires);
61 16 alirezamon
 
62
        #add functions
63
        my $dir = Cwd::getcwd();
64
        open my $file1, "<", "$dir/lib/verilog/functions.v" or die;
65
        my $functions_all='';
66
        while (my $f1 = readline ($file1)) {
67
                 $functions_all="$functions_all $f1 ";
68
        }
69
        close($file1);
70 17 alirezamon
        my $unused_wiers_v=assign_unconnected_wires($wires,$intfc);
71
 
72 16 alirezamon
 
73
        my $soc_v = (defined $param_as_in_v )? "module $soc_name #(\n $param_as_in_v\n)(\n$io_sim_v\n);\n": "module $soc_name (\n$io_sim_v\n);\n";
74
        add_text_to_string(\$soc_v,$functions_all);
75
        add_text_to_string(\$soc_v,$local_param_v_all);
76
        add_text_to_string(\$soc_v,$addr_localparam);
77
        add_text_to_string(\$soc_v,$module_addr_localparam);
78
        add_text_to_string(\$soc_v,$io_full_v_all);
79
        add_text_to_string(\$soc_v,$wire_def_v_all);
80 17 alirezamon
        add_text_to_string(\$soc_v,$unused_wiers_v);
81 16 alirezamon
        add_text_to_string(\$soc_v,$inst_v_all);
82
        add_text_to_string(\$soc_v,$plugs_assign_v_all);
83
        add_text_to_string(\$soc_v,$sockets_assign_v_all);
84
        add_text_to_string(\$soc_v,$addr_map);
85
        add_text_to_string(\$soc_v,"endmodule\n\n");
86
 
87
 
88 34 alirezamon
        $soc->object_add_attribute('top_ip',undef,$top_ip);
89 17 alirezamon
        #print @assigned_wires;
90 16 alirezamon
 
91 25 alirezamon
        #generate topmodule
92
 
93
        my $top_v = (defined $param_as_in_v )? "module ${soc_name}_top #(\n $param_as_in_v\n)(\n$io_sim_v\n);\n": "module ${soc_name}_top (\n $io_sim_v\n);\n";
94
        my $ins= gen_soc_instance_v($soc,$soc_name,$param_pass_v);
95 34 alirezamon
        add_text_to_string(\$top_v,$functions_all);
96 25 alirezamon
        add_text_to_string(\$top_v,$local_param_v_all."\n".$io_full_v_all);
97
        add_text_to_string(\$top_v,$ins);
98 28 alirezamon
        my ($readme,$prog)=gen_system_info($soc,$param_as_in_v);
99
        return ("$soc_v",$top_v,$readme,$prog);
100 25 alirezamon
 
101
 
102 16 alirezamon
}
103
 
104
#################
105
#       gen_module_inst
106
###############
107
 
108
sub gen_module_inst {
109 25 alirezamon
        my ($id,$soc,$io_sim_v,$param_as_in_v,$top_ip, $intfc,$wires,$param_pass_v)=@_;
110 16 alirezamon
        my $module      =$soc->soc_get_module($id);
111
        my $module_name =$soc->soc_get_module_name($id);
112
        my $category    =$soc->soc_get_category($id);
113
 
114
        my $inst        = $soc->soc_get_instance_name($id);
115
        my %params      = $soc->soc_get_module_param($id);
116 17 alirezamon
 
117 16 alirezamon
        my $ip = ip->lib_new ();
118
 
119
        my @ports=$ip->ip_list_ports($category,$module);
120 25 alirezamon
        my ($inst_v,$intfc_v,$plugs_assign_v,$sockets_assign_v,$io_full_v);
121
        my $wire_def_v="";
122 16 alirezamon
        $plugs_assign_v="\n";
123
 
124
        my $counter=0;
125
        my @param_order=$soc->soc_get_instance_param_order($id);
126
 
127 25 alirezamon
        my ($param_v,$local_param_v,$instance_param_v)= gen_parameter_v(\%params,$id,$inst,$category,$module,$ip,$param_as_in_v,\@param_order,$top_ip,$param_pass_v);
128 16 alirezamon
 
129
 
130 25 alirezamon
 
131 16 alirezamon
        $top_ip->top_add_def_to_instance($id,'module',$module);
132
        $top_ip->top_add_def_to_instance($id,'module_name',$module_name);
133
        $top_ip->top_add_def_to_instance($id,'category',$category);
134
        $top_ip->top_add_def_to_instance($id,'instance',$inst);
135
 
136
 
137
 
138
 
139
 
140
 
141
        #module name    
142 25 alirezamon
        $inst_v=( defined $instance_param_v )? "$module_name #(\n": $module_name ;
143 16 alirezamon
 
144
 
145
 
146
        #module parameters
147 25 alirezamon
        $inst_v=( defined $instance_param_v)? "$inst_v $instance_param_v\n\t)": $inst_v;
148 16 alirezamon
        #module instance name 
149
        $inst_v="$inst_v  $inst \t(\n";
150
 
151
        #module ports
152
        $counter=0;
153
        foreach my $port (@ports){
154
                my ($type,$range,$intfc_name,$i_port)=$ip->ip_get_port($category,$module,$port);
155
                my $assigned_port;
156
                my($i_type,$i_name,$i_num) =split("[:\[ \\]]", $intfc_name);
157
                my $IO='no';
158
                my $NC='no';
159
                if($i_type eq 'plug'){
160
                        my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($id,$i_name,$i_num);
161
                        if($connect_id eq 'IO'){ $IO='yes';}
162
                        if($connect_id eq 'NC'){ $NC='yes';}
163
                }
164
                if($i_type eq 'socket' && $i_name ne'wb_addr_map'){
165
 
166
                        my ($ref1,$ref2)= $soc->soc_get_modules_plug_connected_to_socket($id,$i_name,$i_num);
167
                        my %connected_plugs=%$ref1;
168
                        my %connected_plug_nums=%$ref2;
169
                        if(!%connected_plugs ){
170
                                my  ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($id,$i_name);
171
                                my $v=$soc->soc_get_module_param_value($id,$s_value);
172
                                if ( length( $v || '' )){ $IO='no';} else {$IO='yes';}
173
                        }
174
                }
175
                if($NC eq 'yes'){
176
 
177
 
178
                }
179
                elsif($IO eq 'yes' || !defined $i_type || !defined $i_name || !defined $i_num){ #its an IO port
180 25 alirezamon
                        if($i_port eq 'NC'){
181
                                $NC='yes';
182
                        }else {
183
                                 $assigned_port="$inst\_$port";
184
                                 $$io_sim_v= (!defined $$io_sim_v)? "\t$assigned_port" : "$$io_sim_v, \n\t$assigned_port";
185
                                 my $new_range = add_instantc_name_to_parameters(\%params,$inst,$range);
186
                                 my $port_def=(length ($range)>1 )?     "\t$type\t [ $new_range    ] $assigned_port;\n": "\t$type\t\t\t$assigned_port;\n";
187
                                 add_text_to_string(\$io_full_v,$port_def);
188
                                # $top_ip->ipgen_add_port($assigned_port, $new_range, $type ,$intfc_name,$i_port);
189
                                $top_ip->top_add_port($id,$assigned_port, $new_range, $type ,$intfc_name,$i_port);
190
                        }
191 16 alirezamon
 
192
 
193
                }
194
                else{ # port connected internally using interface 
195
                         $assigned_port="$inst\_$i_type\_$i_name\_$i_num\_$i_port";
196
 
197
                         #create plug wires
198 25 alirezamon
                         my ($wire_string,$port_name)=generate_wire ($range,$assigned_port,$inst,\%params,$i_type,$i_name,$i_num,$i_port, $wires);
199
                         #add wire def if it is not defined before
200
 
201
                         add_text_to_string(\$wire_def_v,$wire_string)  if ($wire_def_v !~ /[\s\]]$port_name;/);
202 16 alirezamon
 
203
 
204
 
205
                        if($i_type eq 'plug'){
206
                                #read socket port name
207
                                my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($id,$i_name,$i_num);
208
                                my ($i_range,$t,$i_connect)=$intfc->get_port_info_of_plug($i_name,$i_port);
209
                                #my $connect_port= "socket_$i_name\_$i_num\_$i_connect";
210
                                if(defined $connect_socket_num){
211
                                        my $connect_n=$soc->soc_get_instance_name($connect_id);
212
                                        my $connect_port= "$connect_n\_socket_$i_name\_$connect_socket_num\_$i_connect";
213
                                        #connect plug port to socket port
214
                                        my $new_range = add_instantc_name_to_parameters(\%params,$inst,$range);
215
                                        my $connect_port_range=(length($new_range)>1)?"$connect_port\[$new_range\]":$connect_port;
216 17 alirezamon
 
217
                                        if($type eq 'input' ){
218
                                                $plugs_assign_v= "$plugs_assign_v \tassign  $assigned_port = $connect_port_range;\n";
219
                                                $wires->wire_add($assigned_port,"connected",1);
220
 
221
                                        }else{
222
                                                $plugs_assign_v= "$plugs_assign_v \tassign  $connect_port  = $assigned_port;\n";
223
                                                $wires->wire_add($connect_port,"connected",1);
224
                                        }
225
 
226
 
227 16 alirezamon
                                }
228
                        }#plug
229
                        else{ #socket
230
                                my  ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($id,$i_name);
231
                                my $v=$soc->soc_get_module_param_value($id,$s_value);
232
                                my ($i_range,$t,$i_connect)=$intfc->get_port_info_of_socket($i_name,$i_port);
233
                                if ( length( $v || '' )) {
234
                                                $v--;
235
                                                my $name= $soc->soc_get_instance_name($id);
236
                                                my $joint= "$name\_$i_type\_$i_name\_$v\_$i_port";
237
 
238 25 alirezamon
                                                my ($wire_string,$port_name)=generate_wire ($i_range,"$name\_$i_type\_$i_name\_$v\_$i_port",$inst,\%params,$i_type,$i_name,$i_num,$i_port, $wires);
239
                                                add_text_to_string(\$wire_def_v,$wire_string) if ($wire_def_v !~ /[\s\]]$port_name;/);
240 16 alirezamon
 
241
                                                for(my $i=$v-1; $i>=0; $i--) {
242
                                                        $joint= "$joint ,$name\_$i_type\_$i_name\_$i\_$i_port";
243
                                                        #create socket wires
244
                                                         #create plug wires
245 25 alirezamon
                                                        my ($wire_string,$port_name)=generate_wire ($i_range,"$name\_$i_type\_$i_name\_$i\_$i_port",$inst,\%params,$i_type,$i_name,$i_num,$i_port, $wires);
246
                                                        add_text_to_string(\$wire_def_v,$wire_string) if ($wire_def_v !~ /[\s\]]$port_name;/);
247 16 alirezamon
 
248
 
249
 
250
 
251
 
252
 
253
                                                }
254 17 alirezamon
                                                $wires->wire_add($assigned_port,"connected",1)  if($type eq 'input');
255
                                                if($type ne 'input' ){
256
                                                        my @w=split('\s*,\s*',$joint);
257
                                                        foreach my $q (@w) {
258
                                                                $wires->wire_add($q,"connected",1);
259
                                                        }
260
 
261
                                                }
262
                                                $joint=($v>0)? "\{ $joint\ }" : "$joint";
263
                                                my $text=($type eq 'input' )? "\tassign $assigned_port = $joint;\n": "\tassign $joint = $assigned_port;\n";
264
 
265 16 alirezamon
                                                add_text_to_string(\$sockets_assign_v,$text);
266
                                }
267
 
268
 
269
 
270
                        }#socket        
271
 
272
 
273
                }
274
 
275
 
276
 
277 17 alirezamon
                if (++$counter == scalar(@ports)){#last port def
278 16 alirezamon
 
279
                        $inst_v=($NC eq 'yes')? "$inst_v\t\t.$port()\n": "$inst_v\t\t.$port($assigned_port)\n";
280
 
281
                }
282
                else {
283
                        $inst_v=($NC eq 'yes')? "$inst_v\t\t.$port(),\n":"$inst_v\t\t.$port($assigned_port),\n";
284
                }
285
 
286 17 alirezamon
                if($type ne 'input' && $NC ne 'yes' ){
287
                        $wires->wire_add($assigned_port,"connected",1);
288
 
289
                }
290 16 alirezamon
 
291
 
292
 
293
        }
294
        $inst_v="$inst_v\t);\n";
295
 
296 17 alirezamon
 
297
 
298
 
299 25 alirezamon
        return ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v,$param_pass_v);
300 16 alirezamon
 
301
 
302
}
303
 
304
 
305
sub add_instantc_name_to_parameters{
306
        my ($params_ref,$inst,$range)=@_;
307
        my $new_range=$range;
308
        #print "$new_range\n";
309
 
310
        my @list=sort keys%{$params_ref};
311
        foreach my $param (@list){
312
                my $new_param= "$inst\_$param";
313
                ($new_range=$new_range)=~ s/\b$param\b/$new_param/g;
314
                #print "$new_range= s/\b$param\b/$new_param/g\n";
315
        }
316
                return $new_range;
317
}
318
 
319
 
320
sub gen_parameter_v{
321 25 alirezamon
        my ($param_ref,$id,$inst,$category,$module,$ip,$param_as_in_v,$ref_ordered,$top_ip,$param_pass_v)=@_;
322 16 alirezamon
        my %params=%$param_ref;
323
        my @param_order;
324
        @param_order=@{$ref_ordered} if(defined $ref_ordered);
325
 
326
        my ($param_v,$local_param_v,$instance_param_v);
327
        my @list;
328
        @list= (@param_order)? @param_order :
329
sort keys%params;
330
        my $first_param=1;
331 25 alirezamon
 
332 16 alirezamon
        $local_param_v="";
333
        $param_v="";
334 25 alirezamon
 
335 16 alirezamon
        #add instance name to parameter value
336
        foreach my $param (@list){
337
                $params{$param}=add_instantc_name_to_parameters(\%params,$inst,$params{$param});
338
 
339
        }
340
 
341
 
342
        #print parameters
343
        foreach my $param (@list){
344
                my $inst_param= "$inst\_$param";
345 25 alirezamon
                my ($deafult,$type,$content,$info,$vfile_param_type,$redefine_param)= $ip->ip_get_parameter($category,$module,$param);
346
                $vfile_param_type= "Don't include" if (!defined $vfile_param_type );
347
                $vfile_param_type= "Parameter"  if ($vfile_param_type eq 1);
348
                $vfile_param_type= "Localparam" if ($vfile_param_type eq 0);
349
                $redefine_param=1 if (! defined $redefine_param);
350
                $redefine_param=0 if ($vfile_param_type eq "Don't include");
351
                if($redefine_param eq 1){
352
                        $instance_param_v=($first_param eq 1)? "\t\t.$param($inst_param)" : "$instance_param_v,\n\t\t.$param($inst_param)";
353
                        $first_param=0;
354 16 alirezamon
 
355
                }
356
 
357
 
358 25 alirezamon
 
359
                if($vfile_param_type eq "Localparam"){
360 16 alirezamon
                        $local_param_v="$local_param_v\tlocalparam\t$inst_param=$params{$param};\n";
361 25 alirezamon
                }
362
                elsif($vfile_param_type eq "Parameter"){
363 16 alirezamon
                        $param_v="$param_v\tparameter\t$inst_param=$params{$param};\n";
364 25 alirezamon
                        $$param_pass_v =(defined ($$param_pass_v ))? "$$param_pass_v,\n\t.$inst_param($inst_param)": "\t.$inst_param($inst_param)";
365 16 alirezamon
                        $$param_as_in_v=(defined ($$param_as_in_v))? "$$param_as_in_v ,\n\tparameter\t$inst_param=$params{$param}":
366
                                                                                                                 "   \tparameter\t$inst_param=$params{$param}";
367
                        #add parameter to top 
368
                        #$top_ip  $inst_param                   
369 25 alirezamon
                        $top_ip->top_add_parameter($id,$inst_param,$params{$param},$type,$content,$info,$vfile_param_type,$redefine_param);
370 16 alirezamon
 
371
                }
372
 
373
 
374
 
375
        }
376
 
377
        return ($param_v,$local_param_v,$instance_param_v);
378
 
379
 
380
}
381
 
382
###############
383
#       generate_address_cmp
384
##############
385
 
386
sub generate_address_cmp{
387 17 alirezamon
        my ($soc,$wires)=@_;
388 16 alirezamon
        my $number=0;
389
        my $addr_mp_v="\n//Wishbone slave address match\n";
390
        my $instance_addr_localparam="\n//Wishbone slave base address based on instance name\n";
391
        my $module_addr_localparam="\n//Wishbone slave base address based on module name. \n";
392
 
393
        my @all_instances=$soc->soc_get_all_instances();
394
        foreach my $instance_id (@all_instances){
395
                my $instance_name=$soc->soc_get_instance_name($instance_id);
396
                        my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
397
                        foreach my $plug (@plugs){
398 25 alirezamon
                                my @nums=$soc->soc_list_plug_nums($instance_id,$plug);
399 16 alirezamon
                                foreach my $num (@nums){
400
                                        my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($instance_id,$plug,$num);
401
                                        if((defined $connect_socket) && ($connect_socket eq 'wb_slave')){
402 25 alirezamon
                                                #read wishbone bus address and data width size                                          
403
                                                my $Aw=$soc->soc_get_module_param_value ($connect_id,'Aw');
404
                                                my $Dw=$soc->soc_get_module_param_value ($connect_id,'Dw');
405
                                                $Aw=32 if (!defined $Aw);
406
                                                $Dw=32 if (!defined $Dw);
407 16 alirezamon
                                                add_text_to_string(\$addr_mp_v,"/* $instance_name wb_slave $num */\n");
408 25 alirezamon
                                                #count how many nibbles we have in address size 
409
                                                my $hh= ($Aw % 4)? ($Aw >> 2)+1 : ($Aw >> 2);
410
                                                $hh= "'h%0${hh}x";#hex address nibble num
411
                                                #change addresses to word as the assign addresses by ProNoC GUI are in bytes  
412
                                                my $bytenum=($Dw/8);
413
                                                my $base_hex=$Aw.sprintf($hh, ($base/$bytenum));
414
                                                my $end_hex=$Aw.sprintf($hh, ($end/$bytenum));
415
                                                #my $base_hex=sprintf("32'h%08x", ($base>>2));
416
                                                #my $end_hex=sprintf("32'h%08x", ($end>>2));
417
                                                add_text_to_string(\$instance_addr_localparam,"\tlocalparam \t$instance_name\_WB$num\_BASE_ADDR\t=\t$base_hex;\n");
418
                                                add_text_to_string(\$instance_addr_localparam,"\tlocalparam \t$instance_name\_WB$num\_END_ADDR\t=\t$end_hex;\n");
419 16 alirezamon
                                                if($instance_name ne $instance_id){
420 25 alirezamon
                                                        add_text_to_string(\$module_addr_localparam,"\tlocalparam \t$instance_id\_WB$num\_BASE_ADDR\t=\t$base_hex;\n");
421
                                                        add_text_to_string(\$module_addr_localparam,"\tlocalparam \t$instance_id\_WB$num\_END_ADDR\t=\t$end_hex;\n");
422 16 alirezamon
                                                }
423
 
424 17 alirezamon
                                                my $connect_name=$soc->soc_get_instance_name($connect_id);
425
                                                $wires->wire_add("$connect_name\_socket_wb_addr_map_0_sel_one_hot","connected",1);
426 25 alirezamon
                                                $addr_mp_v="$addr_mp_v \tassign $connect_name\_socket_wb_addr_map_0_sel_one_hot[$connect_socket_num\] = (($connect_name\_socket_wb_addr_map_0_grant_addr >= $instance_name\_WB$num\_BASE_ADDR)   & ($connect_name\_socket_wb_addr_map_0_grant_addr <= $instance_name\_WB$num\_END_ADDR));\n";
427 16 alirezamon
 
428
                                                $number++;
429
                                        }#if
430
                                }#foreach my $num
431
                        }#foreach my $plug
432
                }#foreach my $instance_id
433
 
434
                add_text_to_string(\$instance_addr_localparam,"\n");
435
                add_text_to_string(\$module_addr_localparam,"\n");
436
                return ($addr_mp_v,$instance_addr_localparam,$module_addr_localparam);
437
}
438
 
439
 
440
 
441
 
442
 
443
 
444
 
445
 
446
 
447
sub add_text_to_string{
448
                my ($string,$text)=@_;
449
                if(defined $text){
450
                        $$string=(defined ($$string))? "$$string $text" : $text;
451
                }
452
}
453
 
454
 
455
 
456
sub generate_wire {
457 17 alirezamon
        my($range,$port_name,$inst_name,$params_ref,$i_type,$i_name,$i_num,$i_port, $wires)=@_;
458 16 alirezamon
        my $wire_string;
459 17 alirezamon
        my $new_range;
460 16 alirezamon
        if(length ($range)>1 ){
461
                #replace parameter in range
462 17 alirezamon
                $new_range = add_instantc_name_to_parameters($params_ref,$inst_name,$range);
463 16 alirezamon
                $wire_string= "\twire\t[ $new_range ] $port_name;\n";
464
        }
465
        else{
466
                $wire_string="\twire\t\t\t $port_name;\n";
467 17 alirezamon
        }
468
        $wires->wire_add("$port_name","range",$new_range);
469
        $wires->wire_add("$port_name","inst_name",$inst_name);
470
        $wires->wire_add("$port_name","i_type",$i_type);
471
        $wires->wire_add("$port_name","i_name",$i_name);
472
        $wires->wire_add("$port_name","i_num",$i_num);
473
        $wires->wire_add("$port_name","i_port",$i_port);
474
 
475 25 alirezamon
        return ($wire_string,$port_name);
476 16 alirezamon
}
477
 
478 17 alirezamon
sub port_width_repeat{
479
        my ($range,$value)=@_;
480 18 alirezamon
        return "$value" if (!defined $range);
481
        $range= remove_all_white_spaces($range);
482 17 alirezamon
        my ($h,$l)=split(':',$range);
483
        return "$value" if(!defined $h ) ; # port width is 1
484
        return "$value" if($h eq "0" && "$l" eq "0"); # port width is 1
485
        $h=$l if($h eq "0" && "$l" ne "0");
486
        if($h =~ /-1$/){ # the address ranged is endup with -1 
487
                $h =~ s/-1$//; # remove -1
488
                return "\{$h\{$value\}\}"  if($h =~ /\)$/);
489
                return "\{($h)\{$value\}\}" if($h =~ /[\*\.\+\-\^\%\&]/);
490
                return "\{$h\{$value\}\}";
491
        }
492
        return "\{($h+1){$value}}";
493
}
494 16 alirezamon
 
495 17 alirezamon
sub assign_unconnected_wires{
496
        my($wires,$intfc)=@_;
497
        my $unused_wire_v=undef;
498
 
499
        my @all_wires=$wires->wires_list();
500
        foreach my $p (@all_wires ){
501
                if(!defined $wires->wire_get($p,"connected")){ # unconnected wires
502
                        # Take default value from interface definition 
503
                        #$wires->wire_get("$p","inst_name");
504
                        my $i_type=$wires->wire_get($p,"i_type");
505
                        my $i_name= $wires->wire_get($p,"i_name");
506
                        my $i_num=$wires->wire_get($p,"i_num");
507
                        my $i_port=$wires->wire_get($p,"i_port");
508
                        my $new_range=$wires->wire_get($p,"range");
509
                        my ($range,$type,$connect,$default_out) = ($i_type eq "socket" )? $intfc->get_port_info_of_socket($i_name,$i_port):
510
                                                                                                                                                          $intfc->get_port_info_of_plug($i_name,$i_port);
511
                        #""Active high","Don't care"
512
 
513
                        my $default=(!defined $default_out                )? port_width_repeat($new_range,"1\'bx"):
514
                                                ($default_out eq 'Active low' )? port_width_repeat($new_range,"1\'b0"):
515
                                            ($default_out eq 'Active high')? port_width_repeat($new_range,"1\'b1"):
516
                                                ($default_out eq 'Don\'t care')? port_width_repeat($new_range,"1\'bx"): $default_out;
517
 
518
 
519 18 alirezamon
                        $unused_wire_v= (defined $unused_wire_v)? "$unused_wire_v \tassign ${p} = $default;\n" : "\tassign ${p} = $default;\n";
520 17 alirezamon
 
521
                }
522
 
523
        }
524
        $unused_wire_v="\n//Take the default value for ports that defined by interfaces but did not assigned to any wires.\n $unused_wire_v\n\n" if(defined $unused_wire_v);
525
        return $unused_wire_v;
526 16 alirezamon
 
527 17 alirezamon
 
528
}
529 16 alirezamon
 
530
 
531
 
532
 
533 25 alirezamon
sub gen_soc_instance_v{
534
        my ($soc,$soc_name,$param_pass_v)=@_;
535
        my $soc_v;
536
        my $processor_en=0;
537
 
538
        add_text_to_string(\$soc_v,"
539 16 alirezamon
 
540 25 alirezamon
// Allow software to remote reset/enable the cpu via jtag
541 16 alirezamon
 
542 25 alirezamon
        wire jtag_cpu_en, jtag_system_reset;
543 16 alirezamon
 
544 25 alirezamon
        jtag_system_en jtag_en (
545
                .cpu_en(jtag_cpu_en),
546
                .system_reset(jtag_system_reset)
547
 
548
        );
549
 
550
 
551 16 alirezamon
 
552 25 alirezamon
 
553
 
554
 
555
 
556
");
557
 
558
 
559
        my $mm="$soc_name #(\n $param_pass_v \n\t)the_${soc_name}(\n";
560
 
561
        my $top=$soc->soc_get_top();
562
        my @intfcs=$top->top_get_intfc_list();
563
 
564
        my $i=0;
565
 
566
 
567
 
568
 
569
        my $ss="";
570
        my $ww="";
571
 
572
foreach my $intfc (@intfcs){
573
 
574
 
575
 
576
                #reset
577
                if( $intfc eq 'plug:reset[0]'){
578
                        my @ports=$top->top_get_intfc_ports_list($intfc);
579
                        foreach my $p (@ports){
580
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
581
                                $mm="$mm," if ($i);
582
                                $mm="$mm\n\t\t.$p(${p}_ored_jtag)";
583
                                $ss="$ss\tassign ${p}_ored_jtag = (jtag_system_reset | $p);\n";
584
                                $ww="$ww\twire ${p}_ored_jtag;\n";
585
                                $i=1;
586
 
587
                        }
588
 
589
 
590
 
591
                }
592
                #enable
593
                elsif( $intfc eq 'plug:enable[0]'){
594
                        my @ports=$top->top_get_intfc_ports_list($intfc);
595
                        foreach my $p (@ports){
596
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
597
                                $mm="$mm," if ($i);
598
                                $mm="$mm\n\t\t.$p(${p}_anded_jtag)";
599
                                $ss="$ss\tassign ${p}_anded_jtag= (jtag_cpu_en & $p);\n";
600
                                $ww="$ww\twire ${p}_anded_jtag;\n";
601
                                $processor_en=1;
602
                                $i=1;
603
 
604
                        }
605
 
606
 
607
                }
608
                else {
609
                #other interface
610
                        my @ports=$top->top_get_intfc_ports_list($intfc);
611
                        foreach my $p (@ports){
612
                        my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
613
                        $mm="$mm," if ($i);
614
                        $mm="$mm\n\t\t.$p($p)";
615
                        $i=1;
616
 
617
                        }
618
 
619
 
620
                }
621
 
622
 
623
        }
624
        $mm="$mm\n\t);";
625
        add_text_to_string(\$soc_v,"$ww\n");
626
        add_text_to_string(\$soc_v,"$mm\n");
627
        add_text_to_string(\$soc_v,"$ss\n");
628
        add_text_to_string(\$soc_v,"\n endmodule\n");
629
 
630
 
631
 
632
 
633
 
634
 
635
 
636
        return $soc_v;
637
 
638
}
639
 
640
 
641
 
642
 
643
 
644
 
645
 
646
 
647
 
648
 
649
 
650
 
651
sub gen_system_info {
652
        my ($soc,$param)=@_;
653
        my ($wb_slaves,$wb_masters,$other,$jtag);
654
        #my (@newbase,@newend,@connects);
655
 
656
 
657 28 alirezamon
   $jtag='';
658 25 alirezamon
 
659 28 alirezamon
        my @all_instances=$soc->soc_get_all_instances();
660 25 alirezamon
 
661 28 alirezamon
my %jtagwb; my %ram;
662
 
663
 
664 25 alirezamon
        foreach my $instance_id (@all_instances){
665 28 alirezamon
                my $category=$soc->soc_get_category($instance_id);
666
 
667 25 alirezamon
                my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
668
                foreach my $plug (@plugs){
669
                        my @nums=$soc->soc_list_plug_nums($instance_id,$plug);
670
                        foreach my $num (@nums){
671
                                my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($instance_id,$plug,$num);
672 28 alirezamon
 
673 25 alirezamon
                                my $instance_name=$soc->soc_get_instance_name($instance_id);
674
                                my $connect_name=$soc->soc_get_instance_name($connect_id);
675
                                #get interfaces
676
                                if((defined $connect_socket) && ($connect_socket eq 'wb_slave')){
677
 
678
                                        $base=sprintf("0x%08x", $base);
679
                                        $end=sprintf("0x%08x", $end);
680 28 alirezamon
                                        add_text_to_string(\$wb_slaves, "\t$instance_name, $name, $connect_name, $base, $end\n");
681
                                        if ($category eq 'RAM') {
682
                                                $ram{$instance_id}{'base'}=$base;
683
                                                $ram{$instance_id}{'end'}=$end;
684
                                                $ram{$instance_id}{'connect'}=$connect_id;
685
                                        }
686 25 alirezamon
 
687
                                }#if
688
                                elsif((defined $connect_socket) && ($connect_socket eq 'wb_master')){
689
                                        add_text_to_string(\$wb_masters,"\t$instance_name, $name, $connect_name\n");
690
                                }
691
                                elsif(defined $connect_socket) {
692
                                        add_text_to_string(\$other,"\t$instance_name, $name, $connect_name\n");
693
 
694
                                }
695
                                # get jtag_wbs
696
                                if((defined $connect_socket) && ($connect_socket eq 'wb_master') && ($instance_id =~ /jtag_wb/)){
697
                                        my $index=$soc->soc_get_module_param_value($instance_id,'VJTAG_INDEX');
698 28 alirezamon
 
699 25 alirezamon
                                        add_text_to_string(\$jtag, "\t$instance_name,  $connect_name, $index\n");
700 28 alirezamon
                                        $jtagwb{$connect_id}{'index'}=$index;
701 25 alirezamon
 
702
                                }
703
 
704
 
705
                        }#foreach my $num
706
                }#foreach my $plug
707
        }#foreach my $instance_id
708
 
709 28 alirezamon
        #Generate memory programming command
710
my $prog='#!/bin/sh
711 25 alirezamon
 
712 28 alirezamon
JTAG_MAIN="$PRONOC_WORK/toolchain/bin/jtag_main"
713
 
714
';
715
 
716
 
717
        foreach my $instance_id (@all_instances){
718
                my $category=$soc->soc_get_category($instance_id);
719
                if ($category eq 'RAM') {
720
 
721
                        my $jtag_connect=$soc->soc_get_module_param_value($instance_id,'JTAG_CONNECT');
722
                        my $aw=$soc->soc_get_module_param_value($instance_id,'Aw');
723
                        my $dw=$soc->soc_get_module_param_value($instance_id,'Dw');
724
                        my $JTAG_INDEX=$soc->soc_get_module_param_value($instance_id,'JTAG_INDEX');
725
 
726
                        #check if jtag_index is a parameter
727
                        my $v=$soc->soc_get_module_param_value($instance_id,$JTAG_INDEX);
728
                        $JTAG_INDEX = $v if (defined $v);
729
                        $v= $soc->object_get_attribute('global_param',$JTAG_INDEX);
730
                        $JTAG_INDEX = $v if (defined $v);
731
 
732 34 alirezamon
                        my $BINFILE=$soc->soc_get_module_param_value($instance_id,'JTAG_MEM_FILE');
733 28 alirezamon
                        ($BINFILE)=$BINFILE=~ /"([^"]*)"/ if(defined $BINFILE);
734
                        $BINFILE=(defined $BINFILE) ? $BINFILE.'.bin' : 'ram0.bin';
735
 
736
                        my $OFSSET="0x00000000";
737 34 alirezamon
                        my $end=((1 << $aw)*($dw/8))-1;
738 28 alirezamon
                        my $BOUNDRY=sprintf("0x%08x", $end);
739
                        if($jtag_connect =~ /JTAG_WB/){
740
                                $prog= "$prog \$JTAG_MAIN -n $JTAG_INDEX -s \"$OFSSET\" -e \"$BOUNDRY\" -i  \"$BINFILE\" -c";
741
                                #print "prog= $prog\n";
742
 
743
                        }elsif ($jtag_connect eq 'ALTERA_IMCE'){
744
                                #TODO add later
745
 
746
 
747
                        } else{
748
                                #disabled check if its connected to jtag_wb via the bus
749
                                my      $connect_id = $ram{$instance_id}{'connect'};
750
                                my $OFSSET = $ram{$instance_id}{'base'};
751
                                my $BOUNDRY = $ram{$instance_id}{'end'};
752
                                if(defined $connect_id){
753
                                        #print "id=$connect_id\n";
754
                                        my $JTAG_INDEX= $jtagwb{$connect_id}{'index'};
755
                                                if(defined $JTAG_INDEX){
756
                                                        $v= $soc->object_get_attribute('global_param',$JTAG_INDEX);
757
                                                        $JTAG_INDEX = $v if (defined $v);
758
                                                        $prog= "$prog \$JTAG_MAIN -n $JTAG_INDEX -s \"$OFSSET\" -e \"$BOUNDRY\" -i  \"$BINFILE\" -c";
759
                                                        #print "prog= $prog\n";
760
 
761
                                                }
762
 
763
                                }
764
                        }
765
 
766
 
767
                }
768
 
769
 
770
        }
771
 
772
 
773 25 alirezamon
my $lisence= get_license_header("readme");
774
my $warning=autogen_warning();
775
 
776
 
777
 
778
 
779
my $readme="
780
$warning
781
$lisence
782
 
783
***********************
784
**      Program the memories
785
***********************
786
 
787
If the memory core and jtag_wb are connected to the same wishbone bus, you can program the memory using
788
 
789
        sh program.sh
790
 
791
 
792
 
793
***************************
794
**      soc parameters
795
***************************
796
 
797
$param
798
 
799
****************************
800
**      wishbone bus(es)  info
801
****************************
802
        #slave interfaces:
803
        #instance name,  interface name, connected to, base address, boundray address
804
$wb_slaves
805
 
806
        #master interfaces:
807
        #instance name,  interface name, connected to
808
$wb_masters
809
 
810
****************************
811
**      Jtag to wishbone interface (jtag_wb) info:
812
****************************
813
 
814
        #instance name, instance name,  VJTAG_INDEX
815
$jtag
816
 
817
 
818
";
819
 
820 28 alirezamon
 
821
 
822
 
823
        return ($readme,$prog);
824 25 alirezamon
 
825
 
826
 
827
}
828
 
829
 
830
 
831
 
832
 
833
 
834
 
835
 
836
 
837
 
838
 
839 16 alirezamon
1;
840
 
841
 

powered by: WebSVN 2.1.0

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