====== Using TCL for Fame and Fortune ====== If you hate to type repetitive TCL commands to exercise your design, here are some ideas. It turns out TCL is a full-featured programming language (even if it is verbose and perhaps clunky). But, once you find some examples to cannibalize, it can be pretty easy to create very compact simulation scripts. ====Using Looping to Exercise All Combinations of 1's and 0's==== The following code sample shows how to loop across all combinations of 4-bits (from 0000 to 1111). Note that when you set a variable name you just state it but when you want to get at the value stored in that variable you must prefix it with a $ sign. Note also that you call functions using [functionName ... ] syntax. In this case, "expr" evaluates an arithmetic expression. set i 0 while {$i < 16} { set a [expr ($i >> 3) & 1] set b [expr ($i >> 2) & 1] set c [expr ($i >> 1) & 1] set d [expr ($i >> 0) & 1] puts "Test this combination: $a $b $c $d" add_force mySignal3 $a add_force mySignal2 $b add_force mySignal1 $c add_force mySignal0 $d run 100ns incr i } Or, it could be much simpler: set i 0 while {$i < 16} { add_force mySignal3 [expr ($i >> 3) & 1] add_force mySignal2 [expr ($i >> 2) & 1] add_force mySignal1 [expr ($i >> 1) & 1] add_force mySignal0 [expr ($i >> 0) & 1] run 100ns incr i } Or, if what you are forcing is itself a 4-bit quantity, it requires a function to be defined first to do the integer to binary conversion: proc dec2bin i { #returns a string, e.g. dec2bin 12 => 1100 set res {} while {$i>0} { set res [expr {$i%2}]$res set i [expr {$i/2}] } if {$res == {}} {set res 0} return $res } set i 0 while {$i < 16} { add_force a [dec2bin $i] run 10ns incr i } And, if you prefer for-loops: for {set i 0} {$i < 16} {incr i} { add_force mySignal [dec2bin $i] run 100ns incr i }