我正在尝试为我的解码器模块编写一个tcl脚本(在modelsim中的verilog) 我需要将'din'输入值从000循环到111 那是我现在想出来的。
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 :(得分:2)
使用Tcl,您不会增加二进制数字。您将数字格式化为二进制。在8.6之前,您使用binary format
和binary 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
答案 1 :(得分: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]
}
或者Donal指出
set l { "000" "001" "010" "011" "100" "101" "110" "111"}
foreach i $l {
puts $i
}