forked from tanchou/Verilog
struct
This commit is contained in:
@@ -0,0 +1,20 @@
|
||||
puts "Starting TCL script"
|
||||
#set path test1b_tb
|
||||
#gtkwave::forceOpenTreeNode $path
|
||||
set nfacs [ gtkwave::getNumFacs ]
|
||||
puts "There are $nfacs signals"
|
||||
set l [list]
|
||||
|
||||
for {set i 0} {$i < $nfacs } {incr i} {
|
||||
set facname [ gtkwave::getFacName $i ]
|
||||
set numdots [ expr {[llength [split $facname .]] - 1}]
|
||||
# puts "$numdots"
|
||||
if {$numdots == 1} {
|
||||
lappend l "$facname"
|
||||
puts "Added signal $facname"
|
||||
}
|
||||
}
|
||||
|
||||
set num_added [ gtkwave::addSignalsFromList $l ]
|
||||
gtkwave::setZoomRangeTimes [ gtkwave::getMinTime ] [ gtkwave::getMaxTime ]
|
||||
puts "Start time [ gtkwave::getMinTime ] end time: [ gtkwave::getMaxTime ]"
|
176
Help/presentation_examples/counter/scripts/project.tcl
Normal file
176
Help/presentation_examples/counter/scripts/project.tcl
Normal file
@@ -0,0 +1,176 @@
|
||||
# Tcl launcher script for the project
|
||||
namespace eval project_launcher {
|
||||
|
||||
# Help information for this script
|
||||
proc print_help {} {
|
||||
variable script_file "project.tcl"
|
||||
puts "\nDescription:"
|
||||
puts "Perform actions related to this project.\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, sim, verify, test, view\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 do_clean { root_dir } {
|
||||
variable dir "$root_dir/runs"
|
||||
|
||||
puts "Cleaning all files in directory $dir...\n"
|
||||
|
||||
# Checking if the folder is empty to avoid error
|
||||
if {[catch { glob "$dir/*" } result] != 1} {
|
||||
file delete -force -- {*}[glob "$dir/*" ]
|
||||
}
|
||||
}
|
||||
|
||||
proc do_sim_icarus { root_dir verbose } {
|
||||
|
||||
# Checking if the folder is empty to avoid error
|
||||
if {[file exists "$root_dir/scripts/run_iverilog.tcl"] == 1} {
|
||||
#global root_dir_loc $root_dir
|
||||
#source $root_dir/scripts/run_iverilog.tcl
|
||||
try {
|
||||
set results [exec tclsh $root_dir/scripts/run_iverilog.tcl $root_dir ]
|
||||
set status 0
|
||||
} trap CHILDSTATUS {results options} {
|
||||
set status [lindex [dict get $options -errorcode] 2]
|
||||
}
|
||||
|
||||
if {$status != 0} {
|
||||
puts "Problem running the script :"
|
||||
puts $results
|
||||
return
|
||||
}
|
||||
|
||||
if {[expr $verbose]} {
|
||||
# output the result of the execution
|
||||
puts $results
|
||||
}
|
||||
|
||||
} else {
|
||||
puts "The script run_iverilog.tcl does not exist in $root_dir/scripts"
|
||||
}
|
||||
}
|
||||
|
||||
proc do_sim_pytest { root_dir verbose } {
|
||||
|
||||
exec pytest $root_dir/tests/ >@stdout 2>@stderr
|
||||
}
|
||||
|
||||
proc do_formal { root_dir } {
|
||||
# We suppose that the sby file is meant to be run from the inside of the folder
|
||||
# hence we cd there
|
||||
if {[file pathtype $root_dir] != "absolute"} {
|
||||
set root_dir "../$root_dir"
|
||||
}
|
||||
#set root_dir [file normalize $root_dir]
|
||||
cd verification
|
||||
#variable fname [glob -nocomplain $root_dir/verification/*.sby]
|
||||
variable fname [glob -nocomplain *.sby]
|
||||
|
||||
if {[llength $fname]} {
|
||||
set fname [lindex $fname 0]
|
||||
puts "Using $fname file..."
|
||||
exec sby -f $fname --prefix $root_dir/runs/verification/counter >@stdout 2>@stderr
|
||||
} else {
|
||||
puts "There are no .sby files present..."
|
||||
cd ..
|
||||
return
|
||||
}
|
||||
cd ..
|
||||
}
|
||||
|
||||
proc do_view { root_dir } {
|
||||
|
||||
# Checking if the folder is empty to avoid error
|
||||
if {[file exists "$root_dir/scripts/run_gtkwave.tcl"] == 1} {
|
||||
try {
|
||||
set results [exec tclsh $root_dir/scripts/run_gtkwave.tcl $root_dir ]
|
||||
set status 0
|
||||
} trap CHILDSTATUS {results options} {
|
||||
set status [lindex [dict get $options -errorcode] 2]
|
||||
}
|
||||
|
||||
if {$status != 0} {
|
||||
puts "Problem running the script :"
|
||||
puts $results
|
||||
return
|
||||
}
|
||||
|
||||
} else {
|
||||
puts "The script run_gtkwave.tcl does not exist in $root_dir/scripts"
|
||||
}
|
||||
}
|
||||
|
||||
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 "."
|
||||
|
||||
# Use origin directory path location variable, if specified in the tcl shell
|
||||
if { [info exists ::root_dir_loc] } {
|
||||
set root_dir $::root_dir_loc
|
||||
}
|
||||
|
||||
variable action "help"
|
||||
|
||||
variable verbose false
|
||||
|
||||
if { $::argc > 0 } {
|
||||
for {set i 0} {$i < $::argc} {incr i} {
|
||||
set option [string trim [lindex $::argv $i]]
|
||||
switch -regexp -- $option {
|
||||
"--root" { incr i; set root_dir [lindex $::argv $i] }
|
||||
"--help" { print_help }
|
||||
"help" { print_help }
|
||||
"clean" { set action "clean" }
|
||||
"sim" {incr i; set action "sim_[lindex $::argv $i]" }
|
||||
"--verbose" { set verbose true }
|
||||
"-v" { set verbose true }
|
||||
{pytest|cocotb|test} {set action "pytest"}
|
||||
{formal|verify|verification} {set action "formal"}
|
||||
{view} {set action "view"}
|
||||
default {
|
||||
if { [regexp {^-} $option] } {
|
||||
puts "ERROR: Unknown option '$option' specified, please type '$script_file -tclargs --help' for usage info.\n"
|
||||
return 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
print_help
|
||||
}
|
||||
|
||||
puts "Script started. The root dir is $root_dir. The action is: $action\n"
|
||||
|
||||
switch -regexp -- $action {
|
||||
"clean" { do_clean $root_dir }
|
||||
{sim_icarus|^sim_$|sim_iverilog} { do_sim_icarus $root_dir $verbose}
|
||||
{sim_cocotb|pytest} { do_sim_pytest $root_dir $verbose}
|
||||
"formal" { do_formal $root_dir}
|
||||
"view" {do_view $root_dir}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
main
|
||||
|
||||
}
|
88
Help/presentation_examples/counter/scripts/run_gtkwave.tcl
Normal file
88
Help/presentation_examples/counter/scripts/run_gtkwave.tcl
Normal file
@@ -0,0 +1,88 @@
|
||||
# Tcl script for iverilog simulation
|
||||
namespace eval gtkwave {
|
||||
|
||||
|
||||
# Help information for this script
|
||||
proc print_help {} {
|
||||
variable script_file "run_gtkwave.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 gtkwave. 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 view_file $root/runs/sim/iverilog/counter_tb.vcd
|
||||
|
||||
variable gtkwave_script $root/scripts/gtk_wave_all_signals.tcl
|
||||
|
||||
proc run_view {res} {
|
||||
set name [file rootname $res]
|
||||
|
||||
# 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"
|
||||
#set gtkwave_args "-S $gtkwave::gtkwave_script $gtkwave::view_file"
|
||||
set gtkwave_args "$gtkwave::view_file"
|
||||
|
||||
#puts $gtkwave_args
|
||||
try {
|
||||
set results [exec gtkwave {*}$gtkwave_args]
|
||||
set status 0
|
||||
} trap CHILDSTATUS {results options} {
|
||||
set status [lindex [dict get $options -errorcode] 2]
|
||||
}
|
||||
|
||||
if {$status != 0} {
|
||||
puts "Problem running gtkwave :"
|
||||
puts $results
|
||||
return
|
||||
}
|
||||
|
||||
# output iverilog result
|
||||
puts $results
|
||||
|
||||
|
||||
}
|
||||
|
||||
run_view $root_dir
|
||||
|
||||
exit 0
|
||||
}
|
||||
|
||||
# run main
|
||||
|
||||
main
|
||||
|
||||
}
|
133
Help/presentation_examples/counter/scripts/run_iverilog.tcl
Normal file
133
Help/presentation_examples/counter/scripts/run_iverilog.tcl
Normal file
@@ -0,0 +1,133 @@
|
||||
# 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 {counter.v}
|
||||
|
||||
variable tb_path $root/tests/verilog
|
||||
|
||||
variable test_benches {counter_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
|
||||
|
||||
}
|
Reference in New Issue
Block a user