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
|
||
|
|
||
|
}
|