在第一章中,两种的编译方法各有好有坏,正是青菜萝卜的问题。第一种方法莫过是懒人的方法(笔者最喜欢),但是这个方法有一个缺点,就是Quartus II只是帮你把仿真对象 .v 和激励文件 .vt 通通“编译一次”而已。
这话要怎么说呢?打个比方,假设读者在第一次的仿真动作中,觉得仿真输出不满意,结果读者修改了激励文件。那么,如果按照“自动编译”的方式来运行,读者需要关闭ModelsimAltera,然后重新在Quartus II中调用 ModelsimAltera。
先看看演示视频吧:
http://www.swfcabin.com/open/1304922869
在演示视频中,激励文件的步骤0的被乘数和乘数还未被修改的时候,笔者先从Quartus II调用ModelsimAltera来启动仿真。当笔者修改激励文件中步骤0的被乘数和乘数(从之前的 10 * 2 变成 5 * 8 )这时候笔者不得不手动关闭 ModelsimAltera。为了是两个目的,第一是要劳烦Quartus II 重新帮我们编译文件,第二是系统报错的问题。
如果读者没有把ModelsimAltera手动关闭,然后再一次从Quartus II 启动 ModelsimAltera的话,系统就会报错(同一个时间是无法存在两个ModelsimAltera)。就此而知,我们知道手动关闭 ModelsimAltera是必须的,无论出于什么目的。
这种方法无论怎么简单,多少都很别扭 ....... 因为每一次修改 仿真对象或者激励文件,我们不得不再一次关闭 ModelsimAltera。唉 ~ 所到底,真的很别扭,但是笔者却十分钟爱它, 原因很简单,笔者可以省去许多手动操作的麻烦工作。不是所有人都和笔者一样懒,为了解决这个问题,我们必须把第一章中的两种编译方法整合整合起来。
这话要怎么说呢?很简单呀,第一次打开仿真就用“自动编译”的方法,当仿真对象或者激励文件被修改以后,再使用“手动编译”的办法。呵呵,是不是被笔者搞糊涂了?我们来看演示视频吧:
http://www.swfcabin.com/open/1304923033
演示视频已经把过程表达得很清楚,笔者还是简单的分析一下。
首先笔者还是一如既往那样,先从Quartus II调用 ModelsimAltera,早期在激励文件中步骤0是 10 * 2,然后笔者修改了其中的 10 * 2 成为 5 *10。但是笔者没有执行和第一演示视频的动作,就是先关闭 ModelsimAltera再从 Quartus II 中启动。反之,笔者是引入手动编译的想法,笔者重新编译被修改的激励文件 .vt ,然后手动重新启动仿真和添加wave,最后再手动配置仿真用的最大时间。
第二演示视频的过程中可能会给读者留下一个“在重新启动仿真的时候为什么选择 "work" 这个"库" ”这一问题?那么,这个“库”到底是什么概念?在这里,我们先抛开手动编译不谈,我们来谈谈自动编译被隐藏的过程。
“库”和“仿真用的库”是有区别的。“仿真用的库”是编译时所使用的词典。换句话说就是,当某个仿真对象和激励文件想在Modelsim的环境中工作,普通下 Modelsim是不认识仿真对象和激励文件,所以Modelsim需要经过“编译”这一过程,把它们“转换”为仿真用的元素。在编译的过程中,编译器需要“参考仿真用的库”(有一点C语言库的感觉)。反之“库”是记录了仿真对象和激励文件“编译过后的结果”(亦即仿真元素)。
当从 Quartus II 中调用 ModelsimAltera,Quartus I I 会自动在项目的目录下建立“./simulation/modelsim”这个仿真项目(和手动编译中类似)。此外 Quartus II 也会自动为这个仿真项目建立名为 “work”的库。编译后的仿真对象和激励文件都保存在这里(仿真元素)。
在第二个演示视频中,当笔者经过 Quartus II调用 ModelsimAltera的时候,这个名为“work”的库已经建立完毕。一旦我们重新修改激励文件,我们用不着重新建立这个“库”。当然呢,我们可以直接更新在这个“库”中激励文件的信息。第二演示视频就是包含这个内容。
其先,笔者借用Quartus II自动编译,自动建立仿真项目和库。当激励文件被修改以后,笔者再以手动编译更新这个“库”中的激励文件信息。最后如同手动编译一样,添加输出wave和配置最大仿真时间等 ......
同样的道理也可以用在更新“库”中的仿真对象。但是笔者不怎么建议这样做,当仿真对象被修改,还是先经过Quartus II的“综合和编译”来确保仿真对象的正确性以后再来仿真,以达到保险的效果。
好了,这一章就先谈到这里吧 ,读者先给自己的大脑消化消化吧 ... (*^__^*)
文章评论(0条评论)
登录后参与讨论