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 43

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

powered by: WebSVN 2.1.0

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