问题描述:
只能从仿真左边的框框里一个一个的拖出来,一共有128位。如何把这多个bits同时引出来?
modelsim做时序仿真,顶层文件 tdc_carry_chain.v 下面有一个module 叫 unsigned_adder.v 其中又例化了一个加法器ip核。
由于 unsigned_adder 的输出还加了一级 128 bits 的D触发器,仿真的时候,想看 unsigned_adder 的中间信号,就是加法器之后,触发器之前的信号,但是在 时序仿真左边的 sim 和 objects 栏目中都找不到。于是按照网上网友说的3种操作如下:
上面有三种操作,其中按照操作1设置后,可以在 sim 和 objects 栏目中看到需要观察的中间信号了。但是只能一个一个拖到右边的Wave栏目中去,因为有128位,并不方便。而且,难不成每一次仿真的时候都需要拖128遍?想想就已经崩溃了。
所以,势必需要找一个办法,同时添加128位中间信号。网友的操作2经证实,只能在逻辑仿真中用。大概原因是:因为testbench并不知道时序仿真会综合出什么样子的中间信号
这时候,我们观察到,每次拖动一个信号到右边的wave框框中的时候,下面对应的也会产生一句脚本文件。
那么,只需要把要观察的128个中间信号写在脚本里,一次性执行就好啦。
那么这个脚本在哪里呢?经过百度我知道了,时序仿真(gate)和逻辑仿真(RTL)本身就是执行的一个脚本,是自动帮我们生成的 *.do 文件,在工程文件的 simulation 文件夹下的 modelsim 文件夹里面:
联合仿真刚结束的时候,可以下面的 transcript 栏目里按键盘的 上(↑)键,就可以看出,我们进行联合仿真的时候,就是自动帮我们运行了这个do脚本文件。我们在modelsim 文件夹可以看到两个do文件,分别就是时序仿真和逻辑仿真。我们先复制一个进行时序仿真(gate)的do文件,命名成mydo.do。这里这个文件可以随便叫。
之后,我们拖了一个要添加的中间信号到右边的wave栏目里面,然后复制了下面对应生成的脚本语句,在excel里面拖成了我们需要的128位。
然后复制到记事本中,先复制一下方括号边上的一个tab,然后Ctrl+H 调出替换,点“全部替换”替换掉所有tab为没有字符。
不替换掉用excel拖而生成的tab,modelsim是会报错的!!!
替换好了后,插入到我们刚复制的 mydo.do 文件中,加在 add wave * 这一行语句的下面。
然而(鹅鹅鹅),报错,并没有出来我们想要的波形:
上图已经是我修改了很多次语句之后,还出现报错的情况了,按照我们刚才加的语句,第一句是 [127] 所以报错是
# invalid command name "127" (如下图)
(上图描述:两个信号手动都能拖过去,语句也都是我拖过去后自己在下面生成的,但是,有一个语句我执行可以,另一个就不行了。)
经过查询,这个do文件使用的是tcl脚本语言编写的,其他信号拖去wave生成的指令,可以正常执行,而我需要观察的这个中间信号,拖到右边wave生成的tcl语句,就不能正常执行。
因此我猜测,可能是我觉得可能是方括号,或者反斜杠的问题。
于是我向一个弄fpga的同学提出来疑问:
“modelsim仿真,.do文件,tcl指令含有方括号的,就报错。不含有的就不会。不知道是不是我语言使用上有问题。”
大佬说他没怎么用过tcl语言,不过推荐我去看modelsim的userguide
这个modelsim的userguide 在哪里呢?大佬说,就在modelsim的安装目录下:
我就屁颠屁颠的跑去看了,果然,原来右边的方括号是tcl命令的结束符,我的新号中有“]”所以前面也要加反斜杠转译,加了就好了。很切中要害,Syntax的 第一条就解决了我的问题。
我修改了mydo.do文件如下:
大家要注意,反斜杠 和 括号,都需要转译。而我这里还加了双引号。事实证明,可加可不加,都行。
加完后,在最下面 运行 do mydo.do 即可重新运行仿真,很愉快地,128位信号一次性都出现了。
这里补充一下,当输入transcript时候上方出现了提示框的时候,可以用tab补全,和linux下terminal的操作一样。
至此,我已经成功的用脚本,在modelsim时序仿真一次性添加多位(128bits)中间信号并查看。