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 25

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

powered by: WebSVN 2.1.0

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