forked from tanchou/Verilog
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Tcl
		
	
	
	
	
	
| # Tcl script for iverilog simulation
 | |
| namespace eval sim_iverilog {
 | |
| 
 | |
| 
 | |
|   # Help information for this script
 | |
|   proc print_help {} {
 | |
|     variable script_file "run_iverilog.tcl"
 | |
|     puts "\nDescription:"
 | |
|     puts "Runs the iverilog simulation.\n"
 | |
|     puts "Syntax:"
 | |
|     puts "$script_file"
 | |
|     puts "$script_file \[action\] \[args\]"
 | |
|     puts "Usage:"
 | |
|     puts "Name                   Description"
 | |
|     puts "-------------------------------------------------------------------------"
 | |
|     puts "\[action\]             Determine the action to be performed. Default value: help\n"
 | |
|     puts "                       Current actions: help, clean\n"
 | |
|     puts "\[args\]               Arguments related to the action.\n"
 | |
|     puts "                       --root <dir> changes the root reference for the project.\n"
 | |
|     puts "-------------------------------------------------------------------------\n"
 | |
|     exit 0
 | |
|   }
 | |
| 
 | |
| 
 | |
|   proc main {} {
 | |
| 
 | |
|     variable root_dir
 | |
|     # Set the reference directory to where the script is
 | |
|     #set root_dir [file dirname [info script]]
 | |
| 
 | |
|     # Set the reference directory for source file relative paths (by default the value is script directory path)
 | |
|     set root_dir "."
 | |
| 
 | |
|     if { [info exists ::root_dir_loc] } {
 | |
|       set root_dir $::root_dir_loc
 | |
|     }
 | |
| 
 | |
|     if { $::argc > 0 } {
 | |
|       set root_dir [lindex $::argv 0]
 | |
|     }
 | |
| 
 | |
|     puts "Starting simulation using iverilog. The root dir is: $root_dir"
 | |
| 
 | |
|     #   variable root [file dirname [file normalize [info script]]]
 | |
|     #   variable root [file dirname [file dirname [info script]]]
 | |
|     variable root $root_dir
 | |
| 
 | |
|     variable source_path $root/src/verilog
 | |
| 
 | |
|     variable sources {blink.v}
 | |
| 
 | |
|     variable tb_path $root/tests/verilog
 | |
| 
 | |
|     variable test_benches {blink_tb.v}
 | |
| 
 | |
|     proc append_path {root list} {
 | |
|       set l {}
 | |
|       foreach f $list {
 | |
|         lappend l $root/$f
 | |
|       }
 | |
|       return $l
 | |
|     }
 | |
| 
 | |
|     variable sources_full_path [append_path $source_path $sources]
 | |
|     variable tb_full_path [append_path $tb_path $test_benches]
 | |
| 
 | |
|     variable output_dir $root/runs/sim/iverilog
 | |
| 
 | |
|     variable additional_options "-D VCD_DUMP"
 | |
| 
 | |
|     proc run_sim {tb} {
 | |
|       set name [file rootname $tb]
 | |
|       puts "Running test bench $name"
 | |
| 
 | |
|       puts "Cleaning files..."
 | |
| 
 | |
|       #    file delete [glob -nocomplain $sim_iverilog::output_dir/*]
 | |
| 
 | |
|       puts "Recreating path..."
 | |
| 
 | |
|       file mkdir $sim_iverilog::output_dir
 | |
| 
 | |
|       set iverilog_args "$sim_iverilog::additional_options -g2012 -Wall -I $sim_iverilog::source_path -Y .sv -y $sim_iverilog::source_path -o $sim_iverilog::output_dir/$name.vvp $sim_iverilog::tb_path/$tb $sim_iverilog::sources_full_path"
 | |
| 
 | |
| 
 | |
|       try {
 | |
|         set results [exec iverilog {*}$iverilog_args]
 | |
|         set status 0
 | |
|       } trap CHILDSTATUS {results options} {
 | |
|         set status [lindex [dict get $options -errorcode] 2]
 | |
|       }
 | |
| 
 | |
|       if {$status != 0} {
 | |
|         puts "Problem running iverilog :"
 | |
|         puts $results
 | |
|         return
 | |
|       }
 | |
| 
 | |
|       # output iverilog result
 | |
|       puts $results
 | |
| 
 | |
|       set cwd [pwd]
 | |
| 
 | |
|       puts "Running vvp..."
 | |
| 
 | |
|       set vvp_cmd "vvp $name.vvp -lxt2"
 | |
| 
 | |
|       cd $sim_iverilog::output_dir
 | |
| 
 | |
|       #puts [pwd]
 | |
|       set results [exec {*}$vvp_cmd]
 | |
| 
 | |
|       # output vvp result
 | |
|       puts $results
 | |
| 
 | |
|       cd $cwd
 | |
| 
 | |
|       puts "All done..."
 | |
| 
 | |
|     }
 | |
| 
 | |
|     foreach tb $test_benches {
 | |
|       run_sim $tb
 | |
|     }
 | |
| 
 | |
|     exit 0
 | |
|   }
 | |
| 
 | |
|   # run main
 | |
| 
 | |
|   main
 | |
| 
 | |
| } |