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] - Diff between revs 25 and 28

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 25 Rev 28
use Glib qw/TRUE FALSE/;
use Glib qw/TRUE FALSE/;
#use Gtk2 '-init';
#use Gtk2 '-init';
 
 
use lib 'lib/perl';
use lib 'lib/perl';
 
 
use strict;
use strict;
use warnings;
use warnings;
use soc;
use soc;
use ip;
use ip;
use ip_gen;
use ip_gen;
use Cwd;
use Cwd;
 
 
 
 
 
 
 
 
 
 
######################
######################
#   soc_generate_verilog
#   soc_generate_verilog
#####################
#####################
 
 
sub soc_generate_verilog{
sub soc_generate_verilog{
        my ($soc)= @_;
        my ($soc)= @_;
        my $soc_name=$soc->object_get_attribute('soc_name');
        my $soc_name=$soc->object_get_attribute('soc_name');
        #my $top_ip=ip_gen->ip_gen_new();
        #my $top_ip=ip_gen->ip_gen_new();
        my $top_ip=ip_gen->top_gen_new();
        my $top_ip=ip_gen->top_gen_new();
        if(!defined $soc_name){$soc_name='soc'};
        if(!defined $soc_name){$soc_name='soc'};
 
 
        my @instances=$soc->soc_get_all_instances();
        my @instances=$soc->soc_get_all_instances();
        my $io_sim_v;
        my $io_sim_v;
        my $param_as_in_v="\tparameter\tCORE_ID=0";
        my $core_id= $soc->object_get_attribute('global_param','CORE_ID');
 
        $core_id= 0 if(!defined $core_id);
 
        my $param_as_in_v="\tparameter\tCORE_ID=$core_id";
 
 
 
 
 
 
 
 
        my $param_pass_v="\t.CORE_ID(CORE_ID)";
        my $param_pass_v="\t.CORE_ID(CORE_ID)";
        my $body_v;
        my $body_v;
 
 
        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);
        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);
        my $wires=soc->new_wires();
        my $wires=soc->new_wires();
        my $intfc=interface->interface_new();
        my $intfc=interface->interface_new();
 
 
        foreach my $id (@instances){
        foreach my $id (@instances){
                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);
                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);
                my $inst        = $soc->soc_get_instance_name($id);
                my $inst        = $soc->soc_get_instance_name($id);
                add_text_to_string(\$body_v,"/*******************\n*\n*\t$inst\n*\n*\n*********************/\n");
                add_text_to_string(\$body_v,"/*******************\n*\n*\t$inst\n*\n*\n*********************/\n");
 
 
                add_text_to_string(\$local_param_v_all,"$local_param_v\n")      if(defined($local_param_v));
                add_text_to_string(\$local_param_v_all,"$local_param_v\n")      if(defined($local_param_v));
                add_text_to_string(\$wire_def_v_all,"$wire_def_v\n")                    if(defined($wire_def_v));
                add_text_to_string(\$wire_def_v_all,"$wire_def_v\n")                    if(defined($wire_def_v));
                add_text_to_string(\$inst_v_all,$inst_v)                                                if(defined($inst_v));
                add_text_to_string(\$inst_v_all,$inst_v)                                                if(defined($inst_v));
                add_text_to_string(\$plugs_assign_v_all,"$plugs_assign_v\n")    if(defined($plugs_assign_v));
                add_text_to_string(\$plugs_assign_v_all,"$plugs_assign_v\n")    if(defined($plugs_assign_v));
                add_text_to_string(\$sockets_assign_v_all,"$sockets_assign_v\n")if(defined($sockets_assign_v));
                add_text_to_string(\$sockets_assign_v_all,"$sockets_assign_v\n")if(defined($sockets_assign_v));
                add_text_to_string(\$io_full_v_all,"$io_full_v\n")                              if(defined($io_full_v));
                add_text_to_string(\$io_full_v_all,"$io_full_v\n")                              if(defined($io_full_v));
 
 
                #print  "$param_v $local_param_v $wire_def_v $inst_v $plugs_assign_v $sockets_assign_v $io_full_v";
                #print  "$param_v $local_param_v $wire_def_v $inst_v $plugs_assign_v $sockets_assign_v $io_full_v";
 
 
        }
        }
        my ($addr_map,$addr_localparam,$module_addr_localparam)= generate_address_cmp($soc,$wires);
        my ($addr_map,$addr_localparam,$module_addr_localparam)= generate_address_cmp($soc,$wires);
 
 
        #add functions
        #add functions
        my $dir = Cwd::getcwd();
        my $dir = Cwd::getcwd();
        open my $file1, "<", "$dir/lib/verilog/functions.v" or die;
        open my $file1, "<", "$dir/lib/verilog/functions.v" or die;
        my $functions_all='';
        my $functions_all='';
        while (my $f1 = readline ($file1)) {
        while (my $f1 = readline ($file1)) {
                 $functions_all="$functions_all $f1 ";
                 $functions_all="$functions_all $f1 ";
        }
        }
        close($file1);
        close($file1);
        my $unused_wiers_v=assign_unconnected_wires($wires,$intfc);
        my $unused_wiers_v=assign_unconnected_wires($wires,$intfc);
 
 
 
 
        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";
        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";
        add_text_to_string(\$soc_v,$functions_all);
        add_text_to_string(\$soc_v,$functions_all);
        add_text_to_string(\$soc_v,$local_param_v_all);
        add_text_to_string(\$soc_v,$local_param_v_all);
        add_text_to_string(\$soc_v,$addr_localparam);
        add_text_to_string(\$soc_v,$addr_localparam);
        add_text_to_string(\$soc_v,$module_addr_localparam);
        add_text_to_string(\$soc_v,$module_addr_localparam);
        add_text_to_string(\$soc_v,$io_full_v_all);
        add_text_to_string(\$soc_v,$io_full_v_all);
        add_text_to_string(\$soc_v,$wire_def_v_all);
        add_text_to_string(\$soc_v,$wire_def_v_all);
        add_text_to_string(\$soc_v,$unused_wiers_v);
        add_text_to_string(\$soc_v,$unused_wiers_v);
        add_text_to_string(\$soc_v,$inst_v_all);
        add_text_to_string(\$soc_v,$inst_v_all);
        add_text_to_string(\$soc_v,$plugs_assign_v_all);
        add_text_to_string(\$soc_v,$plugs_assign_v_all);
        add_text_to_string(\$soc_v,$sockets_assign_v_all);
        add_text_to_string(\$soc_v,$sockets_assign_v_all);
        add_text_to_string(\$soc_v,$addr_map);
        add_text_to_string(\$soc_v,$addr_map);
        add_text_to_string(\$soc_v,"endmodule\n\n");
        add_text_to_string(\$soc_v,"endmodule\n\n");
 
 
 
 
        $soc->soc_add_top($top_ip);
        $soc->soc_add_top($top_ip);
        #print @assigned_wires;
        #print @assigned_wires;
 
 
        #generate topmodule
        #generate topmodule
 
 
        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";
        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";
        my $ins= gen_soc_instance_v($soc,$soc_name,$param_pass_v);
        my $ins= gen_soc_instance_v($soc,$soc_name,$param_pass_v);
 
 
        add_text_to_string(\$top_v,$local_param_v_all."\n".$io_full_v_all);
        add_text_to_string(\$top_v,$local_param_v_all."\n".$io_full_v_all);
        add_text_to_string(\$top_v,$ins);
        add_text_to_string(\$top_v,$ins);
        my $readme=gen_system_info($soc,$param_as_in_v);
        my ($readme,$prog)=gen_system_info($soc,$param_as_in_v);
        return ("$soc_v",$top_v,$readme);
        return ("$soc_v",$top_v,$readme,$prog);
 
 
 
 
}
}
 
 
#################
#################
#       gen_module_inst
#       gen_module_inst
###############
###############
 
 
sub gen_module_inst {
sub gen_module_inst {
        my ($id,$soc,$io_sim_v,$param_as_in_v,$top_ip, $intfc,$wires,$param_pass_v)=@_;
        my ($id,$soc,$io_sim_v,$param_as_in_v,$top_ip, $intfc,$wires,$param_pass_v)=@_;
        my $module      =$soc->soc_get_module($id);
        my $module      =$soc->soc_get_module($id);
        my $module_name =$soc->soc_get_module_name($id);
        my $module_name =$soc->soc_get_module_name($id);
        my $category    =$soc->soc_get_category($id);
        my $category    =$soc->soc_get_category($id);
 
 
        my $inst        = $soc->soc_get_instance_name($id);
        my $inst        = $soc->soc_get_instance_name($id);
        my %params      = $soc->soc_get_module_param($id);
        my %params      = $soc->soc_get_module_param($id);
 
 
        my $ip = ip->lib_new ();
        my $ip = ip->lib_new ();
 
 
        my @ports=$ip->ip_list_ports($category,$module);
        my @ports=$ip->ip_list_ports($category,$module);
        my ($inst_v,$intfc_v,$plugs_assign_v,$sockets_assign_v,$io_full_v);
        my ($inst_v,$intfc_v,$plugs_assign_v,$sockets_assign_v,$io_full_v);
        my $wire_def_v="";
        my $wire_def_v="";
        $plugs_assign_v="\n";
        $plugs_assign_v="\n";
 
 
        my $counter=0;
        my $counter=0;
        my @param_order=$soc->soc_get_instance_param_order($id);
        my @param_order=$soc->soc_get_instance_param_order($id);
 
 
        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);
        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);
 
 
 
 
 
 
        $top_ip->top_add_def_to_instance($id,'module',$module);
        $top_ip->top_add_def_to_instance($id,'module',$module);
        $top_ip->top_add_def_to_instance($id,'module_name',$module_name);
        $top_ip->top_add_def_to_instance($id,'module_name',$module_name);
        $top_ip->top_add_def_to_instance($id,'category',$category);
        $top_ip->top_add_def_to_instance($id,'category',$category);
        $top_ip->top_add_def_to_instance($id,'instance',$inst);
        $top_ip->top_add_def_to_instance($id,'instance',$inst);
 
 
 
 
 
 
 
 
 
 
 
 
        #module name    
        #module name    
        $inst_v=( defined $instance_param_v )? "$module_name #(\n": $module_name ;
        $inst_v=( defined $instance_param_v )? "$module_name #(\n": $module_name ;
 
 
 
 
 
 
        #module parameters
        #module parameters
        $inst_v=( defined $instance_param_v)? "$inst_v $instance_param_v\n\t)": $inst_v;
        $inst_v=( defined $instance_param_v)? "$inst_v $instance_param_v\n\t)": $inst_v;
        #module instance name 
        #module instance name 
        $inst_v="$inst_v  $inst \t(\n";
        $inst_v="$inst_v  $inst \t(\n";
 
 
        #module ports
        #module ports
        $counter=0;
        $counter=0;
        foreach my $port (@ports){
        foreach my $port (@ports){
                my ($type,$range,$intfc_name,$i_port)=$ip->ip_get_port($category,$module,$port);
                my ($type,$range,$intfc_name,$i_port)=$ip->ip_get_port($category,$module,$port);
                my $assigned_port;
                my $assigned_port;
                my($i_type,$i_name,$i_num) =split("[:\[ \\]]", $intfc_name);
                my($i_type,$i_name,$i_num) =split("[:\[ \\]]", $intfc_name);
                my $IO='no';
                my $IO='no';
                my $NC='no';
                my $NC='no';
                if($i_type eq 'plug'){
                if($i_type eq 'plug'){
                        my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($id,$i_name,$i_num);
                        my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($id,$i_name,$i_num);
                        if($connect_id eq 'IO'){ $IO='yes';}
                        if($connect_id eq 'IO'){ $IO='yes';}
                        if($connect_id eq 'NC'){ $NC='yes';}
                        if($connect_id eq 'NC'){ $NC='yes';}
                }
                }
                if($i_type eq 'socket' && $i_name ne'wb_addr_map'){
                if($i_type eq 'socket' && $i_name ne'wb_addr_map'){
 
 
                        my ($ref1,$ref2)= $soc->soc_get_modules_plug_connected_to_socket($id,$i_name,$i_num);
                        my ($ref1,$ref2)= $soc->soc_get_modules_plug_connected_to_socket($id,$i_name,$i_num);
                        my %connected_plugs=%$ref1;
                        my %connected_plugs=%$ref1;
                        my %connected_plug_nums=%$ref2;
                        my %connected_plug_nums=%$ref2;
                        if(!%connected_plugs ){
                        if(!%connected_plugs ){
                                my  ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($id,$i_name);
                                my  ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($id,$i_name);
                                my $v=$soc->soc_get_module_param_value($id,$s_value);
                                my $v=$soc->soc_get_module_param_value($id,$s_value);
                                if ( length( $v || '' )){ $IO='no';} else {$IO='yes';}
                                if ( length( $v || '' )){ $IO='no';} else {$IO='yes';}
                        }
                        }
                }
                }
                if($NC eq 'yes'){
                if($NC eq 'yes'){
 
 
 
 
                }
                }
                elsif($IO eq 'yes' || !defined $i_type || !defined $i_name || !defined $i_num){ #its an IO port
                elsif($IO eq 'yes' || !defined $i_type || !defined $i_name || !defined $i_num){ #its an IO port
                        if($i_port eq 'NC'){
                        if($i_port eq 'NC'){
                                $NC='yes';
                                $NC='yes';
                        }else {
                        }else {
                                 $assigned_port="$inst\_$port";
                                 $assigned_port="$inst\_$port";
                                 $$io_sim_v= (!defined $$io_sim_v)? "\t$assigned_port" : "$$io_sim_v, \n\t$assigned_port";
                                 $$io_sim_v= (!defined $$io_sim_v)? "\t$assigned_port" : "$$io_sim_v, \n\t$assigned_port";
                                 my $new_range = add_instantc_name_to_parameters(\%params,$inst,$range);
                                 my $new_range = add_instantc_name_to_parameters(\%params,$inst,$range);
                                 my $port_def=(length ($range)>1 )?     "\t$type\t [ $new_range    ] $assigned_port;\n": "\t$type\t\t\t$assigned_port;\n";
                                 my $port_def=(length ($range)>1 )?     "\t$type\t [ $new_range    ] $assigned_port;\n": "\t$type\t\t\t$assigned_port;\n";
                                 add_text_to_string(\$io_full_v,$port_def);
                                 add_text_to_string(\$io_full_v,$port_def);
                                # $top_ip->ipgen_add_port($assigned_port, $new_range, $type ,$intfc_name,$i_port);
                                # $top_ip->ipgen_add_port($assigned_port, $new_range, $type ,$intfc_name,$i_port);
                                $top_ip->top_add_port($id,$assigned_port, $new_range, $type ,$intfc_name,$i_port);
                                $top_ip->top_add_port($id,$assigned_port, $new_range, $type ,$intfc_name,$i_port);
                        }
                        }
 
 
 
 
                }
                }
                else{ # port connected internally using interface 
                else{ # port connected internally using interface 
                         $assigned_port="$inst\_$i_type\_$i_name\_$i_num\_$i_port";
                         $assigned_port="$inst\_$i_type\_$i_name\_$i_num\_$i_port";
 
 
                         #create plug wires
                         #create plug wires
                         my ($wire_string,$port_name)=generate_wire ($range,$assigned_port,$inst,\%params,$i_type,$i_name,$i_num,$i_port, $wires);
                         my ($wire_string,$port_name)=generate_wire ($range,$assigned_port,$inst,\%params,$i_type,$i_name,$i_num,$i_port, $wires);
                         #add wire def if it is not defined before
                         #add wire def if it is not defined before
 
 
                         add_text_to_string(\$wire_def_v,$wire_string)  if ($wire_def_v !~ /[\s\]]$port_name;/);
                         add_text_to_string(\$wire_def_v,$wire_string)  if ($wire_def_v !~ /[\s\]]$port_name;/);
 
 
 
 
 
 
                        if($i_type eq 'plug'){
                        if($i_type eq 'plug'){
                                #read socket port name
                                #read socket port name
                                my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($id,$i_name,$i_num);
                                my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($id,$i_name,$i_num);
                                my ($i_range,$t,$i_connect)=$intfc->get_port_info_of_plug($i_name,$i_port);
                                my ($i_range,$t,$i_connect)=$intfc->get_port_info_of_plug($i_name,$i_port);
                                #my $connect_port= "socket_$i_name\_$i_num\_$i_connect";
                                #my $connect_port= "socket_$i_name\_$i_num\_$i_connect";
                                if(defined $connect_socket_num){
                                if(defined $connect_socket_num){
                                        my $connect_n=$soc->soc_get_instance_name($connect_id);
                                        my $connect_n=$soc->soc_get_instance_name($connect_id);
                                        my $connect_port= "$connect_n\_socket_$i_name\_$connect_socket_num\_$i_connect";
                                        my $connect_port= "$connect_n\_socket_$i_name\_$connect_socket_num\_$i_connect";
                                        #connect plug port to socket port
                                        #connect plug port to socket port
                                        my $new_range = add_instantc_name_to_parameters(\%params,$inst,$range);
                                        my $new_range = add_instantc_name_to_parameters(\%params,$inst,$range);
                                        my $connect_port_range=(length($new_range)>1)?"$connect_port\[$new_range\]":$connect_port;
                                        my $connect_port_range=(length($new_range)>1)?"$connect_port\[$new_range\]":$connect_port;
 
 
                                        if($type eq 'input' ){
                                        if($type eq 'input' ){
                                                $plugs_assign_v= "$plugs_assign_v \tassign  $assigned_port = $connect_port_range;\n";
                                                $plugs_assign_v= "$plugs_assign_v \tassign  $assigned_port = $connect_port_range;\n";
                                                $wires->wire_add($assigned_port,"connected",1);
                                                $wires->wire_add($assigned_port,"connected",1);
 
 
                                        }else{
                                        }else{
                                                $plugs_assign_v= "$plugs_assign_v \tassign  $connect_port  = $assigned_port;\n";
                                                $plugs_assign_v= "$plugs_assign_v \tassign  $connect_port  = $assigned_port;\n";
                                                $wires->wire_add($connect_port,"connected",1);
                                                $wires->wire_add($connect_port,"connected",1);
                                        }
                                        }
 
 
 
 
                                }
                                }
                        }#plug
                        }#plug
                        else{ #socket
                        else{ #socket
                                my  ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($id,$i_name);
                                my  ($s_type,$s_value,$s_connection_num)=$soc->soc_get_socket_of_instance($id,$i_name);
                                my $v=$soc->soc_get_module_param_value($id,$s_value);
                                my $v=$soc->soc_get_module_param_value($id,$s_value);
                                my ($i_range,$t,$i_connect)=$intfc->get_port_info_of_socket($i_name,$i_port);
                                my ($i_range,$t,$i_connect)=$intfc->get_port_info_of_socket($i_name,$i_port);
                                if ( length( $v || '' )) {
                                if ( length( $v || '' )) {
                                                $v--;
                                                $v--;
                                                my $name= $soc->soc_get_instance_name($id);
                                                my $name= $soc->soc_get_instance_name($id);
                                                my $joint= "$name\_$i_type\_$i_name\_$v\_$i_port";
                                                my $joint= "$name\_$i_type\_$i_name\_$v\_$i_port";
 
 
                                                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);
                                                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);
                                                add_text_to_string(\$wire_def_v,$wire_string) if ($wire_def_v !~ /[\s\]]$port_name;/);
                                                add_text_to_string(\$wire_def_v,$wire_string) if ($wire_def_v !~ /[\s\]]$port_name;/);
 
 
                                                for(my $i=$v-1; $i>=0; $i--) {
                                                for(my $i=$v-1; $i>=0; $i--) {
                                                        $joint= "$joint ,$name\_$i_type\_$i_name\_$i\_$i_port";
                                                        $joint= "$joint ,$name\_$i_type\_$i_name\_$i\_$i_port";
                                                        #create socket wires
                                                        #create socket wires
                                                         #create plug wires
                                                         #create plug wires
                                                        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);
                                                        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);
                                                        add_text_to_string(\$wire_def_v,$wire_string) if ($wire_def_v !~ /[\s\]]$port_name;/);
                                                        add_text_to_string(\$wire_def_v,$wire_string) if ($wire_def_v !~ /[\s\]]$port_name;/);
 
 
 
 
 
 
 
 
 
 
 
 
                                                }
                                                }
                                                $wires->wire_add($assigned_port,"connected",1)  if($type eq 'input');
                                                $wires->wire_add($assigned_port,"connected",1)  if($type eq 'input');
                                                if($type ne 'input' ){
                                                if($type ne 'input' ){
                                                        my @w=split('\s*,\s*',$joint);
                                                        my @w=split('\s*,\s*',$joint);
                                                        foreach my $q (@w) {
                                                        foreach my $q (@w) {
                                                                $wires->wire_add($q,"connected",1);
                                                                $wires->wire_add($q,"connected",1);
                                                        }
                                                        }
 
 
                                                }
                                                }
                                                $joint=($v>0)? "\{ $joint\ }" : "$joint";
                                                $joint=($v>0)? "\{ $joint\ }" : "$joint";
                                                my $text=($type eq 'input' )? "\tassign $assigned_port = $joint;\n": "\tassign $joint = $assigned_port;\n";
                                                my $text=($type eq 'input' )? "\tassign $assigned_port = $joint;\n": "\tassign $joint = $assigned_port;\n";
 
 
                                                add_text_to_string(\$sockets_assign_v,$text);
                                                add_text_to_string(\$sockets_assign_v,$text);
                                }
                                }
 
 
 
 
 
 
                        }#socket        
                        }#socket        
 
 
 
 
                }
                }
 
 
 
 
 
 
                if (++$counter == scalar(@ports)){#last port def
                if (++$counter == scalar(@ports)){#last port def
 
 
                        $inst_v=($NC eq 'yes')? "$inst_v\t\t.$port()\n": "$inst_v\t\t.$port($assigned_port)\n";
                        $inst_v=($NC eq 'yes')? "$inst_v\t\t.$port()\n": "$inst_v\t\t.$port($assigned_port)\n";
 
 
                }
                }
                else {
                else {
                        $inst_v=($NC eq 'yes')? "$inst_v\t\t.$port(),\n":"$inst_v\t\t.$port($assigned_port),\n";
                        $inst_v=($NC eq 'yes')? "$inst_v\t\t.$port(),\n":"$inst_v\t\t.$port($assigned_port),\n";
                }
                }
 
 
                if($type ne 'input' && $NC ne 'yes' ){
                if($type ne 'input' && $NC ne 'yes' ){
                        $wires->wire_add($assigned_port,"connected",1);
                        $wires->wire_add($assigned_port,"connected",1);
 
 
                }
                }
 
 
 
 
 
 
        }
        }
        $inst_v="$inst_v\t);\n";
        $inst_v="$inst_v\t);\n";
 
 
 
 
 
 
 
 
        return ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v,$param_pass_v);
        return ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v,$param_pass_v);
 
 
 
 
}
}
 
 
 
 
sub add_instantc_name_to_parameters{
sub add_instantc_name_to_parameters{
        my ($params_ref,$inst,$range)=@_;
        my ($params_ref,$inst,$range)=@_;
        my $new_range=$range;
        my $new_range=$range;
        #print "$new_range\n";
        #print "$new_range\n";
 
 
        my @list=sort keys%{$params_ref};
        my @list=sort keys%{$params_ref};
        foreach my $param (@list){
        foreach my $param (@list){
                my $new_param= "$inst\_$param";
                my $new_param= "$inst\_$param";
                ($new_range=$new_range)=~ s/\b$param\b/$new_param/g;
                ($new_range=$new_range)=~ s/\b$param\b/$new_param/g;
                #print "$new_range= s/\b$param\b/$new_param/g\n";
                #print "$new_range= s/\b$param\b/$new_param/g\n";
        }
        }
                return $new_range;
                return $new_range;
}
}
 
 
 
 
sub gen_parameter_v{
sub gen_parameter_v{
        my ($param_ref,$id,$inst,$category,$module,$ip,$param_as_in_v,$ref_ordered,$top_ip,$param_pass_v)=@_;
        my ($param_ref,$id,$inst,$category,$module,$ip,$param_as_in_v,$ref_ordered,$top_ip,$param_pass_v)=@_;
        my %params=%$param_ref;
        my %params=%$param_ref;
        my @param_order;
        my @param_order;
        @param_order=@{$ref_ordered} if(defined $ref_ordered);
        @param_order=@{$ref_ordered} if(defined $ref_ordered);
 
 
        my ($param_v,$local_param_v,$instance_param_v);
        my ($param_v,$local_param_v,$instance_param_v);
        my @list;
        my @list;
        @list= (@param_order)? @param_order :
        @list= (@param_order)? @param_order :
sort keys%params;
sort keys%params;
        my $first_param=1;
        my $first_param=1;
 
 
        $local_param_v="";
        $local_param_v="";
        $param_v="";
        $param_v="";
 
 
        #add instance name to parameter value
        #add instance name to parameter value
        foreach my $param (@list){
        foreach my $param (@list){
                $params{$param}=add_instantc_name_to_parameters(\%params,$inst,$params{$param});
                $params{$param}=add_instantc_name_to_parameters(\%params,$inst,$params{$param});
 
 
        }
        }
 
 
 
 
        #print parameters
        #print parameters
        foreach my $param (@list){
        foreach my $param (@list){
                my $inst_param= "$inst\_$param";
                my $inst_param= "$inst\_$param";
                my ($deafult,$type,$content,$info,$vfile_param_type,$redefine_param)= $ip->ip_get_parameter($category,$module,$param);
                my ($deafult,$type,$content,$info,$vfile_param_type,$redefine_param)= $ip->ip_get_parameter($category,$module,$param);
                $vfile_param_type= "Don't include" if (!defined $vfile_param_type );
                $vfile_param_type= "Don't include" if (!defined $vfile_param_type );
                $vfile_param_type= "Parameter"  if ($vfile_param_type eq 1);
                $vfile_param_type= "Parameter"  if ($vfile_param_type eq 1);
                $vfile_param_type= "Localparam" if ($vfile_param_type eq 0);
                $vfile_param_type= "Localparam" if ($vfile_param_type eq 0);
                $redefine_param=1 if (! defined $redefine_param);
                $redefine_param=1 if (! defined $redefine_param);
                $redefine_param=0 if ($vfile_param_type eq "Don't include");
                $redefine_param=0 if ($vfile_param_type eq "Don't include");
                if($redefine_param eq 1){
                if($redefine_param eq 1){
                        $instance_param_v=($first_param eq 1)? "\t\t.$param($inst_param)" : "$instance_param_v,\n\t\t.$param($inst_param)";
                        $instance_param_v=($first_param eq 1)? "\t\t.$param($inst_param)" : "$instance_param_v,\n\t\t.$param($inst_param)";
                        $first_param=0;
                        $first_param=0;
 
 
                }
                }
 
 
 
 
 
 
                if($vfile_param_type eq "Localparam"){
                if($vfile_param_type eq "Localparam"){
                        $local_param_v="$local_param_v\tlocalparam\t$inst_param=$params{$param};\n";
                        $local_param_v="$local_param_v\tlocalparam\t$inst_param=$params{$param};\n";
                }
                }
                elsif($vfile_param_type eq "Parameter"){
                elsif($vfile_param_type eq "Parameter"){
                        $param_v="$param_v\tparameter\t$inst_param=$params{$param};\n";
                        $param_v="$param_v\tparameter\t$inst_param=$params{$param};\n";
                        $$param_pass_v =(defined ($$param_pass_v ))? "$$param_pass_v,\n\t.$inst_param($inst_param)": "\t.$inst_param($inst_param)";
                        $$param_pass_v =(defined ($$param_pass_v ))? "$$param_pass_v,\n\t.$inst_param($inst_param)": "\t.$inst_param($inst_param)";
                        $$param_as_in_v=(defined ($$param_as_in_v))? "$$param_as_in_v ,\n\tparameter\t$inst_param=$params{$param}":
                        $$param_as_in_v=(defined ($$param_as_in_v))? "$$param_as_in_v ,\n\tparameter\t$inst_param=$params{$param}":
                                                                                                                 "   \tparameter\t$inst_param=$params{$param}";
                                                                                                                 "   \tparameter\t$inst_param=$params{$param}";
                        #add parameter to top 
                        #add parameter to top 
                        #$top_ip  $inst_param                   
                        #$top_ip  $inst_param                   
                        $top_ip->top_add_parameter($id,$inst_param,$params{$param},$type,$content,$info,$vfile_param_type,$redefine_param);
                        $top_ip->top_add_parameter($id,$inst_param,$params{$param},$type,$content,$info,$vfile_param_type,$redefine_param);
 
 
                }
                }
 
 
 
 
 
 
        }
        }
 
 
        return ($param_v,$local_param_v,$instance_param_v);
        return ($param_v,$local_param_v,$instance_param_v);
 
 
 
 
}
}
 
 
###############
###############
#       generate_address_cmp
#       generate_address_cmp
##############
##############
 
 
sub generate_address_cmp{
sub generate_address_cmp{
        my ($soc,$wires)=@_;
        my ($soc,$wires)=@_;
        my $number=0;
        my $number=0;
        my $addr_mp_v="\n//Wishbone slave address match\n";
        my $addr_mp_v="\n//Wishbone slave address match\n";
        my $instance_addr_localparam="\n//Wishbone slave base address based on instance name\n";
        my $instance_addr_localparam="\n//Wishbone slave base address based on instance name\n";
        my $module_addr_localparam="\n//Wishbone slave base address based on module name. \n";
        my $module_addr_localparam="\n//Wishbone slave base address based on module name. \n";
 
 
        my @all_instances=$soc->soc_get_all_instances();
        my @all_instances=$soc->soc_get_all_instances();
        foreach my $instance_id (@all_instances){
        foreach my $instance_id (@all_instances){
                my $instance_name=$soc->soc_get_instance_name($instance_id);
                my $instance_name=$soc->soc_get_instance_name($instance_id);
                        my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
                        my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
                        foreach my $plug (@plugs){
                        foreach my $plug (@plugs){
                                my @nums=$soc->soc_list_plug_nums($instance_id,$plug);
                                my @nums=$soc->soc_list_plug_nums($instance_id,$plug);
                                foreach my $num (@nums){
                                foreach my $num (@nums){
                                        my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($instance_id,$plug,$num);
                                        my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($instance_id,$plug,$num);
                                        if((defined $connect_socket) && ($connect_socket eq 'wb_slave')){
                                        if((defined $connect_socket) && ($connect_socket eq 'wb_slave')){
                                                #read wishbone bus address and data width size                                          
                                                #read wishbone bus address and data width size                                          
                                                my $Aw=$soc->soc_get_module_param_value ($connect_id,'Aw');
                                                my $Aw=$soc->soc_get_module_param_value ($connect_id,'Aw');
                                                my $Dw=$soc->soc_get_module_param_value ($connect_id,'Dw');
                                                my $Dw=$soc->soc_get_module_param_value ($connect_id,'Dw');
                                                $Aw=32 if (!defined $Aw);
                                                $Aw=32 if (!defined $Aw);
                                                $Dw=32 if (!defined $Dw);
                                                $Dw=32 if (!defined $Dw);
                                                add_text_to_string(\$addr_mp_v,"/* $instance_name wb_slave $num */\n");
                                                add_text_to_string(\$addr_mp_v,"/* $instance_name wb_slave $num */\n");
                                                #count how many nibbles we have in address size 
                                                #count how many nibbles we have in address size 
                                                my $hh= ($Aw % 4)? ($Aw >> 2)+1 : ($Aw >> 2);
                                                my $hh= ($Aw % 4)? ($Aw >> 2)+1 : ($Aw >> 2);
                                                $hh= "'h%0${hh}x";#hex address nibble num
                                                $hh= "'h%0${hh}x";#hex address nibble num
                                                #change addresses to word as the assign addresses by ProNoC GUI are in bytes  
                                                #change addresses to word as the assign addresses by ProNoC GUI are in bytes  
                                                my $bytenum=($Dw/8);
                                                my $bytenum=($Dw/8);
                                                my $base_hex=$Aw.sprintf($hh, ($base/$bytenum));
                                                my $base_hex=$Aw.sprintf($hh, ($base/$bytenum));
                                                my $end_hex=$Aw.sprintf($hh, ($end/$bytenum));
                                                my $end_hex=$Aw.sprintf($hh, ($end/$bytenum));
                                                #my $base_hex=sprintf("32'h%08x", ($base>>2));
                                                #my $base_hex=sprintf("32'h%08x", ($base>>2));
                                                #my $end_hex=sprintf("32'h%08x", ($end>>2));
                                                #my $end_hex=sprintf("32'h%08x", ($end>>2));
                                                add_text_to_string(\$instance_addr_localparam,"\tlocalparam \t$instance_name\_WB$num\_BASE_ADDR\t=\t$base_hex;\n");
                                                add_text_to_string(\$instance_addr_localparam,"\tlocalparam \t$instance_name\_WB$num\_BASE_ADDR\t=\t$base_hex;\n");
                                                add_text_to_string(\$instance_addr_localparam,"\tlocalparam \t$instance_name\_WB$num\_END_ADDR\t=\t$end_hex;\n");
                                                add_text_to_string(\$instance_addr_localparam,"\tlocalparam \t$instance_name\_WB$num\_END_ADDR\t=\t$end_hex;\n");
                                                if($instance_name ne $instance_id){
                                                if($instance_name ne $instance_id){
                                                        add_text_to_string(\$module_addr_localparam,"\tlocalparam \t$instance_id\_WB$num\_BASE_ADDR\t=\t$base_hex;\n");
                                                        add_text_to_string(\$module_addr_localparam,"\tlocalparam \t$instance_id\_WB$num\_BASE_ADDR\t=\t$base_hex;\n");
                                                        add_text_to_string(\$module_addr_localparam,"\tlocalparam \t$instance_id\_WB$num\_END_ADDR\t=\t$end_hex;\n");
                                                        add_text_to_string(\$module_addr_localparam,"\tlocalparam \t$instance_id\_WB$num\_END_ADDR\t=\t$end_hex;\n");
                                                }
                                                }
 
 
                                                my $connect_name=$soc->soc_get_instance_name($connect_id);
                                                my $connect_name=$soc->soc_get_instance_name($connect_id);
                                                $wires->wire_add("$connect_name\_socket_wb_addr_map_0_sel_one_hot","connected",1);
                                                $wires->wire_add("$connect_name\_socket_wb_addr_map_0_sel_one_hot","connected",1);
                                                $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";
                                                $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";
 
 
                                                $number++;
                                                $number++;
                                        }#if
                                        }#if
                                }#foreach my $num
                                }#foreach my $num
                        }#foreach my $plug
                        }#foreach my $plug
                }#foreach my $instance_id
                }#foreach my $instance_id
 
 
                add_text_to_string(\$instance_addr_localparam,"\n");
                add_text_to_string(\$instance_addr_localparam,"\n");
                add_text_to_string(\$module_addr_localparam,"\n");
                add_text_to_string(\$module_addr_localparam,"\n");
                return ($addr_mp_v,$instance_addr_localparam,$module_addr_localparam);
                return ($addr_mp_v,$instance_addr_localparam,$module_addr_localparam);
}
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
sub add_text_to_string{
sub add_text_to_string{
                my ($string,$text)=@_;
                my ($string,$text)=@_;
                if(defined $text){
                if(defined $text){
                        $$string=(defined ($$string))? "$$string $text" : $text;
                        $$string=(defined ($$string))? "$$string $text" : $text;
                }
                }
}
}
 
 
 
 
 
 
sub generate_wire {
sub generate_wire {
        my($range,$port_name,$inst_name,$params_ref,$i_type,$i_name,$i_num,$i_port, $wires)=@_;
        my($range,$port_name,$inst_name,$params_ref,$i_type,$i_name,$i_num,$i_port, $wires)=@_;
        my $wire_string;
        my $wire_string;
        my $new_range;
        my $new_range;
        if(length ($range)>1 ){
        if(length ($range)>1 ){
                #replace parameter in range
                #replace parameter in range
                $new_range = add_instantc_name_to_parameters($params_ref,$inst_name,$range);
                $new_range = add_instantc_name_to_parameters($params_ref,$inst_name,$range);
                $wire_string= "\twire\t[ $new_range ] $port_name;\n";
                $wire_string= "\twire\t[ $new_range ] $port_name;\n";
        }
        }
        else{
        else{
                $wire_string="\twire\t\t\t $port_name;\n";
                $wire_string="\twire\t\t\t $port_name;\n";
        }
        }
        $wires->wire_add("$port_name","range",$new_range);
        $wires->wire_add("$port_name","range",$new_range);
        $wires->wire_add("$port_name","inst_name",$inst_name);
        $wires->wire_add("$port_name","inst_name",$inst_name);
        $wires->wire_add("$port_name","i_type",$i_type);
        $wires->wire_add("$port_name","i_type",$i_type);
        $wires->wire_add("$port_name","i_name",$i_name);
        $wires->wire_add("$port_name","i_name",$i_name);
        $wires->wire_add("$port_name","i_num",$i_num);
        $wires->wire_add("$port_name","i_num",$i_num);
        $wires->wire_add("$port_name","i_port",$i_port);
        $wires->wire_add("$port_name","i_port",$i_port);
 
 
        return ($wire_string,$port_name);
        return ($wire_string,$port_name);
}
}
 
 
sub port_width_repeat{
sub port_width_repeat{
        my ($range,$value)=@_;
        my ($range,$value)=@_;
        return "$value" if (!defined $range);
        return "$value" if (!defined $range);
        $range= remove_all_white_spaces($range);
        $range= remove_all_white_spaces($range);
        my ($h,$l)=split(':',$range);
        my ($h,$l)=split(':',$range);
        return "$value" if(!defined $h ) ; # port width is 1
        return "$value" if(!defined $h ) ; # port width is 1
        return "$value" if($h eq "0" && "$l" eq "0"); # port width is 1
        return "$value" if($h eq "0" && "$l" eq "0"); # port width is 1
        $h=$l if($h eq "0" && "$l" ne "0");
        $h=$l if($h eq "0" && "$l" ne "0");
        if($h =~ /-1$/){ # the address ranged is endup with -1 
        if($h =~ /-1$/){ # the address ranged is endup with -1 
                $h =~ s/-1$//; # remove -1
                $h =~ s/-1$//; # remove -1
                return "\{$h\{$value\}\}"  if($h =~ /\)$/);
                return "\{$h\{$value\}\}"  if($h =~ /\)$/);
                return "\{($h)\{$value\}\}" if($h =~ /[\*\.\+\-\^\%\&]/);
                return "\{($h)\{$value\}\}" if($h =~ /[\*\.\+\-\^\%\&]/);
                return "\{$h\{$value\}\}";
                return "\{$h\{$value\}\}";
        }
        }
        return "\{($h+1){$value}}";
        return "\{($h+1){$value}}";
}
}
 
 
sub assign_unconnected_wires{
sub assign_unconnected_wires{
        my($wires,$intfc)=@_;
        my($wires,$intfc)=@_;
        my $unused_wire_v=undef;
        my $unused_wire_v=undef;
 
 
        my @all_wires=$wires->wires_list();
        my @all_wires=$wires->wires_list();
        foreach my $p (@all_wires ){
        foreach my $p (@all_wires ){
                if(!defined $wires->wire_get($p,"connected")){ # unconnected wires
                if(!defined $wires->wire_get($p,"connected")){ # unconnected wires
                        # Take default value from interface definition 
                        # Take default value from interface definition 
                        #$wires->wire_get("$p","inst_name");
                        #$wires->wire_get("$p","inst_name");
                        my $i_type=$wires->wire_get($p,"i_type");
                        my $i_type=$wires->wire_get($p,"i_type");
                        my $i_name= $wires->wire_get($p,"i_name");
                        my $i_name= $wires->wire_get($p,"i_name");
                        my $i_num=$wires->wire_get($p,"i_num");
                        my $i_num=$wires->wire_get($p,"i_num");
                        my $i_port=$wires->wire_get($p,"i_port");
                        my $i_port=$wires->wire_get($p,"i_port");
                        my $new_range=$wires->wire_get($p,"range");
                        my $new_range=$wires->wire_get($p,"range");
                        my ($range,$type,$connect,$default_out) = ($i_type eq "socket" )? $intfc->get_port_info_of_socket($i_name,$i_port):
                        my ($range,$type,$connect,$default_out) = ($i_type eq "socket" )? $intfc->get_port_info_of_socket($i_name,$i_port):
                                                                                                                                                          $intfc->get_port_info_of_plug($i_name,$i_port);
                                                                                                                                                          $intfc->get_port_info_of_plug($i_name,$i_port);
                        #""Active high","Don't care"
                        #""Active high","Don't care"
 
 
                        my $default=(!defined $default_out                )? port_width_repeat($new_range,"1\'bx"):
                        my $default=(!defined $default_out                )? port_width_repeat($new_range,"1\'bx"):
                                                ($default_out eq 'Active low' )? port_width_repeat($new_range,"1\'b0"):
                                                ($default_out eq 'Active low' )? port_width_repeat($new_range,"1\'b0"):
                                            ($default_out eq 'Active high')? port_width_repeat($new_range,"1\'b1"):
                                            ($default_out eq 'Active high')? port_width_repeat($new_range,"1\'b1"):
                                                ($default_out eq 'Don\'t care')? port_width_repeat($new_range,"1\'bx"): $default_out;
                                                ($default_out eq 'Don\'t care')? port_width_repeat($new_range,"1\'bx"): $default_out;
 
 
 
 
                        $unused_wire_v= (defined $unused_wire_v)? "$unused_wire_v \tassign ${p} = $default;\n" : "\tassign ${p} = $default;\n";
                        $unused_wire_v= (defined $unused_wire_v)? "$unused_wire_v \tassign ${p} = $default;\n" : "\tassign ${p} = $default;\n";
 
 
                }
                }
 
 
        }
        }
        $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);
        $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);
        return $unused_wire_v;
        return $unused_wire_v;
 
 
 
 
}
}
 
 
 
 
 
 
 
 
sub gen_soc_instance_v{
sub gen_soc_instance_v{
        my ($soc,$soc_name,$param_pass_v)=@_;
        my ($soc,$soc_name,$param_pass_v)=@_;
        my $soc_v;
        my $soc_v;
        my $processor_en=0;
        my $processor_en=0;
 
 
        add_text_to_string(\$soc_v,"
        add_text_to_string(\$soc_v,"
 
 
// Allow software to remote reset/enable the cpu via jtag
// Allow software to remote reset/enable the cpu via jtag
 
 
        wire jtag_cpu_en, jtag_system_reset;
        wire jtag_cpu_en, jtag_system_reset;
 
 
        jtag_system_en jtag_en (
        jtag_system_en jtag_en (
                .cpu_en(jtag_cpu_en),
                .cpu_en(jtag_cpu_en),
                .system_reset(jtag_system_reset)
                .system_reset(jtag_system_reset)
 
 
        );
        );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
");
");
 
 
 
 
        my $mm="$soc_name #(\n $param_pass_v \n\t)the_${soc_name}(\n";
        my $mm="$soc_name #(\n $param_pass_v \n\t)the_${soc_name}(\n";
 
 
        my $top=$soc->soc_get_top();
        my $top=$soc->soc_get_top();
        my @intfcs=$top->top_get_intfc_list();
        my @intfcs=$top->top_get_intfc_list();
 
 
        my $i=0;
        my $i=0;
 
 
 
 
 
 
 
 
        my $ss="";
        my $ss="";
        my $ww="";
        my $ww="";
 
 
foreach my $intfc (@intfcs){
foreach my $intfc (@intfcs){
 
 
 
 
 
 
                #reset
                #reset
                if( $intfc eq 'plug:reset[0]'){
                if( $intfc eq 'plug:reset[0]'){
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        foreach my $p (@ports){
                        foreach my $p (@ports){
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                $mm="$mm," if ($i);
                                $mm="$mm," if ($i);
                                $mm="$mm\n\t\t.$p(${p}_ored_jtag)";
                                $mm="$mm\n\t\t.$p(${p}_ored_jtag)";
                                $ss="$ss\tassign ${p}_ored_jtag = (jtag_system_reset | $p);\n";
                                $ss="$ss\tassign ${p}_ored_jtag = (jtag_system_reset | $p);\n";
                                $ww="$ww\twire ${p}_ored_jtag;\n";
                                $ww="$ww\twire ${p}_ored_jtag;\n";
                                $i=1;
                                $i=1;
 
 
                        }
                        }
 
 
 
 
 
 
                }
                }
                #enable
                #enable
                elsif( $intfc eq 'plug:enable[0]'){
                elsif( $intfc eq 'plug:enable[0]'){
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        foreach my $p (@ports){
                        foreach my $p (@ports){
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                                $mm="$mm," if ($i);
                                $mm="$mm," if ($i);
                                $mm="$mm\n\t\t.$p(${p}_anded_jtag)";
                                $mm="$mm\n\t\t.$p(${p}_anded_jtag)";
                                $ss="$ss\tassign ${p}_anded_jtag= (jtag_cpu_en & $p);\n";
                                $ss="$ss\tassign ${p}_anded_jtag= (jtag_cpu_en & $p);\n";
                                $ww="$ww\twire ${p}_anded_jtag;\n";
                                $ww="$ww\twire ${p}_anded_jtag;\n";
                                $processor_en=1;
                                $processor_en=1;
                                $i=1;
                                $i=1;
 
 
                        }
                        }
 
 
 
 
                }
                }
                else {
                else {
                #other interface
                #other interface
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        my @ports=$top->top_get_intfc_ports_list($intfc);
                        foreach my $p (@ports){
                        foreach my $p (@ports){
                        my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                        my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
                        $mm="$mm," if ($i);
                        $mm="$mm," if ($i);
                        $mm="$mm\n\t\t.$p($p)";
                        $mm="$mm\n\t\t.$p($p)";
                        $i=1;
                        $i=1;
 
 
                        }
                        }
 
 
 
 
                }
                }
 
 
 
 
        }
        }
        $mm="$mm\n\t);";
        $mm="$mm\n\t);";
        add_text_to_string(\$soc_v,"$ww\n");
        add_text_to_string(\$soc_v,"$ww\n");
        add_text_to_string(\$soc_v,"$mm\n");
        add_text_to_string(\$soc_v,"$mm\n");
        add_text_to_string(\$soc_v,"$ss\n");
        add_text_to_string(\$soc_v,"$ss\n");
        add_text_to_string(\$soc_v,"\n endmodule\n");
        add_text_to_string(\$soc_v,"\n endmodule\n");
 
 
 
 
 
 
 
 
 
 
 
 
 
 
        return $soc_v;
        return $soc_v;
 
 
}
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
sub gen_system_info {
sub gen_system_info {
        my ($soc,$param)=@_;
        my ($soc,$param)=@_;
        my ($wb_slaves,$wb_masters,$other,$jtag);
        my ($wb_slaves,$wb_masters,$other,$jtag);
        #my (@newbase,@newend,@connects);
        #my (@newbase,@newend,@connects);
 
 
 
 
 
   $jtag='';
 
 
        my @all_instances=$soc->soc_get_all_instances();
        my @all_instances=$soc->soc_get_all_instances();
 
 
 
my %jtagwb; my %ram;
 
 
 
 
        foreach my $instance_id (@all_instances){
        foreach my $instance_id (@all_instances){
 
                my $category=$soc->soc_get_category($instance_id);
 
 
                my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
                my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
                foreach my $plug (@plugs){
                foreach my $plug (@plugs){
                        my @nums=$soc->soc_list_plug_nums($instance_id,$plug);
                        my @nums=$soc->soc_list_plug_nums($instance_id,$plug);
                        foreach my $num (@nums){
                        foreach my $num (@nums){
                                my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($instance_id,$plug,$num);
                                my ($addr,$base,$end,$name,$connect_id,$connect_socket,$connect_socket_num)=$soc->soc_get_plug($instance_id,$plug,$num);
 
 
                                my $instance_name=$soc->soc_get_instance_name($instance_id);
                                my $instance_name=$soc->soc_get_instance_name($instance_id);
                                my $connect_name=$soc->soc_get_instance_name($connect_id);
                                my $connect_name=$soc->soc_get_instance_name($connect_id);
                                #get interfaces
                                #get interfaces
                                if((defined $connect_socket) && ($connect_socket eq 'wb_slave')){
                                if((defined $connect_socket) && ($connect_socket eq 'wb_slave')){
 
 
                                        $base=sprintf("0x%08x", $base);
                                        $base=sprintf("0x%08x", $base);
                                        $end=sprintf("0x%08x", $end);
                                        $end=sprintf("0x%08x", $end);
                                        add_text_to_string(\$wb_slaves, "\t$instance_name, $name, $connect_name, $base, $end\n");
                                        add_text_to_string(\$wb_slaves, "\t$instance_name, $name, $connect_name, $base, $end\n");
 
                                        if ($category eq 'RAM') {
 
                                                $ram{$instance_id}{'base'}=$base;
 
                                                $ram{$instance_id}{'end'}=$end;
 
                                                $ram{$instance_id}{'connect'}=$connect_id;
 
                                        }
 
 
                                }#if
                                }#if
                                elsif((defined $connect_socket) && ($connect_socket eq 'wb_master')){
                                elsif((defined $connect_socket) && ($connect_socket eq 'wb_master')){
                                        add_text_to_string(\$wb_masters,"\t$instance_name, $name, $connect_name\n");
                                        add_text_to_string(\$wb_masters,"\t$instance_name, $name, $connect_name\n");
                                }
                                }
                                elsif(defined $connect_socket) {
                                elsif(defined $connect_socket) {
                                        add_text_to_string(\$other,"\t$instance_name, $name, $connect_name\n");
                                        add_text_to_string(\$other,"\t$instance_name, $name, $connect_name\n");
 
 
                                }
                                }
                                # get jtag_wbs
                                # get jtag_wbs
                                if((defined $connect_socket) && ($connect_socket eq 'wb_master') && ($instance_id =~ /jtag_wb/)){
                                if((defined $connect_socket) && ($connect_socket eq 'wb_master') && ($instance_id =~ /jtag_wb/)){
                                        my $index=$soc->soc_get_module_param_value($instance_id,'VJTAG_INDEX');
                                        my $index=$soc->soc_get_module_param_value($instance_id,'VJTAG_INDEX');
                                        add_text_to_string(\$jtag, "\t$instance_name,  $connect_name, $index\n");
 
 
 
 
                                        add_text_to_string(\$jtag, "\t$instance_name,  $connect_name, $index\n");
 
                                        $jtagwb{$connect_id}{'index'}=$index;
 
 
                                }
                                }
 
 
 
 
                        }#foreach my $num
                        }#foreach my $num
                }#foreach my $plug
                }#foreach my $plug
        }#foreach my $instance_id
        }#foreach my $instance_id
 
 
 
        #Generate memory programming command
 
my $prog='#!/bin/sh
 
 
 
JTAG_MAIN="$PRONOC_WORK/toolchain/bin/jtag_main"
 
 
 
';
 
 
 
 
 
        foreach my $instance_id (@all_instances){
 
                my $category=$soc->soc_get_category($instance_id);
 
                if ($category eq 'RAM') {
 
 
 
                        my $jtag_connect=$soc->soc_get_module_param_value($instance_id,'JTAG_CONNECT');
 
                        my $aw=$soc->soc_get_module_param_value($instance_id,'Aw');
 
                        my $dw=$soc->soc_get_module_param_value($instance_id,'Dw');
 
                        my $JTAG_INDEX=$soc->soc_get_module_param_value($instance_id,'JTAG_INDEX');
 
 
 
                        #check if jtag_index is a parameter
 
                        my $v=$soc->soc_get_module_param_value($instance_id,$JTAG_INDEX);
 
                        $JTAG_INDEX = $v if (defined $v);
 
                        $v= $soc->object_get_attribute('global_param',$JTAG_INDEX);
 
                        $JTAG_INDEX = $v if (defined $v);
 
 
 
                        my $BINFILE=$soc->soc_get_module_param_value($instance_id,'INIT_FILE_NAME');
 
                        ($BINFILE)=$BINFILE=~ /"([^"]*)"/ if(defined $BINFILE);
 
                        $BINFILE=(defined $BINFILE) ? $BINFILE.'.bin' : 'ram0.bin';
 
 
 
                        my $OFSSET="0x00000000";
 
                        my $end=((1<<$aw)*($dw/8))-1;
 
                        my $BOUNDRY=sprintf("0x%08x", $end);
 
                        if($jtag_connect =~ /JTAG_WB/){
 
                                $prog= "$prog \$JTAG_MAIN -n $JTAG_INDEX -s \"$OFSSET\" -e \"$BOUNDRY\" -i  \"$BINFILE\" -c";
 
                                #print "prog= $prog\n";
 
 
 
                        }elsif ($jtag_connect eq 'ALTERA_IMCE'){
 
                                #TODO add later
 
 
 
 
 
                        } else{
 
                                #disabled check if its connected to jtag_wb via the bus
 
                                my      $connect_id = $ram{$instance_id}{'connect'};
 
                                my $OFSSET = $ram{$instance_id}{'base'};
 
                                my $BOUNDRY = $ram{$instance_id}{'end'};
 
                                if(defined $connect_id){
 
                                        #print "id=$connect_id\n";
 
                                        my $JTAG_INDEX= $jtagwb{$connect_id}{'index'};
 
                                                if(defined $JTAG_INDEX){
 
                                                        $v= $soc->object_get_attribute('global_param',$JTAG_INDEX);
 
                                                        $JTAG_INDEX = $v if (defined $v);
 
                                                        $prog= "$prog \$JTAG_MAIN -n $JTAG_INDEX -s \"$OFSSET\" -e \"$BOUNDRY\" -i  \"$BINFILE\" -c";
 
                                                        #print "prog= $prog\n";
 
 
 
                                                }
 
 
 
                                }
 
                        }
 
 
 
 
 
                }
 
 
 
 
 
        }
 
 
 
 
my $lisence= get_license_header("readme");
my $lisence= get_license_header("readme");
my $warning=autogen_warning();
my $warning=autogen_warning();
 
 
 
 
 
 
 
 
my $readme="
my $readme="
$warning
$warning
$lisence
$lisence
 
 
***********************
***********************
**      Program the memories
**      Program the memories
***********************
***********************
 
 
If the memory core and jtag_wb are connected to the same wishbone bus, you can program the memory using
If the memory core and jtag_wb are connected to the same wishbone bus, you can program the memory using
 
 
        sh program.sh
        sh program.sh
 
 
but first, you need to update these variables inside the program.sh file
 
 
 
        OFSSET= [offset_in_hex]
 
                The RAM wishbone bus offset address e.g : 0x0000000.
 
        BOUNDRY=[boundry_in_hex ]
 
                The RAM boundary address in hex e.g: 0x00003fff.
 
        VJTAG_INDEX=[Virtual jtag index number]
 
        BINFILE=[file_name]
 
        memory file in binary format. eg ram00.bin
 
 
 
 
 
        you can get OFSSET, BOUNDRY and VJTAG_INDEX values from following
 
        wishbone buse(s)  info & Jtag to wishbone interface (jtag_wb) info sections.
 
        Also check the memory and jtag_wb are connected to the same bus (have same \"connected to\" filed).
 
 
 
***************************
***************************
**      soc parameters
**      soc parameters
***************************
***************************
 
 
$param
$param
 
 
****************************
****************************
**      wishbone bus(es)  info
**      wishbone bus(es)  info
****************************
****************************
        #slave interfaces:
        #slave interfaces:
        #instance name,  interface name, connected to, base address, boundray address
        #instance name,  interface name, connected to, base address, boundray address
$wb_slaves
$wb_slaves
 
 
        #master interfaces:
        #master interfaces:
        #instance name,  interface name, connected to
        #instance name,  interface name, connected to
$wb_masters
$wb_masters
 
 
****************************
****************************
**      Jtag to wishbone interface (jtag_wb) info:
**      Jtag to wishbone interface (jtag_wb) info:
****************************
****************************
 
 
        #instance name, instance name,  VJTAG_INDEX
        #instance name, instance name,  VJTAG_INDEX
$jtag
$jtag
 
 
 
 
";
";
 
 
        return $readme;
 
 
 
 
 
 
        return ($readme,$prog);
 
 
 
 
 
 
}
}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1;
1;
 
 
 
 
 
 

powered by: WebSVN 2.1.0

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