2012-05-19 31 views
2

我想为我的解码器模块编写一个tcl脚本(modelsim中的verilog) 我需要将'din'输入值从000循环到111
这就是我现在想到的。Tcl二进制循环。二进制增量

vsim work.decode_shift 
add wave -noupdate -format Logic -radix binary /decode_shift/din 
add wave -noupdate -format Logic -radix binary /decode_shift/dout 
for { set i 0 } { $i==0111 } { incr i } { 
    force din $i 
    run 100 
} 
run @500ns 

它不起作用,因为我不知道如何绕过一些类型的问题。我在做什么错,什么是在tcl中增加二进制数字的正确方法?

+0

是不是只是从0到7的循环?如果你需要把它变成二进制字符串,你可以使用格式。 – Julian

+0

是的,以十进制表示。但我如何分配一个小数到二进制din? – user1405165

+0

当我到达'2'时,我得到“错误:(vsim-4011)无效的力值:2”。 – user1405165

回答

0

不知道这是否会帮助你http://codepad.org/YX4nfMIS(转载如下)它使用二进制表示字符串的升序列表。但这可能不是Verilog想要你的数据的方式。

set l { "000" "001" "010" "011" "100" "101" "110" "111"} 
for { set i 0} { $i<8 } { incr i } { 
puts [lindex $l $i] 
} 

或者正如多纳尔指出

set l { "000" "001" "010" "011" "100" "101" "110" "111"} 
foreach i $l { 
    puts $i 
} 
+0

在这种情况下,最好使用'foreach';我喜欢'foreach'很多... –

+0

我也喜欢这个简单的B/C,如果你想改成灰色代码,这很容易。 –

2

与TCL,你不增加二进制数字。您将数字格式设置为二进制。在此之前8.6,您使用的binary formatbinary scan组合来进行转换,如下:

vsim work.decode_shift 
add wave -noupdate -format Logic -radix binary /decode_shift/din 
add wave -noupdate -format Logic -radix binary /decode_shift/dout 
for { set i 0 } { $i<=7 } { incr i } {  # Need non-binary literal 
    # Convert to 8 binary digits, store result in “i_bin” variable 
    binary scan [binary format c $i] B8 i_bin 

    force din $i_bin; # Assume takes 8 bits; [string range] to trim otherwise 
    run 100 
} 
run @500ns 

如果你有8.6,你可以这样做,而不是:

vsim work.decode_shift 
add wave -noupdate -format Logic -radix binary /decode_shift/din 
add wave -noupdate -format Logic -radix binary /decode_shift/dout 
for { set i 0 } { $i<=0b111 } { incr i } { # Binary literal... 
    force din [format %04b $i]; # width 4 field, zero padded on left 
    run 100 
} 
run @500ns