FPGA那些事儿 Modelsim仿真技巧REV6.0.pdf
第四章激励文本就是仿真环境.… 134 41验证语言是什么? .134 4.2验证语言与时序表现① 145 4.3验证语言的时序表现②…154 44激励文本的布局. 165 se! ladder funcmod.v……,…,…,…,…,…,…,…,…,…….………167 selfadder funcmod.wt…… 169 45仿真模型与反馈输出① 175 hello funcmod V…… …179 hello funcmod simulation.t.…,…,…,……………,181 4.6仿真模型与反馈输出②…… 186 hello funcmo.y,,,,…,…, 187 hello fincmod simulation.t…… ·· .188 hello funcmod simulation.ut.…………………,192 总结 第五章仿真就是人生. 98 51单向仿真与多向仿真 198 exp 20 simulation. vt 200 exp2 7 simulatior.vt………,…,…,…,…,…,…,…,…,…,…,…,…,……,……,.203 5.2仿真的变数——时钟用量. 209 exp22 simulationvt ……………………213 53仿真的变数—信号数量与信号方向 215 54理想变数与物理变数 221 55仿真的必然—特定条件 228 eyp23 simulation.wt………… 230 ex24 simulation.wt……… 232 exp25 simulation.wt….,… 239 56仿真迷宫① 244 57仿真迷宫② 垂,,看垂垂自。.非垂垂 250 58主动思想 257 总结 266 第六章结束就是开始. .268 61不可仿真对象 268 6.2超烦模块与不等比例缩放 272 exp26 simulationvt 272 exp27 simulation vt 275 28 simulation,ut 277 63不可仿真对象——超乱模块① 279 ran.V 280 exp30 simulation vt 283 64不可仿真对象——超乱模块② .289 eyp3 I simulation.,wt……,…,…,…,…,…,…,…,…,…,…………,291 exp 32 simulation.vt .296 65主动设计① 301 ra. v 302 spi funcmod.y.….….….….…….….….….………….…….……………303 spi finca.yt,,.,,…,…, 305 ctrlmod v 307 exp33 simulationvt 309 66主动设计② .313 F.v., 313 spi funcmodv 314 spi funcmod vt 17 ctrlmod v 319 exp34 simulation vt ,321 67仿真的决意 ·:::···.:·······: 326 329 后语 330 前言 笔者一直以来都在纠结,自己是否要为仿真编辑相关的教程呢?一般而言, Modelsim等 价仿真已经成为大众的常识,但是学习仿真是否学习 Modelsim,笔者则是一直保持保 留的态度。笔者认为,仿真是 Modelsim,但是 Modelsim不是仿真,严格来讲 Modelsim 只是仿真所需的工具而已,又或者说 Modelsim只是学习仿真的—部小插曲而已。除此 之外,笔者也认为仿真可以是验证语言,但是验证语言却不是仿真,因为验证语言只是 仿真的一小部分而已,事实上仿真也不一定需要验证语言。 常规告诉笔者,仿真一定要学习 Modelsin还有验证语言,亦即 Modelsim除了学习操作 软件以外,我们还要熟悉TCL命令( Tool Command Language o此外,学习验证语言 除了掌握部分关键字以外,还要记忆熟悉大量的系统函数,还有预处理。年轻的笔者, 因为年少无知就这样上当了,最后笔者因为承受不了那巨大的学习负担,结果自爆了。 经过惨痛的经历以后,笔者重新思考“仿真是什么?″,仿真难道是常规口中说过的东 西吗?还是其它呢?苦思冥想后,笔者终于悟道“仿真既是虛拟建模′这一柢念。虚拟 建模还有实际建模除了概念(环境)的差别以外,两者其实是同样的东西。换句话说 套用在实际建模的习惯,也能应用在仿真的身上。 按照这条线索继续思考,笔者发现仿真其实是复合体,其中包括建模,时序等各种基础 知识。换言之,仿真不仅需要一定程度的基础,仿真不能按照常规去理解,不然脑袋会 短路。期间,笔者发现愈多细节,那压抑不了的求知欲也就愈烧愈旺盛,就这样日夜颠 倒研究一段时间以后,笔者终于遇见仿真的关键,亦即个体仿真与整体仿真之间的差异。 常规的参考书一般都是讨论个体仿真而已,然而它们不曾涉及整体仿真。一个过多模块 其中的仿真对象好比一块大切糕,压倒性的仿真信息会让我们喘不过起来,为此笔者开 始找寻解决方法。后来笔者又发现到,早期建模会严重影响仿真的表现,如果笔者不规 则分化整体模块,仿真很容易会变得_团糟,而且模块也会失去连接性。 笔者愈是深入研究仿真,愈是发现以往不曾遇见的细节问题,然而这些细节问题也未曾 出现在任何一本参考书的身上。渐渐地,笔者开始认识,那些所谓的权威还有常规,从 根本上只是外表好看的纸老虎而已,细节的涉及程度完全不行。笔者非常后悔,为什么 自己会浪费那么多时间在它们的身上。可恶的常规!快把笔者的青春还回来!所以说, 常规什么的最讨厌了,最好统统都给我爆炸去吧!呜咕,过多怨气实在一言难尽,欲知 详情,读者自己看书去吧 akuei2上 (15日08月2013年) 第一章仿真的扫盲文 1.1 Modelsim是电视机 如果笔者提问 Modelsim是为何物?想必同学们都会认为"“ Modelsim就是仿真”这种等 价的关系。草草而言,该想法只是美丽的误会而已,笔者眼中 Modelsim只是类似电视 机的工具。我们知道电视机除了播放功能以外,它甚么也不是。换之,身为用户的我们 使用电视机就要学会开关和调节节目,而不是去研究构造和功能原理 Modelsin成功播放波形图以后自然可以功成身退。笔者一直以来都无法理解,为甚么 会有那么多同学特别纠结 Modelsim的五脏六腑,笔者不知要佩服他们的挑战精神才 好,还是要讽刺他们皮痒才好呢?因为信心满满到的他们,最终都会被 Modelsim搞到 变成破烂回来,结果实在惨不忍睹。笔者也不是有意中伤他们,因为笔者也是经验者。 Modelsim有各种各样的版本,除了官方的默认版本以外,还有第二方的自定义版本, 如 Altera modelsim se或者 Altera modelsim pe。以上是 Altera公司自定义的两个版本, SE是 Start edition亦即入门版本,AE是 Altera edition,亦即是付费版本。 许多同学都认为AE一定比SE更强更加好用。逻辑上的确如此,不过AE与SE之 间宛如24寸与19寸液晶显示器的大小差别而已。基本上SE已经足够应付一切仿真 应用了,此外sE还有许多功能根本排不上用场。婆婆曾说过做人要节俭,东西够用就 好,过多就是浪费,所以笔者告诫读者不要过度纠结AE,如果读者硬要自寻烦恼的话, 那么后果请自负。 笔者知道自己很烦,最后还是要再强调一下,目前同学们只要把 Modelsim当成电视机 就好,然而 Modelsim除了学习开关之余,还有就是调节节目而已,至于详细的用法 往后我们会慢慢接触到。 1.2仿真和调试 曾笔者还没讲述“仿真”之前,让我们在根本上先理解仿真和调试的区别。仿真这词的 同义虽然接近调试可是仿真却不等于调试。调试用来观察结果,仿真则是观察过程。仿 真有“功能仿真”和“行为仿真”两个专业分类,对此调试也有“下线调试”和“上线 调试”两个专业分类,让笔者用表格来说明: 表格1.2.1仿真与调试的对应关系 并行语言 顺序语言 仿真 调试 功能仿真 下线调试 行为仿真 上线调试 那么,什么是上线调试与下线调试呢?上线调试最为常见的方法就是将程序下载到开发 板,然后再观察开发板的结果是否与预期一样,如发出“哔哔哔”声的程序,下去开发 板后蜂呜器发出“哔哔哔”的话,那么程序就合格。此外,上线调试还有较为细腻的方 法,就是利用专用的上位程序或者集成环境序同步测试开发板,详细情形笔者就不谈了, 有玩过单片机的朋友一定略知一 下线调试就是隔着开发板在电脑上模拟程序的测试结果,让笔者用例子详细说明吧。 1. main( int varA =1. printf( %d", varA ) 代码12.1 代码1.2.1大意是指,第3行声明整型变量varA然后赋予初值16,然后再第4行使用打 印函数— printf输出varA的储存结果。假设varA的储存结果1对应LED点亮,那 0对应LED消灭。如代码1.2.1所示,它会告诉我们LED最终会点亮,因为varA被赋 予初值1。 所谓下线调试就是在没有开发板的情况下,利用模拟环境取得假想结果,假想结果再经 由大脑进一步脑补(反映)实际的情况。如代码1.2.所示,当我们在集成环境(IE 按下或者的测试热键,varA的输出结果“1″就会在集成环境的信息窗口 显示出来。再来经由我们自己脑补道:"vaA的输出结果是1,那么开发板的LED是点 亮的”。 到目前为止,笔者也只是大概讲述一下“调试”的内容而已,事实上“仿真”的内容比 起“调试″还要麻烦许多,如果读者要确确实实理解调试与仿真之前的实际区别,读者 就必须从语言的本质开始理解。 在笔者的眼中;些高级语言如C,C艹+,Java等都视为顺序语言此外还有古老的 Basic 和汇编也是一样。为什么笔者之将它们称为顺序语言呢?原因很单纯,因为这些语言是 按着顺序的步骤在执行操作,举个例子 ma]n 二){ varA= 1 (四) Var (五) varc =3 (六) 代码12.2 代码1.2.2的3~5行是varA,varB与varC的赋值操作,先是varA赋予1值,然后varB 再赋予2值,最后varC赋予3值。在此之间,varB的赋值操作需要等待A的赋值 操作完毕之后才能执行,同样varC的赋值操作需要等待varB赋值完毕之后才被执行。 varA,ⅶaB与varC之间的赋值操作延迟也称为”步骤差“。 故名思议,顺序语言会让我们普遍将代码以步骤的单位去认为,如果步骤1不完成执行 步骤2就无法继续,其它以此类推。笔者再将代码1.2.2换成另一个形式看看 1. main( varA =1: varB =2, varc =3: 4 代码1.2.3 代码1.2.3是将代码1.2.2的3行集为1行,然后我们会这样解读代码:"第3行,vaA 赋予1值,varB赋予2值,varC赋予3值。〃,笔者再顽皮一点,继续胡搞代码1.2.3 1. main( 3 varc =3 varb =2 varA=1, 代码12.4 代码1.2.4是将代码1.2.3的赋值操来回颠倒,然后我们会这样解读代码:第3行 varC赋予3值,ⅤarB赋予2值,varA赋予1值。“,无论笔者怎样胡搞vrA,varB与 varC的位置,我们都无法割舍步骤这个单位去解读代码中varA与varB还有varC的 赋值过程。因为只要失去“步骤“我们就会迷失解读的方向,这是顺序语言的特征,我 们也可以说“步骤就是支撑整体顺序语言最基本的结构" 在此读者必须理解,“平常我们就是太习以为常使用步骤这个单位去解读代码,不知不 觉习惯就成为理所当然″,但是事实却好相反,这种想法还有这种思路也仅限于“调试 这个框架而已。此外,读者还必须理解“步骤”只是可视的宏观单位而已,然而不可视 的微观单位却是“指令″。假设varA=1的赋值操作,可视步骤也只有1个,但是在隐 臧中, vara-1这样简单的赋值操作到底需N个指令完成,完全取决与编译器的编译质 对于我们这些只会认为肉眼看见才是事实的小白而言,指令就像不存在与人界的幽灵 般,时而增多时而减少,尽是虚幻也难以捉摸。除此之外,处理揞令所需的时钟,也会 根据指令的版本,处理器的工艺等因素产生改变。讲白点,调试只会输出步骤的结果却 无视指令的内容,它也会无视时钟的消耗数。 因此读者必须理解,调试一般离不开顺序语言,宏观上顺序语言需由由步骤这个可视单 位支撑。微观上,步骤则是由无数的指令在后面攴撑着,然而指令的内容还有时钟的消 耗数都是隐藏内容。总结说,调试只在乎步骤在表面上产生的结果而已,又或者说是追 求单向结果。 笔者一直以来都在不停思考,为什么 Verilog hdl不使用“调试”而是“仿真”这词呢? 有些朋友可能会认为笔者有点过于钻牛角尖了,对此笔者不敢否认,但是那种违和感时 时刻刻都在折磨笔者,笔者也十分焦急想将它揪出来。我们知道“调试”与顺序语言有 切不断的关系,然而“仿真”却与并行语言有着强烈的羁绊。 听谓的并行语言有如ⅤVHL或者 Verilog hDl等各种描述语言描述语言不像顺序语言 有步骤攴撑整体的顺序结构,结果描述语言显得结构自由,甚至称为没有结构的地步。 顶序语言每—个关键字都在暗示处理器的处理行为,然而描述语言每一个关键字只是描 述手段,我们用它在白纸上绘出我们想要的“形状"。 顺序语言与并行语言之间最大的差异就是,顺序语言每一个时钟只能执行一个步骤(如 果这个步骤在一个时钟内完成的话),然而并行语言可以在一个时钟内执行干干万万个 步骤,上限是没有尽头的。顺序语言之所以不关心时钟,那是因为时钟不仅隐藏而且还 无法控制。反之,并行语言的时钟不仅开放也能控制。 仿真有“功能仿真”还有“行为仿真”两大分类,如表格1.2.1所示。功能仿真与行为 仿真的差别,即前者是下线,后者则是上线。一般所谓的仿真就是“功能仿真”,而不 是行为仿真,为了避免浑浊,往下內容笔者皆用“仿真″来表示“功能仿真"。至于行 为仿真已经超出本书的范围,怒不解释。 仿真是一件很麻烦的事情,而且“仿寘″也不像“调试″那样,只要轻松按下≮F5>或 者等调试热键,信息就会像水一样,花啦啦地打印岀来。换之,执行仿真之前必 须经历许多准备工作,如创建仿真对象,编辑仿真环境,仿真之间必我们必须一边迫踪 过程,一边解析信息 笔者曾说过调试是追求单向结果,如果用仿真来比拟调试,调试是用来断定某个信号在 某个时钟的某个结果而已,如:信号B在时钟T10的结果是逻辑0,又或者数据C在时 钟T12的结果是8hAA。反之,仿真是追求多向过程,亦即N个信号在所有个时钟发 生里什么结果,如:模块A,有信号A与数据B,而且模块A的一次性操作需要耗时 10个时钟,那么仿真会用来观察信号A与数据B在10个时钟内的结果变化 笔者曾被仿真杀死过许多次,如果不是它在笔者最绝望的时候拉笔者一把,如今笔者就 是一只怨气十足的冤魂了。学习仿真就像处于金庸所描述的江湖般,那里存在许多各种 帮门流派,其中—种称为传统流派,也是网络流传已久的右翼硬派,门徒最多,死人也 是最多。初落平阳的笔者为了寻求照应,就这样糊里糊涂加入其中。 期间笔者至少死过十余来次,最后终于支持不住,一心来到崖边寻求解脱。那是笔者的 人生当中最黑暗的一刻,就在跳下的瞬间,一直温柔却有力的右手揪主笔者,然后让笔 者感动不已的声音传遍全身:“孩子,干万别做傻事,明天总有希望!,此刻是笔者最 痛哭的一次。 为了寻找仿真之道,为了知晓那份违和感….经过七七四十九天的闭关以后,歪道终于 开窍,所有问题自然迎刃而解。歪道是什么?那是完全背离传统的知识,它像毒瘾一般 让人深入无法自拔,甚至落沦魔鬼。歪道宛如不懂善恶的恶魔·般,只会给予方法却不 会承担后果,这是沾染歪道的唯一风脸。
用户评论