⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 run_modelsim09.do

📁 Clock generation perl to vhdl oijoij
💻 DO
字号:
# Modelsim tcl script for running testbench for fracn09.pl# The command line is "do run_modelsim09.do" (from within Modelsim)# The results are in the file fracn.log## Define test parametersset iterations 1000;set fin 1e6;set fout 32768;set tolerance 1e-7;set run_time 100ms;   ;# the run time should be at least (1/tolerance) * (1/fin)set use_phase_accumulator FALSE;set use_recursive_controller TRUE;set minimum_jitter TRUE;set improve_duty_cycle FALSE;set integer_fout TRUE;set use_modelsim TRUE;set use_verilog FALSE;set fout_sweep_step  7.50e3;set fout_sweep_start $fout_sweep_step;set fout_sweep_stop  $fin;# override test parameters from environmentif { [info exists env(iterations) ]} { set iterations $env(iterations) }if { [info exists env(fin)        ]} { set fin        $env(fin)        }if { [info exists env(fout)       ]} { set fout       $env(fout)       }if { [info exists env(tolerance)  ]} { set tolerance  $env(tolerance)  }if { [info exists env(run_time)   ]} { set run_time   $env(run_time)   }if { [info exists env(use_phase_accumulator)    ]} { set use_phase_accumulator $env(use_phase_accumulator) }if { [info exists env(use_recursive_controller) ]} { set use_recursive_controller $env(use_recursive_controller) }if { [info exists env(minimum_jitter)           ]} { set minimum_jitter $env(minimum_jitter) }if { [info exists env(improve_duty_cycle)       ]} { set improve_duty_cycle $env(improve_duty_cycle) }if { [info exists env(integer_fout)             ]} { set integer_fout $env(integer_fout) }if { [info exists env(use_modelsim)             ]} { set use_modelsim $env(use_modelsim) }if { [info exists env(use_verilog)              ]} { set use_modelsim $env(use_verilog) }if {$minimum_jitter} {set goption "-x"} else {set goption "-g"}if {$use_phase_accumulator} {set goption "-g"}if {$use_recursive_controller} {set goption "-g"}set coption "-x";set coption "-c";set soption "-x";#set soption "-s";if {$use_verilog} {set target "fracn.v"} else {set target "fracn.vhd"}proc generate {} {    global soption;    global coption;    global goption;    global tolerance;    global fin;    global fout;    exec perl -w fracn09.pl $soption $coption $goption -t $tolerance $fin $fout;}proc compile {file} {    global use_modelsim;    #puts $file; flush stdout;    if {[string match "*.vhd" $file]} {        # VHDL        if {$use_modelsim} {            vcom -93 -quiet -nologo -work work $file;        } else {            exec vhdlp -s -strict -work work $file;        }    } else {        # assume Verilog        if {$use_modelsim} {            vlog -quiet -nologo -work work $file;        } else {            puts "Can't compile $file";        }    }}proc simulate {} {    global use_modelsim;    global run_time;    global fin;    global fout;    global minimum_jitter;    global use_phase_accumulator;    global use_recursive_controller;    global improve_duty_cycle;    if {$use_modelsim} {        vsim -quiet -t fs -gfin=$fin -gfout=$fout -gminimum_jitter=$minimum_jitter -guse_phase_accumulator=$use_phase_accumulator -guse_recursive_controller=$use_recursive_controller -gimprove_duty_cycle=$improve_duty_cycle -gtime_of_report=$run_time tb_fracn09;        run $run_time;    } else {        exec vhdle -s -p -gfin=$fin -gfout=$fout -gminimum_jitter=$minimum_jitter -guse_phase_accumulator=$use_phase_accumulator -guse_recursive_controller=$use_recursive_controller -gimprove_duty_cycle=$improve_duty_cycle -gtime_of_report=$run_time -t $run_time tb_fracn09;    }}# Generate code, and compile# (need to do this first, because otherwise there will be no default binding#  for fracn.)generate;if {$use_modelsim} {catch {exec vlib work}}compile $targetcompile tb_fracn09.vhdset freq_index 0# special set of bad test frequencies.set freq_list {        032768        500000        285000        222000        181000        153000        133000        118000        105000        095000        032768        333333.33333333333        250000        200000        166666.66666666667        142857.14285714286        125000        111111.11111111111        666666.66666666667        750000.0        800000        600000        395000        399900        400000        400100        405000        375000        625000        875000        62500        31250        15625        7812.5        3906.25        1953.125        1e6        1e5        1e4        1e3        1e2        1e1        1e0        1.e-1        1.e-2        611112        999900.0        999990.0        499900.0        499999.0        500001.0};#        999999.99#        999999.999#        500000.01#        499999.99#        999999.0#        500000.1#        499999.9#        999999.9# Declare function for working out fout values.# The first values come from freq_list - a table of carefully selected# bad case ratios, and the subsequent values are randomly generated.proc get_fout {} {    global fin;    global integer_fout;    global freq_index;    global freq_list;    global fout_sweep_start;    global fout_sweep_stop;    global fout_sweep_step;    if {$freq_index < [llength $freq_list]} {        # phase1 - get values from list        set fout [lindex $freq_list $freq_index];        incr freq_index;    } elseif {$fout_sweep_start <= $fout_sweep_stop} {        # phase2 - linear sweep        set fout $fout_sweep_start;        set fout_sweep_start [expr $fout_sweep_start + $fout_sweep_step ];    } else {        # phase3 - random        set fout [expr rand() * $fin ];        if {$integer_fout} then {            set fout [expr int($fout)];            set fout [expr $fout > 0 ? $fout : 1 ];        }    }    return $fout;}proc trim_time {t} {    # turn the execution time into a number of ms    return [expr [string trim $t "microseconds per iteration"] / 1000 ];}# now run repetitive testsset logfile [open fracn.log w]puts $logfile "fin=$fin tolerance=$tolerance use_phase_accumulator=$use_phase_accumulator use_recursive_controller=$use_recursive_controller minimum_jitter=$minimum_jitter improve_duty_cycle=$improve_duty_cycle run_time=$run_time"puts $logfile "use_modelsim=$use_modelsim use_verilog=$use_verilog"puts $logfile "fout\tfout measured\trelative error\tjitter\tmn/av/mx duty %\tperl time\tcomp time\tsim time";for {set x 1} {$x <= $iterations} {incr x} {    set fout [ get_fout ];    puts "******************  test number $x: $fin $fout"; flush stdout;    puts -nonewline $logfile "$fout"; flush $logfile;    set time1 [trim_time [time {generate } ] ];    set time2 [trim_time [time {compile $target } ] ];    if {$use_modelsim && $use_verilog} {compile tb_fracn09.vhd}    set time3 [trim_time [time {simulate} ] ];    set tmpfile [open fracn.rpt r];    gets $tmpfile line;    close $tmpfile;    if { [string length $line] == 0} { set line "no results\t\t\t" };    puts $logfile "\t$line\t$time1\t$time2\t$time3";    puts "$line\t[expr $time1 + $time2 + $time3]";}close $logfile;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -