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] - Rev 56

Compare with Previous | Blame | View Log

use constant::boolean;
 
use lib 'lib/perl';
 
use strict;
use warnings;
 
 
use FindBin;
use lib $FindBin::Bin;
 
use soc;
use ip;
use ip_gen;
use Cwd;
 
 
 
 
 
######################
#   soc_generate_verilog
#####################
 
sub soc_generate_verilog{ 
	my ($soc,$sw_path,$txview)= @_;
	my $soc_name=$soc->object_get_attribute('soc_name');
	#my $top_ip=ip_gen->ip_gen_new();
	my $top_ip=ip_gen->top_gen_new();
	if(!defined $soc_name){$soc_name='soc'};
 
	my @instances=$soc->soc_get_all_instances();
	my $io_sim_v;
	my $top_io_short;
	my $core_id= $soc->object_get_attribute('global_param','CORE_ID');
	$core_id= 0 if(!defined $core_id);
	my $param_as_in_v_all="\tparameter\tCORE_ID=$core_id,
\tparameter\tSW_LOC=\"$sw_path\"";
 
 
 
    my $system_v_all="";
	my $param_pass_v_all="\t\t.CORE_ID(CORE_ID),\n\t\t.SW_LOC(SW_LOC)";
	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,$top_io_pass_all,$io_sim_v_all);
	my $top_io_short_all="\tjtag_debug_reset_in";  
	my $top_io_full_all="\tinput \tjtag_debug_reset_in;\n";
	my $wires=soc->new_wires();
	my $intfc=interface->interface_new();
 
 
	foreach my $id (@instances){
		my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v,$io_top_full_v,$io_sim_v,
		$top_io_short,$param_as_in_v,$param_pass_v,$system_v,$assigned_ports,$top_io_pass,$src_io_short, $src_io_full)=gen_module_inst($id,$soc,$top_ip,$intfc,$wires);
		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(\$param_as_in_v_all,",\n$param_as_in_v")   	if(defined($param_as_in_v)); 
		add_text_to_string(\$local_param_v_all,"$local_param_v\n")   	if(defined($local_param_v)); 
		add_text_to_string(\$param_pass_v_all,",\n$param_pass_v")       if(defined($param_pass_v));
		add_text_to_string(\$system_v_all,"$system_v\n")   				if(defined($system_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(\$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(\$io_full_v_all,"$io_full_v\n")				if(length($io_full_v)>3);
		add_text_to_string(\$top_io_full_all,"$io_top_full_v\n")		if(length($io_top_full_v)>3);
		$top_io_pass_all  = (defined $top_io_pass_all )? "$top_io_pass_all,\n$top_io_pass"   : $top_io_pass         if(defined($top_io_pass));
		$io_sim_v_all     = (defined $io_sim_v_all    )? "$io_sim_v_all,\n$io_sim_v"         : $io_sim_v  	    	if(defined($io_sim_v));
		$top_io_short_all = (defined $top_io_short_all)? "$top_io_short_all,\n$top_io_short" : $top_io_short 		if(defined($top_io_short));
 
 
		#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);
 
	#add functions
	my $dir = Cwd::getcwd();
	open my $file1, "<", "$dir/lib/verilog/functions.v" or die;
	my $functions_all='';
	while (my $f1 = readline ($file1)) {	
		 $functions_all="$functions_all $f1 ";
	}
	close($file1);
	my $unused_wiers_v=assign_unconnected_wires($wires,$intfc);
 
	$unused_wiers_v="" if(!defined $unused_wiers_v);
	$sockets_assign_v_all=""  if(!defined $sockets_assign_v_all);
 
my $has_ni =check_for_ni($soc);
my $import = ($has_ni)? "\n\t`NOC_CONF\n" : ""; 
my $tscale = ($has_ni)? "`include \"pronoc_def.v\"\n" : "`timescale 1ns / 1ps\n"; 
 
my $global_localparam=get_golal_param_v();	
	my $soc_v = (defined $param_as_in_v_all )? "$tscale module $soc_name  #(\n $param_as_in_v_all\n)(\n$io_sim_v_all\n);\n$import\n": "$tscale module $soc_name (\n$io_sim_v_all\n);\n $import\n";
	$soc_v = $soc_v."
$functions_all	
$system_v_all
$global_localparam
$local_param_v_all
$addr_localparam
$module_addr_localparam
$io_full_v_all
$wire_def_v_all
$unused_wiers_v
$inst_v_all
$plugs_assign_v_all
$sockets_assign_v_all
$addr_map
endmodule
 
";
 
 
	$soc->object_add_attribute('top_ip',undef,$top_ip);
	#print @assigned_wires;
 
	#generate top module
	my ($clk_set, $clk_io_sim,$clk_io_full, $clk_assigned_port)= get_top_clk_setting($soc);
	$top_io_short_all=(defined $top_io_short_all)? "$top_io_short_all,\n$clk_io_sim" : $clk_io_sim;
	$top_io_full_all=$top_io_full_all."\n$clk_io_full";            
    $top_io_pass_all=$top_io_pass_all.",\n$clk_assigned_port";
    my %jtag_info= get_soc_jtag_v($soc,$soc_name,$txview);
	my $jtag_v=add_jtag_ctrl (\%jtag_info,$txview);
    my @chains = (sort { $b <=> $a } keys  %jtag_info);
	$soc->object_add_attribute('JTAG','M_CHAIN',$chains[0]);
 
	my $top_v = (defined $param_as_in_v_all )? "module ${soc_name}_top  #(\n $param_as_in_v_all\n)(\n$top_io_short_all\n);\n": "module ${soc_name}_top (\n $top_io_short_all\n);\n $import ";
 
 
	#my $ins= gen_soc_instance_v($soc,$soc_name,$param_pass_v,$txview);
 
	my $pass =  (defined $param_pass_v_all )? "#(\n$param_pass_v_all\n\t)\n": ""; 
 
 
	$top_v=$top_v."
$functions_all	
$global_localparam
$local_param_v_all
$top_io_full_all
$clk_set
$jtag_v	
\t${soc_name}${pass}\tthe_${soc_name} 
\t(
$top_io_pass_all
\t);
endmodule
";
 
	my ($readme,$prog)=gen_system_info($soc,$param_as_in_v_all); 
	return ("$soc_v",$top_v,$readme,$prog);
 
 
}	
 
 
 
 
sub append_to_hash {
	my ($ref,$att1,$att2,$data)=@_;
	my %hash= %{$ref};
	my $r = $hash{$att1}{$att2};
	my @array= (defined  $r)? @{$r} : ();
	push (@array,$data);
	$hash{$att1}{$att2} = \@array;
	return %hash;	
}
 
 
sub get_soc_jtag_v{
	my ($soc,$soc_name,$txview)=@_;
 
	my $processor_en=0;
	#my $jtag_insts="";
	#my $altera_jtag_ctrl=0;
	#my $xilinx_jtag_ctrl=0;
	#my $xilinx_jtag_ctrl_in;
	#my $xilinx_jtag_ctrl_out;
	my $jtag_inst_name="";
 
 
	my $top=$soc->soc_get_top();
	my @intfcs=$top->top_get_intfc_list();
 
	my %jtag_info;
 
	foreach my $intfc (@intfcs){			
		if( $intfc =~ /socket:jtag_to_wb\[/){ #check JTAG connect parameter. if it is XILINX then connect it to jtag tap
			my @ports=$top->top_get_intfc_ports_list($intfc);
			foreach my $p (@ports){
				my($id,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);				
				my $JTAG_CONNECT=$soc->soc_get_module_param_value ($id,'JTAG_CONNECT');						
				$JTAG_CONNECT=remove_all_white_spaces($JTAG_CONNECT);
				if($JTAG_CONNECT  =~ /XILINX_JTAG_WB/){
					my $chain=$soc->soc_get_module_param_value ($id,'JTAG_CHAIN');		
					my $index=$soc->soc_get_module_param_value ($id,'JTAG_INDEX');	
					$jtag_inst_name= $soc->soc_get_instance_name($id);					
					my %params	= $soc->soc_get_module_param($id);
					my $new_range = add_instantc_name_to_parameters(\%params,$id,$range);
					%jtag_info=append_to_hash (\%jtag_info,$chain,'wire',"\twire [ $new_range ] ${p};");
		#			$jtag_def=$jtag_def."\twire [ $new_range ] ${p};\n";				
					if($type eq 'input'){
		#				$jtag_insts=$jtag_insts."$id XILINX JTAG,";
						%jtag_info=append_to_hash (\%jtag_info,0,'inst',"$id XILINX JTAG");
		#				$xilinx_jtag_ctrl++;
						%jtag_info=append_to_hash (\%jtag_info,$chain,'xilinx_num',1);
		#				$xilinx_jtag_ctrl_in=(defined $xilinx_jtag_ctrl_in)? "$xilinx_jtag_ctrl_in,$p" : "$p";
						%jtag_info=append_to_hash (\%jtag_info,$chain,'input',$p);
						%jtag_info=check_jtag_indexs(\%jtag_info,$chain,$index,$txview,$jtag_inst_name,0);
						#print "\%jtag_info=check_jtag_indexs(\%jtag_info,$chain,$index,$txview,$jtag_inst_name);\n"
 
					}else {
		#				$xilinx_jtag_ctrl_out=(defined $xilinx_jtag_ctrl_out)? "$xilinx_jtag_ctrl_out,$p" : "$p";
						%jtag_info=append_to_hash (\%jtag_info,$chain,'output',$p);
					}				
				}#'"XILINX_JTAG_WB"'
 
				elsif($JTAG_CONNECT eq '"ALTERA_JTAG_WB"'){
					my $index=$soc->soc_get_module_param_value ($id,'JTAG_INDEX');	
					if($type eq 'input'){
		#				$jtag_insts=$jtag_insts."$id ALTERA JTAG,";
						%jtag_info=append_to_hash (\%jtag_info,0,'inst',"$id ALTERA JTAG");
						%jtag_info=append_to_hash (\%jtag_info,0,'altera_num',1);
						%jtag_info=check_jtag_indexs(\%jtag_info,0,$index,$txview,$jtag_inst_name,0);
		#				$altera_jtag_ctrl++;
 
					}
				}#'"ALTERA_JTAG_WB"'	
 
			}	#$p	
		}#if
 
	}
	#print Dumper \%jtag_info;	
	return %jtag_info;
}
 
 
#################
#	gen_module_inst
###############
 
sub get_io_nc_info  {
	my($soc,$port,$inst,$intfc_name,$id)=@_;
	my $IO='no';
	my $NC='no';
	my($i_type,$i_name,$i_num) =split("[:\[ \\]]", $intfc_name);		
	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);
			if($connect_id eq 'IO'){ $IO='yes';}
			if($connect_id eq 'NC'){ $NC='yes';}
	}		
	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 %connected_plugs=%$ref1;
		my %connected_plug_nums=%$ref2;
		if(!%connected_plugs ){ 
			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);
				if ( length( $v || '' )){ $IO='no';} else {
					my $con= $soc->object_get_attribute("Unset-intfc" ,"$inst-$port");
					if(!defined $con){ $IO='yes';}
					else{
						$IO='yes' if $con eq 'IO'; 
					}
				}
			}
		}
 
 
 
	return ($IO ,$NC);
}
 
 
 
sub gen_module_inst {
	my ($id,$soc,$top_ip,$intfc,$wires, $sim_only)=@_;
	$sim_only = 0 if (!defined $sim_only);
	my ($io_sim_v,$top_io_short,$param_as_in_v,$param_pass_v,$system_v);
	my $top_io_pass;
	my $src_io_short;
	my $src_io_full="";
	my $module 	=$soc->soc_get_module($id);
	my $module_name	=$soc->soc_get_module_name($id);
	my $category 	=$soc->soc_get_category($id);
 
 
	my $inst   	= $soc->soc_get_instance_name($id);
	my %params	= $soc->soc_get_module_param($id);
	my %params_type	= $soc->soc_get_module_param_type($id);
 
 
 
	my $src_ip=$soc ->object_get_attribute('SOURCE_SET',"IP");
	my $ip = ip->lib_new ();
	$ip->add_ip($src_ip) if defined $src_ip;	
 
 
	my @ports=$ip->ip_list_ports($category,$module);
	my ($inst_v,$intfc_v,$plugs_assign_v,$sockets_assign_v);
	my $wire_def_v="";
	my $io_full_v="";
	my $io_top_full_v="";
	$plugs_assign_v="\n";
 
 
	my $counter=0;
	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,\%params_type);
 
 
 
	$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,'category',$category);
	$top_ip->top_add_def_to_instance($id,'instance',$inst);
 
	#
	my $assigned_ports="";
 
	#module name	
	$inst_v=( defined $instance_param_v )? "$module_name #(\n": $module_name ; 
	#module parameters
	$inst_v=( defined $instance_param_v)? "$inst_v $instance_param_v\n\t)": $inst_v;
	#module instance name 
	$inst_v="$inst_v  $inst \t(\n";	
	#module ports
	$counter=0;
	foreach my $port (@ports){
		my ($type,$range,$intfc_name,$i_port)=$ip->ip_get_port($category,$module,$port);
		my $assigned_port;
		my($i_type,$i_name,$i_num) =split("[:\[ \\]]", $intfc_name);
 
		my ($IO ,$NC) =get_io_nc_info($soc,$port,$inst,$intfc_name,$id);
 
 
 
		if($NC eq 'yes'){
 
 
		}
		elsif($IO eq 'yes' || !defined $i_type || !defined $i_name || !defined $i_num){ #its an IO port
			if($i_port eq 'NC' ){
				$NC='yes';
			}else {
				 $i_name ='IO' if( !defined $i_name);
 
 
				 $assigned_port="$inst\_$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 $r = (!defined $new_range)? 0 : (length ($new_range)>1 )?  1 : 0;
 
				my $str = (!defined $new_range) ? "\t\t\t" : 
				 			  ($new_range =~ /:/  ) ? "\t[ $new_range ]\t" : "\t$new_range\t";
 
 
				 my $port_def=  	"\t$type $str $assigned_port;\n";
				 $io_full_v=$io_full_v.$port_def;
 
				 if ($i_name eq 'RxD_sim' && $sim_only == 0){
				 	#do notthing 
				 }
				 elsif($i_name eq 'enable'){
				 	$top_io_pass = (!defined $top_io_pass )? "\t\t.$assigned_port($assigned_port & jtag_cpu_en)" : "$top_io_pass,\n\t\t.$assigned_port($assigned_port & jtag_cpu_en)"; 				 	
				 	$top_io_short= (!defined $top_io_short)? "\t$assigned_port" : "$top_io_short, \n\t$assigned_port";
				 	$io_top_full_v= $io_top_full_v.$port_def;				 	
				 } elsif($i_name eq 'reset' || $i_name eq 'clk'){
					#connection done using  get_top_clk_setting 
				 	 $src_io_short= (!defined $src_io_short)? "\t$assigned_port" : "$src_io_short, \n\t$assigned_port"; 
					 $src_io_full= $src_io_full.$port_def;
				 } elsif( $i_name eq 'jtag_to_wb' ){
				 	 $top_io_pass = (!defined $top_io_pass )? "\t\t.$assigned_port($assigned_port)" : "$top_io_pass,\n\t\t.$assigned_port($assigned_port)";
 
				 }else{	
					 $top_io_short= (!defined $top_io_short)? "\t$assigned_port" : "$top_io_short, \n\t$assigned_port"; 
					 $top_io_pass = (!defined $top_io_pass )? "\t\t.$assigned_port($assigned_port)" : "$top_io_pass,\n\t\t.$assigned_port($assigned_port)";
					 $io_top_full_v= $io_top_full_v.$port_def;
				 }
 
 
 
				# $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);
			}
 
 
		}
		else{ # port connected internally using interface 
			 $assigned_port="$inst\_$i_type\_$i_name\_$i_num\_$i_port";
 
			 #create plug 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_text_to_string(\$wire_def_v,$wire_string)  if ($wire_def_v !~ /[\s\]]$port_name;/);
 
 
 
			if($i_type eq 'plug'){
				#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 ($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";
				if(defined $connect_socket_num){
					my $connect_n=$soc->soc_get_instance_name($connect_id);
					my $connect_port= "$connect_n\_socket_$i_name\_$connect_socket_num\_$i_connect";
					#connect plug port to socket port
					my $new_range = add_instantc_name_to_parameters(\%params,$inst,$range);
					my $r= (!defined $range)? 0 : (length ($range)>1 )? 1 :0; 
 
					my $connect_port_range=($r==1)?"$connect_port\[$new_range\]":$connect_port;					
 
					if($type eq 'input' ){
						$plugs_assign_v= "$plugs_assign_v \tassign  $assigned_port = $connect_port_range;\n";
						$wires->wire_add($assigned_port,"connected",1);
 
					}else{
						$plugs_assign_v= "$plugs_assign_v \tassign  $connect_port  = $assigned_port;\n";
						$wires->wire_add($connect_port,"connected",1);						
					}
 
 
				}
			}#plug
			else{ #socket
				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 ($i_range,$t,$i_connect)=$intfc->get_port_info_of_socket($i_name,$i_port);
				if ( length( $v || '' )) {
						$v--;
						my $name= $soc->soc_get_instance_name($id);
						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);
						add_text_to_string(\$wire_def_v,$wire_string) if ($wire_def_v !~ /[\s\]]$port_name;/);
 
						for(my $i=$v-1; $i>=0; $i--) {
							$joint= "$joint ,$name\_$i_type\_$i_name\_$i\_$i_port";
							#create socket 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);
							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');
						if($type ne 'input' ){
							my @w=split('\s*,\s*',$joint);
							foreach my $q (@w) {
								$wires->wire_add($q,"connected",1);
							}
 
						}
						$joint=($v>0)? "\{ $joint\ }" : "$joint";
						my $text=($type eq 'input' )? "\tassign $assigned_port = $joint;\n": "\tassign $joint = $assigned_port;\n";
 
						add_text_to_string(\$sockets_assign_v,$text);
				}
 
 
 
			}#socket	
 
 
		}		
 
		$i_name ='IO' if (!defined $i_name);
		my $reset_jtag_ored = ($i_name eq 'reset')? '| jtag_system_reset' : '';	
		my $reset_jtag_nc = ($i_name eq 'reset')? 'jtag_system_reset' : '';		
 
 
		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";
			$assigned_ports=($NC eq 'yes')? "$assigned_ports\t\t.$port($reset_jtag_nc)\n": "$assigned_ports\t\t.$port($assigned_port $reset_jtag_ored)\n";
 
		}
		else {
			$inst_v=($NC eq 'yes')? "$inst_v\t\t.$port(),\n":"$inst_v\t\t.$port($assigned_port),\n";
			$assigned_ports=($NC eq 'yes')? "$assigned_ports\t\t.$port($reset_jtag_nc),\n":"$assigned_ports\t\t.$port($assigned_port $reset_jtag_ored),\n";
		}
 
		if($type ne 'input' && $NC ne 'yes' ){
			$wires->wire_add($assigned_port,"connected",1);
 
		}
 
 
 
	}	
	$inst_v="$inst_v\t);\n";
 
 
 
	my $hdr =$ip->ip_get($category,$module,'system_v');
	if(defined $hdr){
			$hdr=replace_golb_var($hdr,\%params);
	    	$system_v= "$system_v $hdr\n";
	}
 
	return ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,	$io_full_v,
	$io_top_full_v,$io_sim_v,$top_io_short,$param_as_in_v,$param_pass_v,$system_v,$assigned_ports,$top_io_pass,
	$src_io_short, $src_io_full);
	#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,$assigned_ports);
 
 
}	
 
 
sub add_instantc_name_to_parameters{
	my ($params_ref,$inst,$range)=@_;
	my $new_range=$range;
	#print "$new_range\n";
	return $new_range if(!defined $range);
	my @list=sort keys%{$params_ref};
	foreach my $param (@list){
		my $new_param= "$inst\_$param";
		($new_range=$new_range)=~ s/\b$param\b/$new_param/g;
		#print "$new_range= s/\b$param\b/$new_param/g\n";
	}
		return $new_range;
}			
 
 
sub gen_parameter_v{
	my ($param_ref,$id,$inst,$category,$module,$ip,$param_as_in_v,$ref_ordered,$top_ip,$param_pass_v,$param_type_ref)=@_;
	my %params=%{$param_ref};
	my %params_type=%{$param_type_ref};
	my @param_order;
	@param_order=@{$ref_ordered} if(defined $ref_ordered);
 
	my ($param_v,$local_param_v,$instance_param_v);	
	my @list;
	@list= (@param_order)? @param_order : 	sort keys%params;
	my $first_param=1;
 
	$local_param_v="";
	$param_v="";
 
	#add instance name to parameter value
	foreach my $param (@list){
		$params{$param}=add_instantc_name_to_parameters(\%params,$inst,$params{$param});
		#%params_type{$param}=add_instantc_name_to_parameters(\%params_type,$inst,$params_type{$param});
	}
 
 
	#print parameters
	foreach my $param (@list){
		my $inst_param= "$inst\_$param";
		my ($default,$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 );
		if ($vfile_param_type eq "Localparam"){
			my $type = $params_type{$param};
			$type = "Localparam" if (! defined $type);	
			$vfile_param_type = ($type eq 'Parameter')?  "Parameter" : "Localparam";			
		}
 
 
 
		#$vfile_param_type= "Parameter"  if ($vfile_param_type eq 1);
		#$vfile_param_type= "Localparam" if ($vfile_param_type eq 0);		
		$redefine_param=1 if (! defined $redefine_param);
		$redefine_param=0 if ($vfile_param_type eq "Don't include");
		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)";
			$first_param=0;		
 
		}
 
 
 
		if($vfile_param_type eq "Localparam"){
			$local_param_v="$local_param_v\tlocalparam\t$inst_param=$params{$param};\n"; 
			$top_ip->top_add_localparam($id,$inst_param,$params{$param},$type,$content,$info,$vfile_param_type,$redefine_param);
		}
		elsif($vfile_param_type eq "Parameter"){
			#print "$inst_param($inst_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\t.$inst_param($inst_param)": "\t\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}":
														 "   \tparameter\t$inst_param=$params{$param}";
			#add parameter to top 
			#$top_ip  $inst_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);	
 
 
}	
 
###############
#	generate_address_cmp
##############
 
sub generate_address_cmp{
	my ($soc,$wires)=@_;
	my $number=0;
	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 $module_addr_localparam="\n//Wishbone slave base address based on module name. \n";
 
	my @all_instances=$soc->soc_get_all_instances();
	foreach my $instance_id (@all_instances){
		my $instance_name=$soc->soc_get_instance_name($instance_id);
			my @plugs= $soc->soc_get_all_plugs_of_an_instance($instance_id);
			foreach my $plug (@plugs){
				my @nums=$soc->soc_list_plug_nums($instance_id,$plug);				
				foreach my $num (@nums){
					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')){
						#read wishbone bus address and data width size						
						my $Aw=$soc->soc_get_module_param_value ($connect_id,'Aw');
						my $Dw=$soc->soc_get_module_param_value ($connect_id,'Dw');
						$Aw=32 if (!defined $Aw); 
						$Dw=32 if (!defined $Dw); 
						add_text_to_string(\$addr_mp_v,"/* $instance_name wb_slave $num */\n");
						#count how many nibbles we have in address size 
						my $hh= ($Aw % 4)? ($Aw >> 2)+1 : ($Aw >> 2);
						$hh= "'h%0${hh}x";#hex address nibble num
						#change addresses to word as the assign addresses by ProNoC GUI are in bytes  
						my $bytenum=($Dw/8);
						my $base_hex=$Aw.sprintf($hh, ($base/$bytenum));
						my $end_hex=$Aw.sprintf($hh, ($end/$bytenum));
						#my $base_hex=sprintf("32'h%08x", ($base>>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\_END_ADDR\t=\t$end_hex;\n");
						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\_END_ADDR\t=\t$end_hex;\n");
						}
 
						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);
						$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++;
					}#if
				}#foreach my $num
			}#foreach my $plug
		}#foreach my $instance_id
 
		add_text_to_string(\$instance_addr_localparam,"\n");
		add_text_to_string(\$module_addr_localparam,"\n");
		return ($addr_mp_v,$instance_addr_localparam,$module_addr_localparam);	
}	
 
 
sub add_text_to_string{
		my ($string,$text)=@_;
		if(defined $text){
			$$string=(defined ($$string))? "$$string $text" : $text;	
		}
}	
 
 
 
sub generate_wire {
	my($range,$port_name,$inst_name,$params_ref,$i_type,$i_name,$i_num,$i_port, $wires)=@_;
	my $wire_string;
	my $new_range;
	my $r= (!defined $range)? 0 : (length ($range)>1 )? 1 :0; 
 
	if($r ==1 ){
		#replace parameter in range
		$new_range = add_instantc_name_to_parameters($params_ref,$inst_name,$range);
		$wire_string= "\twire\t[ $new_range ] $port_name;\n";				
	}
	else{
		$wire_string="\twire\t\t\t $port_name;\n";
	}
	$wires->wire_add("$port_name","range",$new_range);
	$wires->wire_add("$port_name","inst_name",$inst_name);
	$wires->wire_add("$port_name","i_type",$i_type);
	$wires->wire_add("$port_name","i_name",$i_name);
	$wires->wire_add("$port_name","i_num",$i_num);
	$wires->wire_add("$port_name","i_port",$i_port);
 
	return ($wire_string,$port_name);	
}	
 
sub port_width_repeat{
	my ($range,$value)=@_;
	return "$value" if (!defined $range);
	$range= remove_all_white_spaces($range);
	my ($h,$l)=split(':',$range);
	return "$value" if(!defined $h ) ; # 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"); 
	if($h =~ /-1$/){ # the address ranged is endup with -1 
		$h =~ s/-1$//; # remove -1
		return "\{$h\{$value\}\}"  if($h =~ /\)$/);
		return "\{($h)\{$value\}\}" if($h =~ /[\*\.\+\-\^\%\&]/);
		return "\{$h\{$value\}\}";
	}
	return "\{($h+1){$value}}";	
}
 
sub assign_unconnected_wires{
	my($wires,$intfc)=@_;
	my $unused_wire_v=undef;
 
	my @all_wires=$wires->wires_list();
	foreach my $p (@all_wires ){
		if(!defined $wires->wire_get($p,"connected")){ # unconnected wires
			# Take default value from interface definition 
			#$wires->wire_get("$p","inst_name");
			my $i_type=$wires->wire_get($p,"i_type");
			my $i_name= $wires->wire_get($p,"i_name");
			my $i_num=$wires->wire_get($p,"i_num");
			my $i_port=$wires->wire_get($p,"i_port");
			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):
																			  $intfc->get_port_info_of_plug($i_name,$i_port);
			#""Active high","Don't care"
 
			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 high')? port_width_repeat($new_range,"1\'b1"):
 						($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="\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;
 
 
}
 
 
 
 
sub gen_soc_instance_v{
	my ($soc,$soc_name,$param_pass_v,$txview)=@_;
 
	my $processor_en=0;
	my $altera_jtag_ctrl=0;
	my $xilinx_jtag_ctrl=0; #if it becomes larger than 0 then add jtag to wb module 
	my $jtag_insts="";
	my $xilinx_jtag_ctrl_in;
	my $xilinx_jtag_ctrl_out;
	my $rpin = "1\'b0";
	my $clkpin;
	my $soc_v="
	// Allow software to remote reset/enable the cpu via jtag
	wire jtag_cpu_en, jtag_system_reset;
";
 
	my $mm="$soc_name #(\n $param_pass_v \n\t)the_${soc_name}(\n";
	my $top=$soc->soc_get_top();
	my @intfcs=$top->top_get_intfc_list();
	my $i=0;	
	my $ss="";
	my $ww="";
 
	my $jtag_inst_name="";
 
	foreach my $intfc (@intfcs){	
 
		#reset
		if( $intfc eq 'plug:reset[0]'){
			my @ports=$top->top_get_intfc_ports_list($intfc);
			foreach my $p (@ports){
				my($id,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
				$mm="$mm," if ($i);	
				$mm="$mm\n\t\t.$p(${p}_ored_jtag)";
				$ss="$ss\tassign ${p}_ored_jtag = (jtag_system_reset | $p);\n";
				$ww="$ww\twire ${p}_ored_jtag;\n";
				$rpin = $p;
				$i=1;		
 
			}			
		}
 
		#enable
		elsif( $intfc eq 'plug:enable[0]'){
			my @ports=$top->top_get_intfc_ports_list($intfc);
			foreach my $p (@ports){
				my($id,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
				$mm="$mm," if ($i);		
				$mm="$mm\n\t\t.$p(${p}_anded_jtag)";
				$ss="$ss\tassign ${p}_anded_jtag= (jtag_cpu_en & $p);\n";
				$ww="$ww\twire ${p}_anded_jtag;\n";
				$processor_en=1;
				$i=1;		
 
			}		
		}
 
		#RxD_sim
		elsif( $intfc eq 'socket:RxD_sim[0]'){
			#This interface is for simulation only donot include it in top module			
			my @ports=$top->top_get_intfc_ports_list($intfc);
			foreach my $p (@ports){
				$mm="$mm," if ($i);		
				$mm="$mm\n\t\t.$p( )";
				$i=1;
			}			
		}
 
 
		#jtag_to_wb	
		elsif( $intfc =~ /socket:jtag_to_wb\[/){ #check JTAG connect parameter. if it is XILINX then connect it to jtag tap
			my @ports=$top->top_get_intfc_ports_list($intfc);
			foreach my $p (@ports){
				my($id,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);
 
 
				my $JTAG_CONNECT=remove_all_white_spaces($soc->soc_get_module_param_value ($id,'JTAG_CONNECT'));
 
				#print "$inst,$range,$type,$intfc_name,$intfc_port-> $JTAG_CONNECT;";
				if($JTAG_CONNECT eq '"XILINX_JTAG_WB"'){
					$jtag_inst_name= $soc->soc_get_instance_name($id);
 
 
					my %params	= $soc->soc_get_module_param($id);
					my $new_range = add_instantc_name_to_parameters(\%params,$id,$range);
					$ww="$ww\twire [ $new_range ] ${p};\n";
 
					$mm="$mm," if ($i);		
					$mm="$mm\n\t\t.$p($p)";	
					if($type eq 'input'){
						$jtag_insts=$jtag_insts."$id XILINX JTAG,";
						$xilinx_jtag_ctrl++;
						$xilinx_jtag_ctrl_in=(defined $xilinx_jtag_ctrl_in)? "$xilinx_jtag_ctrl_in,$p" : "$p";
					}else {
						$xilinx_jtag_ctrl_out=(defined $xilinx_jtag_ctrl_out)? "$xilinx_jtag_ctrl_out,$p" : "$p";
					}
 
 
				}else{#Dont not connect 
					$mm="$mm," if ($i);		
					$mm="$mm\n\t\t.$p( )";
				}
 
				if($JTAG_CONNECT =~ /ALTERA_JTAG_WB/){
 
					if($type eq 'input'){
						$jtag_insts=$jtag_insts."$id ALTERA JTAG,";
						$altera_jtag_ctrl++;
 
					}
				}	
				$i=1;	
			}		
 
		}
 
 
 
		else {
		#other interface
			my @ports=$top->top_get_intfc_ports_list($intfc);
			foreach my $p (@ports){
			my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);	
			$clkpin=$p if( $intfc eq 'plug:clk[0]');		
			$mm="$mm," if ($i);		
			$mm="$mm\n\t\t.$p($p)";	
			$i=1;	
 
			}				
		}			
 
	}
	$mm="$mm\n\t);";
	add_text_to_string(\$soc_v,"$ww\n");
	add_text_to_string(\$soc_v,"$mm\n");
	add_text_to_string(\$soc_v,"$ss\n");
 
 
	if($altera_jtag_ctrl>0 && $xilinx_jtag_ctrl>0 ){
		add_colored_info($txview,"Found JTAG comminication ports from differnt FPGA vendors:$jtag_insts. ",'red');			
 
	}elsif ($xilinx_jtag_ctrl>0){
		$xilinx_jtag_ctrl_in  ="{$xilinx_jtag_ctrl_in}"  if($xilinx_jtag_ctrl != 1); 
		$xilinx_jtag_ctrl_out ="{$xilinx_jtag_ctrl_out}" if($xilinx_jtag_ctrl != 1); 
 
		$soc_v = $soc_v."
	xilinx_jtag_wb  #(
		.JWB_NUM($xilinx_jtag_ctrl),
		.JDw(${jtag_inst_name}_JDw),
    	.JAw(${jtag_inst_name}_JAw)		
	)jwb(
 
		.reset($rpin),
		.cpu_en(jtag_cpu_en),
		.system_reset(jtag_system_reset),
		.wb_to_jtag_all($xilinx_jtag_ctrl_out),
		.jtag_to_wb_all($xilinx_jtag_ctrl_in)
	);		
 
";
 
	}elsif($altera_jtag_ctrl>0) {
$soc_v = $soc_v."		
	jtag_system_en jtag_en (
		.cpu_en(jtag_cpu_en),
		.system_reset(jtag_system_reset)
 
	);	
";		
 
	}else{
$soc_v = $soc_v."
    //No jtag connection has found in the design	
	assign jtag_cpu_en=1\'b0;
	assign jtag_system_reset=1'b0;	
";
	}
 
	$soc_v=$soc_v."\n endmodule\n";	
	return $soc_v;
 
}
 
 
 
 
 
sub gen_soc_instance_v_no_modfy{
	my ($soc,$soc_name,$param_pass_v)=@_;
	my $soc_v;
	my $processor_en=0;
 
 
	my $mm="$soc_name #(\n $param_pass_v \n\t)the_${soc_name}(\n";
 
	my $top=$soc->soc_get_top();
	my @intfcs=$top->top_get_intfc_list();
 
	my $i=0;
 
 
 
 
	my $ss="";
	my $ww="";
 
	foreach my $intfc (@intfcs){
 
 
 
 
 
			my @ports=$top->top_get_intfc_ports_list($intfc);
			foreach my $p (@ports){
			my($inst,$range,$type,$intfc_name,$intfc_port)= $top->top_get_port($p);			
			$mm="$mm," if ($i);	
			if( $intfc =~ /socket:jtag_to_wb\[/){#dont include jtag connection
				$mm="$mm\n\t\t.$p( )";
			}else{	
				$mm="$mm\n\t\t.$p($p)";
			}	
			$i=1;	
 
 
		}	
 
 
	}
	$mm="$mm\n\t);";
	add_text_to_string(\$soc_v,"$ww\n");
	add_text_to_string(\$soc_v,"$mm\n");
	add_text_to_string(\$soc_v,"$ss\n");
	add_text_to_string(\$soc_v,"\n endmodule\n");	
 
 
 
	return $soc_v;
 
}
 
 
 
 
 
 
 
 
sub gen_system_info {
	my ($soc,$param)=@_;
	my ($wb_slaves,$wb_masters,$other,$jtag);	
	#my (@newbase,@newend,@connects);
 
 
   $jtag='';
 
	my @all_instances=$soc->soc_get_all_instances();
 
my %jtagwb; my %ram;
 
 
	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);
		foreach my $plug (@plugs){
			my @nums=$soc->soc_list_plug_nums($instance_id,$plug);
			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 $instance_name=$soc->soc_get_instance_name($instance_id);
				my $connect_name=$soc->soc_get_instance_name($connect_id);
				#get interfaces
				if((defined $connect_socket) && ($connect_socket eq 'wb_slave')){	
 
					$base=sprintf("0x%08x", $base);
					$end=sprintf("0x%08x", $end);					
					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
				elsif((defined $connect_socket) && ($connect_socket eq 'wb_master')){
					add_text_to_string(\$wb_masters,"\t$instance_name, $name, $connect_name\n");
				}
				elsif(defined $connect_socket) {
					add_text_to_string(\$other,"\t$instance_name, $name, $connect_name\n");
 
				}
				# get jtag_wbs
				if((defined $connect_socket) && ($connect_socket eq 'wb_master') && ($instance_id =~ /jtag_wb/)){						
					my $index=$soc->soc_get_module_param_value($instance_id,'JTAG_INDEX');
					my $chain=$soc->soc_get_module_param_value($instance_id,'JTAG_CHAIN');
					my $vendor_connect =$soc->soc_get_module_param_value($instance_id,'JTAG_CONNECT');
					add_text_to_string(\$jtag, "\t$instance_name,  $connect_name, $index\n");
 
					$jtagwb{$connect_id}{'index'}=$index;	
					$jtagwb{$connect_id}{'chain'}=$chain;	
					$jtagwb{$connect_id}{'vendor_connect'}=$vendor_connect;
				}
 
 
			}#foreach my $num
		}#foreach my $plug
	}#foreach my $instance_id
 
	#Generate memory programming command
my $prog='#!/bin/bash
 
#JTAG_INTFC="$PRONOC_WORK/toolchain/bin/JTAG_INTFC"
source ./jtag_intfc.sh
 
';
 
 
	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');
			$jtag_connect=remove_all_white_spaces($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');
			my $JTAG_CHAIN=$soc->soc_get_module_param_value($instance_id,'JTAG_CHAIN');
 
			#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,'JTAG_MEM_FILE');
			($BINFILE)=$BINFILE=~ /"([^"]*)"/ if(defined $BINFILE);
			$BINFILE=(defined $BINFILE) ? "./RAM/".$BINFILE.'.bin' : './RAM/ram0.bin';
 
			my $OFSSET="0x00000000";
			my $end=((1 << $aw)*($dw/8))-1;
			my $BOUNDRY=sprintf("0x%08x", $end);			
			if($jtag_connect =~ /ALTERA_JTAG_WB/ ) {
				$prog= "$prog \$JTAG_INTFC -n $JTAG_INDEX -s \"$OFSSET\" -e \"$BOUNDRY\" -i  \"$BINFILE\" -c";
				#print "prog= $prog\n";
 
			} elsif ($jtag_connect =~ /XILINX_JTAG_WB/){
				$prog= "$prog \$JTAG_INTFC -t $JTAG_CHAIN -n $JTAG_INDEX -s \"$OFSSET\" -e \"$BOUNDRY\" -i  \"$BINFILE\" -c";
 
			}
 
			elsif ($jtag_connect eq 'ALTERA_IMCE'){
				#TODO add later
				$prog= "$prog ".'>&2 echo'." \"ALTERA_IMCE runtime programming is not supported yet for programming  $instance_id\"\n";	
 
			} else{
				#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'};
					my $JTAG_CHAIN= $jtagwb{$connect_id}{'chain'};
					my $JTAG_VENDOR= $jtagwb{$connect_id}{'vendor_connect'}; 
 
					my $t="";
					$t="-t $JTAG_CHAIN"if($JTAG_VENDOR =~ /XILINX_JTAG_WB/);
 
					if(defined $JTAG_INDEX){
							$v= $soc->object_get_attribute('global_param',$JTAG_INDEX);
							$JTAG_INDEX = $v if (defined $v);
							$prog= "$prog  \$JTAG_INTFC $t -n $JTAG_INDEX -s \"$OFSSET\" -e \"$BOUNDRY\" -i  \"$BINFILE\" -c";
							#print "prog= $prog\n";
 
					}else{
						$prog= "$prog".'>&2 echo'." \"JTAG runtime programming is not enabled in  $instance_id\"\n";	
 
					}
 
				}else{
					$prog= "$prog".'>&2 echo'."\"JTAG runtime programming is not enabled in  $instance_id\"\n";	
 
				}
			}
 
 
		}	
 
 
	}
 
 
my $lisence= get_license_header("readme"); 
my $warning=autogen_warning();
 
 
$wb_slaves = " \t\t NOTE: No wishbone slaves interface has been found in the design " if (!defined $wb_slaves);
$wb_masters= " \t\t NOTE: No wishbone master interface has been found in the design " if (!defined $wb_masters);
 
my $readme="
$warning
$lisence
 
***********************
**	Program the memories
***********************
 
If the memory core and jtag_wb are connected to the same wishbone bus, you can program the memory using 
 
	bash program.sh  
 
 
 
***************************
**	soc parameters
***************************
 
$param
 
****************************
**	wishbone bus(es)  info
****************************
	#slave interfaces:
	#instance name,  interface name, connected to, base address, boundary address 	
$wb_slaves
 
	#master interfaces:
	#instance name,  interface name, connected to
$wb_masters
 
****************************
**	Jtag to wishbone interface (jtag_wb) info:
****************************
 
	#instance name, instance name,  JTAG_INDEX
$jtag
 
 
";
 
 
 
 
	return ($readme,$prog);
 
 
 
}	
 
 
 
######################
#   soc_generate_verilog
#####################
 
sub soc_generate_verilator{ 
	my ($soc,$sw_path,$name,$params_ref)= @_;
	my $soc_name=$soc->object_get_attribute('soc_name');
	my $top_ip=ip_gen->top_gen_new();
	if(!defined $soc_name){$soc_name='soc'};
 
	my @instances=$soc->soc_get_all_instances();
	my $io_sim_v;
	my $top_io_short_all;
	my $core_id= $soc->object_get_attribute('global_param','CORE_ID');
	$core_id= 0 if(!defined $core_id);
	my $param_as_in_v_all="\tparameter\tCORE_ID=$core_id,
\tparameter\tSW_LOC=\"$sw_path\"\n,";
 
	my $param_pass_v_all="\t\t.CORE_ID(CORE_ID),\n\t\t.SW_LOC(SW_LOC)";
	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,$top_io_full_all,$system_v_all);
	my ($src_io_full_all,$src_io_short_all);
	my $wires=soc->new_wires();
	my $intfc=interface->interface_new();
 
 
	foreach my $id (@instances){
		my ($param_v, $local_param_v, $wire_def_v, $inst_v, $plugs_assign_v, $sockets_assign_v,$io_full_v,$io_top_full_v,$io_sim_v,
		$top_io_short,$param_as_in_v,$param_pass_v,$system_v,$assigned_ports,$top_io_pass,$src_io_short, $src_io_full)=gen_module_inst($id,$soc,$top_ip,$intfc,$wires,1);
		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(\$param_as_in_v_all,",\n$param_as_in_v")   	if(defined ($param_as_in_v)); 
		add_text_to_string(\$local_param_v_all,"$local_param_v\n")   	if(defined($local_param_v)); 
		add_text_to_string(\$param_pass_v_all,",\n$param_pass_v")       if(defined($param_pass_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(\$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(\$io_full_v_all,"$io_full_v\n")				if(length($io_full_v)>3);
		add_text_to_string(\$top_io_full_all,"$io_top_full_v\n")		if(length($io_top_full_v)>3);
		add_text_to_string(\$src_io_full_all,"$src_io_full\n")			if(length($src_io_full)>3);
 
		$top_io_short_all = (defined $top_io_short_all)? "$top_io_short_all,\n$top_io_short" : $top_io_short 		if(defined($top_io_short));		
		$src_io_short_all = (defined $src_io_short_all)? "$src_io_short_all,\n$src_io_short" : $src_io_short 		if(defined($src_io_short));		
		#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);
 
	#add functions
	my $dir = Cwd::getcwd();
	open my $file1, "<", "$dir/lib/verilog/functions.v" or die;
	my $functions_all='';
	while (my $f1 = readline ($file1)) {	
		 $functions_all="$functions_all $f1 ";
	}
	close($file1);
	my $unused_wiers_v=assign_unconnected_wires($wires,$intfc);
 
 
	$soc->object_add_attribute('top_ip',undef,$top_ip);
	#print @assigned_wires;
 
	#generate topmodule
	my $params_v="
\tparameter\tCORE_ID=$core_id;
\tparameter\tSW_LOC=\"$sw_path\";\n";
 
 
	my %all_param=soc_get_all_parameters($soc);
	my @order= soc_get_all_parameters_order($soc);		
 
 
 
	#replace global parameters
	my @list=sort keys%{$params_ref};
	foreach my $p (@list){
		 my %hash=%{$params_ref}; 
		 $all_param{$p}= $hash{$p};
	}
 
	foreach my $p (@order){
		add_text_to_string(\$params_v,"\tlocalparam  $p = $all_param{$p};\n") if(defined $all_param{$p} );			
	}
 
 
	$top_io_short_all=(defined $top_io_short_all)? "$top_io_short_all,\n$src_io_short_all" : $src_io_short_all;
	$top_io_full_all=$top_io_full_all."\n$src_io_full_all";            
  #  $top_io_pass_all=$top_io_pass_all.",\n$clk_assigned_port";	
 
	my $has_ni =check_for_ni($soc);
    my $import = ($has_ni)? "\n\t`NOC_CONF\n" : ""; 
 
	my $verilator_v =  "
/*********************
		${name}
*********************/
 
module ${name}  (\n $top_io_short_all\n);\n  $import \n";
	my $ins= gen_soc_instance_v_no_modfy($soc,$soc_name,$param_pass_v_all);
$verilator_v.="
$functions_all	
/* verilator lint_off WIDTH */
$params_v
/* verilator lint_on WIDTH */
$top_io_full_all
$ins
";
	my ($readme,$prog)=gen_system_info($soc,$param_as_in_v_all); 
	return ($verilator_v);
 
 
}	
 
 
sub get_golal_param_v{
	my $project_dir	  = get_project_dir(); #mpsoc dir addr
	my $paths_file= "$project_dir/mpsoc/perl_gui/lib/glob_params";
	my $paramv='';
	if (-f 	$paths_file ){
		my $self= do $paths_file;
		my @parameters = object_get_attribute_order($self,'Parameters');
		foreach my $p (@parameters) {
			my $v =object_get_attribute($self,'Parameters',$p);
			$paramv.="\t localparam  $p = $v;\n" if(defined $v);	
		}
	}
	return $paramv;
}
 
 
 
 
1;
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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