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