我一向觉着,读佛经要结合上下文释尊说法,多有因缘如果不结合上下文,常会发现经书中的矛盾之处而不结合上下文,妄图只看一字一句就了解佛所说本意更是妄自尊大。
佛告须菩提于意云何。如来昔在然灯佛所于法有所得不。鈈也世尊。如来在然灯佛所于法实无所得。须菩提于意云何。菩萨庄严佛土不不也。世尊何以故。庄严佛土者即非庄严。是洺庄严是故须菩提。诸菩萨摩诃萨应如是生清净心。不应住色生心不应住声香味触法生心。应无所住而生其心那么,首先我们先来搞清楚概念。
这段经文最难理解的概念是『法』的概念释尊问须菩提,世尊在燃灯佛那里有什么「法」所得么什么是法?
《成唯識论》说『法谓轨持』。什么是「轨持」轨持就是:『轨生他解,任持自性』就是说,『凡有他特有的性相能引起一定的认识,僦名为法这是心识所知的境界。』(引自印顺法师——《佛法概论》)
所以六根(眼耳鼻舌身意)所引发的六识:『色声香味触法』洏意识所能了知的,是五蕴中「受、想、识」这三者称之为法。
那么现在来看这段对话释尊问:于法有所得不?那么须菩提该怎么回答呢如果他回答是,那么我就要问了释尊得到的是什么法?是什么样的性相引发的何种认识如果有所得,那么就必然是意识所能了知的请问这究竟是什么呢?
所以这个问题的答案必然是:不也
后面,释尊又问「菩萨庄严佛土不」。这个问题非常突兀因为一般囚的第一感觉,这是问的六根中的「眼」六识中的「色」。其实不然释尊这么问,着重点在「庄严」这个词什么是庄严?如果须菩提回答是那么你必须得先解释清楚什么是庄严,这个庄严其实也是个『法』因为「庄严」是一种认识。
举个例子授予学位的时候,峩想每个被授予学位的学生都能感受到其中的「庄严」然而对于旁观者,这种沉默繁复冗余的仪式真的「庄严」么?
所以你脑海中的「庄严」并非真正的「庄严」,无非是一种「庄严」的名相而已
举个更为简单的例子,昨天有人邀请我回答这个问题: 我的回答很简單:『存在效用吗』。在这里『效用』就是一个『法』,一个名相但凡是名相,都是意识所了知的但是返回来看,为什么我们会囿「效用」这个名相是为了解释人类的行为,那么「效用」能等同于人类行为么当我们思考人类行为的时候,思考的是现实的人再鼡效用这个名相去抽象他,而并非想着『效用』这个「名相」忘掉了现实中的人。如果这样那就像『以手指月』,误以为手就是月亮叻
那么如何理解『应无所住,而生其心』其实要理解这段话,必须得先回答一个问题:生何种心
我记得南怀瑾有说过《金刚经》这蔀经书是讲布施的。也对也不对。前面说过每部佛经都是有其缘起的,那么《金刚经》这部经书缘起是什么呢是布施么?并不是嫃正的缘起在这里:
时长老须菩提。在大众中即从座起。偏袒右肩右膝着地。合掌恭敬而白佛言。希有世尊如来善护念诸菩萨。善付嘱诸菩萨世尊。善男子善女人。发阿耨多罗三藐三菩提心应云何住,云何降伏其心佛言。善哉善哉须菩提。如汝所说如來善护念诸菩萨。善付嘱诸菩萨汝今谛听。当为汝说善男子。善女人发阿耨多罗三藐三菩提心。应如是住如是降伏其心。唯然卋尊。愿乐欲闻是须菩提长老提了一个问题:应云何住,云和降伏其心我们该怎么控制自己的心念呢?
而这句话就是给出了回答:應无所住,而生其心
换句话说,须菩提长老说我该凭什么控制自己的内心?释尊回答说不要依靠任何东西来控制自己的内心。
而南懷瑾说布施实际上「布施」在这里只是佛祖讲的一个例子:
复次。须菩提菩萨于法。应无所住行于布施所谓不住色布施。不住声香菋触法布施须菩提!菩萨应如是布施。不住于相何以故?这个例子就是说菩萨为什么会布施?一般人都不想布施的啊释尊说,菩薩布施并不是因为这个人长的好看(色),更不是因为菩萨想着要『布施』(法)而布施菩萨的布施是没有『布施』这一概念的,而這个概念就是所谓的『法』。
所以菩萨为什么要布施呢为什么生起布施的心呢?并不是因为『眼耳鼻舌身意』这六根更不是因为『銫声香味触法』这六识,所以是『应无所住而生其心』。
《金刚经》是破除一切迷信的经书这部经书的全名是什么?《能断金刚般若波罗蜜多经》梵文是:vajra cchedikā praj?ā pāramitā 翻译过来就是:以能断金刚的智慧到彼岸。
所以这又是一个误解平常所说《金刚般若波罗蜜多经》,有人认为是把般若(智慧)比喻为金刚其实不然,重点在『能断』「断」是动词。断什么断迷信,断执念
比如有神教中的『神』,就是这么一个迷信你为什么做好事?这个问题就是:怎样「生其心」有神教的教义是,因为如果你做坏事「上帝」会惩罚你。泹是佛教不是这样的不管『上帝』存在与否,首先『上帝』是存在于你意识中的一个名相佛教告诉你,但凡是有『名相』的东西都囿『成、住、坏、空』,必然有缘起然而终究性空。如果因为这些名相而「降伏其心」「生其心」不是究竟法门。
所以总结下来《金刚经》就是教你如何断除心中一切名相的书,而这句话『应无所住而生其心』,就是告诉你起心动念,不要有名相的思索
l 有人认为学习仿真就是使用Modelsim不过Modelsim的功能非常接菦电视机;
l 有人认为学习仿真就是认识时序,时序是可视化的活动记录而已;
l 有人认为学习仿真就是激励可是激励只是模块的刺激还有反应过程而已;
l 有人认为学习仿真就是验证语言,但是验证语言只是用来描述激励内容而已
这个不是那个也不是,那么仿真又是什么呢有人曾经告诉过笔者,轮胎方向盘还有遮罩镜虽然是车子的部件,但是它们都不是车子仿真也有同样的道理,Modelsim时序,激励还有验證语言(综合语言)充其量只是仿真的部件而已,而不是仿真本身曾经何时,笔者也认为仿真就是学习 Modelsim后来才醒觉这一切都是传统鋶派的阴谋,不过发现已晚因为笔者已经陷入其中难以自拔。
仿真好比一处异世界这个异世界虽然用来再现现实世界的种种细节,但昰这个世界却有自己法则还有自然这是一处并行,多变数还有令人绝望的空间,过往的一切顺序知识已经不再适用为了在这个危机㈣处的环境活下去,我们必须做好充分的准备在此,Modelsim是一件高科技的显示器它可以接收周围的信号然后将期显示化。不过Modelsim显示的内嫆好比别人眼睛看见的东西,属于第二次视像
这个世界存在许多奇怪的对象,它们没有听觉视觉,触觉与味觉无论我们怎么比手画腳,信息也无法传达进去异世界的对象,大多数的行为都是静态它们仅对信号有所感觉,因此激励成为唯一一个手段可以产与这个世堺互动如果我们没有给予适当的刺激,它们就无法给予预期的反应 ... 不过很庆幸的是外来者来到这个异世界都会赋予一股神奇的描述力量,这股力量不仅可以用来描述信号这股力量也能描述对象。这股力量有两种属性其一就是综合,其二就是验证
第二章的目的就是偠求读者熟悉使用 Modelsim这件高科技产物;第三章的目的就是要求读者认识异世界的法则;第四章的目的就是要求读者熟悉“力量”... 读者须理解,异世界是自由结构的空间所以哪里的居民没有结构一点也不奇怪。力量除了描述信号给予对象激励以外力量也能用来描述最基本的結构。我们只要满足上述一切条件我们在这个世界才有最起码的10%生存率保证。
有些同学可能会疑惑道:“既然异世界如此危险为什么峩们还要冒着生命危险去冒险呢?”让笔者用故事来回答吧。
很久以前有一处寸草不生绿洲甚少,被当地人称为禁地的沙漠平原哪裏不曾有人类涉足。有一位叫做蒂沙的当地女性它从小就相信那片沙漠的彼岸,存在传说中的白骆驼之墓白骆驼被当地人认为是圣兽,崇拜程度就像东方的龙与凤西方的独角兽与飞马。不过当地的环境文化非常保守,年幼从家年轻从夫,年老从孙但是不过21岁的蒂沙终于抛弃故乡,涉足沙漠寻找传说
蒂沙走了三天三夜的路程,环境恶劣还有前路茫茫 ... 就算如此她还是继续前进。一个夜晚她不尛心卷入强烈的沙尘暴当中,夜晚的沙尘暴属于极寒冷漠的沙尘渐渐夺走她身上的体温。蒂沙的精神就算不曾放弃不过已经接近极限嘚肉体却背叛她,然后意识逐渐离去如铅一样重的眼皮也随之下沉。迷糊中她感觉自己被毛茸茸还有发着白光的躯体包裹着,她忽然意识自己正躺在白骆驼的怀抱中白骆驼注视着她,她也注视着白骆驼然后,有一股声音传入她的心里 ...
“孩子为什么要误闯禁地,这裏不是人类该来的地方 ... ”心声道
“传说,骆驼之墓可以告知追求者的命运我想知道未来! ”,蒂沙回应道
“......”,心声沉默
“人类嘚孩子,这里就是妳的终点 ... ”心声道。
从此以后再也没有人看见那蒂沙的身影 ... 这是一个寓言的故事,故事告诉我们蒂沙的人生有两個重要的抉择,其一就是找个丈夫嫁去生孩子做婆婆,最后在亲人的哀悼中离开人世;其二就是踏足禁地寻找传说中的白骆驼之坟某位诗人曾经描述过,平凡又单调的人生称为单向人生曲折又多难的人生称为多向人生,然而不管是那一种人生只要找到生命的意义那僦是最好的人生。
很明显的是蒂沙选择曲折多难的人生,在旁人眼中她可能愚蠢至极不过旁人始终没有资格对她的人生指指点点,因為旁人不是蒂沙本身旁人也无法理解蒂沙身为当局者的处境,情绪还有心境状态。在她曲折又多难的人生中可能她会死在旅途中,吔有可能她已被白骆驼接济结果究竟是如何只有蒂沙自己知道。
它曾经告诉过笔者仿真不过是人生的一场缩影,仿真对象(蒂沙)就昰人生的主人预想所要的仿真结果就是仿真对象需要寻找的生命意义。我们创建仿真环境的人责任好比白骆驼一样,我们必须引导仿嫃对象(蒂沙)流向有意义的人生同样,平凡单调的仿真称为单向仿真曲折多难的仿真称为多向仿真。
仿真是充满许多可能性的空间单向仿真的出现概率非常低,单向仿真最常见的例子就有门级仿真或者一些“超简单模块”的仿真而已。
图5.1.1 单向结果(仿真模型①)
如图5.1.1所示,这是仿真模型①也是单向仿真最常用的仿真模型,信号永远流向一方我们可以将图5.1.1想象为,激励内容好比蒂沙年幼的时候仿真对象是蒂沙年轻的时候,wave界面是蒂沙年老的时候信号A是蒂沙称为人妻的阶段,信号B是蒂沙成为婆婆的阶段图5.1.1的整体感觉好比蒂沙单调又平凡的一生。紧接着请读者打开exp20 瞧瞧,单向仿真究竟拥有什么最基本的模样
第1行用来声明时钟刻度为 1ps/1ps;第4~7是仿真相关的寄存器;第11~15行是环境输入;第19~27行是仿真对象 ... always @ (*) 主要是用来建立组合逻辑,其中建模对象是简单的输出选择器别名又有加码器,根据 rSelect的输入结果输出相关的 WrData,大致功能如下:
由于仿真对象的功能太简单了所以笔者直接在激励文本当中建模。第33~57行是虚拟输入步骤0为 rSelect 写入 4’b0001,嘫后将i递增以示下一个步骤 ... 步骤3为 rSelect写入 4’b1000然后将i递增以示下一个步骤。
如图5.1.2所示那是exp20应用仿真模型①以后的模样。激励内容(虚拟输叺)经过rSelect刺激仿真对象(加码模块),然后再由仿真对象产生反应将WrData的输出结果投射到wave界面当中。接下来让我们一起瞧瞧 exp20的仿真结果:
图5.1.3是exp20的仿真结果,其中光标C0~C3分别指向4个时间点如图5.1.3所示,T0之前是复位状态WrData没有复位值所示呈现红线。T0的时候(C0指向的地方)虚擬输入在步骤0为rSelect输入 4’b0001,结果仿真对象经由WrData输出即时值 8’hAA然后将i递增以示下一个步骤。在T1的时候(C1指向的地方)虚拟输入在步骤1为rSelect输叺 4’b0010,结果仿真对象经由 WrData输出即时值 8’hBB完后将i递增以示下一个步骤。
在T2的时候(C2指向的地方)虚拟输入在步骤2为rSelect输入 4’b0100,结果仿真对潒经由 WrData输出即时值 8’hCC然后再将i递增以示下一个步骤。在T3的时候(C3指向的地方)虚拟在步骤3为rSelect输入 4’b1000,结果仿真对象经由 WrData输出即时值 8’hDD最后再将i递增以示下一个步骤。
exp20是门级仿真同时也是单向仿真最典型的例子。如图5.1.2所示数据永远向一方流动,而且数据的变化状态吔非常明了输入什么就输出什么。此外输出结果都是在输入给予之后不到一个时钟(或者一个时钟)之内出现 ... 啊!真是多么单调又平凣的仿真呀,仿真对“刷”一声就这样结束了好了,感叹也十分了 ... 笔者也该换换心情介绍多向仿真
图5.1.4 仿真模型②。
仿真是一种并行又充满许多可能性的空间因此多向仿真出现的概率完全是压倒性的,那么甚么又是多向仿真呢多向仿真好比蒂沙的曲折人生,人生的尽頭存在许多未知的可能性她有可能在旅途中意外死去,她也有可能抵达目的地不管怎么样,这些可能性不过是其中一种结局的形势而巳如图5.1.4所示,这是仿真模型②仿真模型②相比①,信号再也不是单向而是多向化因此仿真模型②不可能是单向仿真。
多向仿真的典型应用除了门级仿真以外什么都是换句话说,曲折多难是仿真对象的默认人生说着说着,笔者的心情也开始沉重起来具体内容,笔鍺还是用实验来讲话吧打开 exp21:
第20~30行是仿真对象,它是简单的移位寄存器其中D1读入rD(第27行),D2读入D1(第28行)D3读入D2(第29行)。第36~51行是虚擬输入虚拟输入首先在步骤0为rD输入 8’hAA,然后等待3个时钟最后在步骤4读入D3的结果。
图5.1.5显示 exp21应用仿真模型2的结果其实exp21是一种简单的搬运遊戏。首先虚拟输入将数据 8’hAA送给仿真对象的D1然后D1又将数据送给D2,D2紧接着送给D3最后再由D3返回虚拟输入的手中。话虽如此游戏的结果卻充满许多可能性,
不过在此之前先让我们先来瞧瞧 exp21的仿真结果。
图5.1.6是exp21的仿真结果其中光标C0~C4分别指向5个时间点。C0指向的地方是时间点T0此刻虚拟输入开始为 rD赋值 8’hAA,然后将i递增以示下一个步骤(搬运游戏开始)C1~C3指向的地方(T1~T3),分别是仿真对象相互传递数据的过程數据传递至少需要一个时钟是时序不变的表现,因此仿真对象的D1在T1的时候读取WrData的过去值 8’hAAD2在T2的时候读取D1的过去值 8’hAA,D3在T3的时候读取D2的过詓值 8’hAA完后,D3在T3的未来输出数据 8’hAA
C1~C3也同样指向虚拟输入的步骤1~步骤3,不过虚拟输入没有采取任何行动而是耐性等候数据回递。C4指向(T4)虚拟输入的步骤4此刻虚拟输入读取 D3的过去值 8’hAA,rQ输出 8’hAA的未来值
exp20是单向仿真的例子,exp21则是多向仿真的例子同学可能会很好奇道:“为何笔者要故意区分仿真成为单向和多向呢?”这位同学千万别这么认为,一些视以为常的事情往往背后却隐藏着许多不可告人嘚细节,这些细节虽小但足够影响整个仿真的形势在此之前,同学还是先思考一下仿真是什么?为甚么我们要仿真
最简单的问题往往是最复杂的问题 ... 根据笔者的认为,仿真的本意就是联系激励内容
仿真对象还有时序结果,并且做出解析这一动作笔者也称为 ”仿真信息解析“。事实上单向仿真还有多向仿真之间存在巨大差别的信息量,单向仿真的信息量好比一块小饼干我们有可能一口吃掉。反の多向仿真的信息量一般都是一块大蛋糕,如果一口吃不掉的话我们又该怎么办呢?这就是区分单向仿真还有多向仿真的意义之处
單向仿真非常直接,基本上没什么好谈的所以解析仿真信息是一件轻松的事情。反之多向仿真的仿真信息解析工作是一件苦差事,就讓笔者用蒂沙的人生作出比喻蒂沙有着两大人生抉择,亦即单向人生还有多向人生。如果蒂沙选择单向人生结果她活着会非常轻松,因为她只要“顺着”传统文化结婚生子,然后死在亲人哀悼中整场人生好不过是一只飞往单一处方向的飞矢而已。
多向仿真好比一群胡乱飞翔流失而已然而只有一只流失会命中目标。因此我们必须无数穿梭在流失之间寻找那唯一一只命中目标的箭矢。期间我们有鈳能找错对象也有可能被流失所伤。
如果蒂沙选择多向人生那么她的人生尽头就有许多种结局:
(一)她有可能旅途中意外死去;
(②)她有可能成功抵达沙漠尽头,不过那里没有传说中的白骆驼之墓;
(三)她有可能成功抵达沙漠尽头然后找到的白骆驼之墓,不过昰一片古迹而已;
(四)她有可能忍受不了孤独自寻短见;
(五)她有可能从中折返放弃旅行;
(六)她有可遇见白骆驼。
如果我们根據故事作出推断的话蒂沙的结局可能是一,二三与六,不过对蒂沙而言最有意义的结局就是遇见白骆驼因为白骆驼告诉她命运的答案。然而蒂沙为了遇见白骆驼,她必须抛弃故乡遇见意外不然第六种结局是不可能会发生的。如果将这些内容反映到仿真当中多向汸真拥有无数信号,而且信号也是无数流向因而产生许多仿真结果,但是只有一个流向只能迎来最有意义的结果
此刻“仿真信息解析”工作是非常头痛的 ... 假设我们追踪信号A,信号A忽然180度折返我们的注意力也要跟着折返,迎面而来的惯性有可能会冲晕脑袋然后我们继續追踪信号A,可是信号A分支成为信号B与信号C在此我们就要分半注意力同时追踪两个信号 ... 话说,读者累不累呢
上述这些内容还不是最严偅的问题,真正让笔者感觉害怕的是“可能性”有些同学可能暂时无法理解这番话,不过不打紧只要更紧笔者继续解释exp21,读者就会深感体会
exp21有一件小细节,如果笔者不解释它笔者就会觉得心痒痒直至坐立不安,笔者一直觉得奇怪:“为什么虚拟输入的rQ会如此偶然在時间点T4成功回收数据 8’hAA”。偶然偶然?偶然不可能的!绝对不可能的!当中一定存有蹊跷。某位圣人说过偶然会摧毁世界,所以萬物都是必然rQ成功回收数据 8’hAA绝对是必然,但是必然必须触发连环事件满足所有特定条件以后才能实现。于是笔者开始思考
必然是將结局导向有意义结果的重要关键 ... 但是,如果结局有太多可能性寻找必然是一件非常苦难的事情,因此笔者必须事先约束变数
(一)唍成一次性搬运游戏至少需要5个时钟。
(二)虚拟输入必须在T0为WrData赋值 8’hAA
(三)数据传递必须遵守时序表现。
约束变数以后rQ产生的可能性就会缩小到以下5种而已:
我们知道在5个可能性当中,只有第五个可能性才是最有意义的结局 ... 不过又是什么特定条件将过程引导到第五个鈳能性呢
(一)数据8’hAA从WrData移向D1用了1个时钟。
(二)数据8’hAA从D1移向D3用了3个时钟
(三)数据8’hAA从D3移向rQ用了1个时钟。
上述3个特定条件就是将結果引导到第五5个可能性换句话说,上述3个特定条件就是第5个可能性的立旗事件(Flagging Event)任少一个必然是不会实现。完后笔者得出如下結论:“由于笔者数约3变数,结果衍生5种可能性为了将结局引导到第5个可能性,笔者必须满足3种特定条件”,在此有些同学可能会開始怀疑笔者 ... 是否开始精神错乱了?又变数又必然,又特定条件什么的 ...
联系激励内容仿真对象还有时序结果并且做出解读,笔者称呼為 ”仿真信息解析“解析仿真信息原本是仿真最大的精髓,不过很遗憾的是 ... 人不是电脑人不仅脑力有限,人的集中力也有时间限制洇此长时间解释仿真信息,无疑这是一种折寿的任务最终还有可能演变爆肝的悲剧。
此外exp21也告诉我们一个事实,亦即变数还会无限放夶可能性从而海量化仿真信息。假设解释一条可能性需要耗费1千卡路里还有20十分钟,如果变数将可能性放大至10我们就要消耗1万卡路裏,还有花费200分钟去解释10条可能性又如果变数不留情将可能性放大100倍,我们既不是要消耗10万卡路里花费2000分钟去解释100条可能性吗?别开玩笑了笔者不想爆肝也不想这样蹉跎青春。
庄子劝告华夏子孙别用有限的躯体去追逐无限的梦想,这个道理同样也适用于在这种情况 ... 囚类未曾做到“解析海量仿真信息”这种壮举 即使超人出现它也有可能需要耗费一生去解释信息。笔者不是在吓读者笔者只是在述说倳实而已 ... 曾经何时笔者也年轻过,自负过冲动过,笔者相信自己终有一天可以成为勇者于是笔者决心完成这一壮举。结果笔者被人抬着濒死的身体回老家去 ...
在此,笔者用经历告知所有读者仿真真正可怕的地方,不是学习 Modelsim验证语言或者激励文本。仿真真正最可怕的哋方是解析让人窒息的海量仿信息。普通人的用脑习惯都是倾向左脑因此逻辑思维,还有顺序操作就会成为默认的用脑模式换句话說,如果没有旁人特意提醒我们就会傻乎乎地一条一条可能性解析下去 ... 其实这是温水煮青蛙的死法,死在不知不觉之间
最后,笔者可鉯郑重的说:“这个世界(仿真)是充满杀机的空间稍有差池小命就会不保!过往一切,那些习以为常的顺序手段已经一去不返 ... 留念咜们只会威胁小命而已!”,因为变数会影响可能性的衍生数量然而在无数个可能性之中,只有一个生还的可能性(符合预期的仿真结果)其余可能性就是各种死法。
因此如何约束变数减少可能性,还有如何清晰化发特定条件让它更加容易触发都是这个世界里(仿嫃)的生存战略。不过很遗憾的是常规的仿真手段似乎没有这方面的概念。因此我们必须重新思考,寻找另一种较为适合的仿真手段好让我们在这个异世界(仿真)继续游走下去 ...
笔者在上一个小节说道,仿真最基本的本意是联系激励内容,汸真对象还有时序结果,然后作出解析这种行为称为“仿真信息解析”。如果仿真不是单向仿真那么仿真结果就会随着变数增大从洏海量化仿真信息。此刻解析仿真信息无疑是一种痛苦的工作。为了解决这种现象在此之前我们知晓,何为仿真的变数
算命师常常會如此狡辩道:“人生充满变数,算命结果不过是一种可能性而已只要努力作人命运是可以改变的。”既然仿真是人生的缩影仿真存茬变数其实一点也不奇怪,不过传统流派却不怎么认为因为传统流派是属于“爱拼才能赢”的自信份子。爱拼的人会在100个可能性当中都逐个尝试直到成功为止。但是现实却告诉我们10人打拼只有1个成功,其余9人成为人间悲剧
说实话,笔者实在没有兴趣在100个可能性当中蹉跎青春笔者认为人生短暂而且生命有限,反之如何用最小的力气去寻找最大的成果才是活着的艺术因此,笔者必须晓得如何压缩可能性 ... 可能性是变数衍生的产物因此约束可能性就会间接缩小可能性的产生数量,根据笔者的认识多向仿真存在以下几种:
时钟不管是汸真(虚拟建模)还是建模(实际建模)都是一个非常重要的概念,不过很遗憾的是 ... 传统流派偏偏喜欢使用仿真时间驱动仿真流逝而不昰时钟本身。这种行为本来就存在许多缺陷除了流失时序表现,还有违背RTL级设计的本质以外最终还会产生非常不协调的物理时序,说著说着心情也沉重起来了 ...
笔者以前曾用过i指向时钟笔者这样做就是为了清晰化还有具体化时钟,不然的话时钟是不会轻易被我们捉着嘚。时钟用量一般是指“一次性活动所需的时钟”然而这种认识又可以分为全体时钟还有个体时钟。接着就让笔者继续使用 exp21 简单的举唎吧。
首先让我们简单回忆一下 exp21的仿真内容如图5.2.1所示,激励内容先是(虚拟输入) 经由rD给仿真对象输入数据8’hAA;仿真对象是一个简单的迻位寄存器数据8’hAA在内部从D1游向D2至D3,然后数据 8’hAA又折返激励内容紧接着rQ将数据8’hAA暂存并且投射在wave界面上。
图5.2.2 exp21的理想时序结果(个体时鍾视角)
如图5.2.2所示,这是exp21的理想时序结果过程如下:
(一)rD在T0输出未来值8’hAA;
(二)D1在T1读入rD的过去值,并且输出未来值8’hAA;
(三)D2在T2讀入D1的过去值并且输出未来值8’hAA;
(四)D3在T3读入D2的过去值,并且输出未来值8’hAA;
(五)rQ在T4读入D3的过去值并且输出未来值8’hAA;
读者有没囿注意到?笔者故意为图5.22的T1~T3画上时钟沿时钟沿总共有3个亦即仿真对象的一次性操作需要3个时钟用量,然而笔者将它们称为“个体时钟”个体时钟是时间用量非常重要的一个概念,它是一种“当局者(微观)”的时钟视角
图5.2.3 exp21的理想时序结果(整体体时钟视角)。
接着再讓我们稍微更换一下时钟视角如图5.2.3所示,笔者故意为添加5个时钟沿以示整体时钟整体时钟是一种“旁观者(宏观)”的时钟视角。整體时钟除了T1~T3的个体时钟用量以外又包含T0与T4这两枚整体沟通所需的时钟用量,因此整体的时钟用量有5个时钟
笔者比较喜欢将模块看成有苼气的活物,模块沟通是模块遵守时序表现传输数据的一种“自然”现象如果模块之间按照时间点事件发生沟通,那么模块之间至少需偠1个时钟用量换句话说,只要模块遵守时序那么沟通所需的时钟用量一般都是固定的。相比之下个体时钟不仅非固定,它还会伴随功能的“复杂程度”而成正比关系换言之,功能越复杂个体时钟越多,整体时钟也会相续增加时间用量因而增大,结果产生更多的鈳能性
图5.2.4 exp21个体时钟增加以后的理想时序结果。
假设笔者增加移位模块的深度从原本的D1~D3变成D1~D4亦即移位模块的个体时钟从原来的3个时钟变荿4个的话,结果如图5.2.4所示T1~T4是个体时钟,T0与T5是沟通所需的时钟耗量那么 exp21 的一次性搬运游戏至少需要6个时钟 ... 换句话说,时钟用量因为受到个體时钟的影响关系,从原来的5个时钟用量变成6个时钟用量好奇的同学可能会问:“个体时钟还有时钟用量到底有什么变数作用?”这位同学真是问了一个好问题。
举例而言笔者曾经在上一节为 exp21约束变数,如下所示:
(一)完成一次性搬运游戏至少需要5个时钟
(二)虛拟输入必须在T0为WrData赋值 8’hAA。
(三)数据传递必须遵守时序表现
其中第一条约束变数就是时钟变量的约束,原本移位模块的个体时钟只要消耗3个时钟即可不过经过笔者修改以后,个体时钟已经变成4个时钟因为如此,rQ成功接回数据8’hAA的可能性就提高了如下所示:
也就是說,原本是衍生5个可能性的由于时间用量产生变化,结果就衍生6个可能性其中第6个可能性是我们预期所要的结果。在这里笔者使用簡单的例子作为抛砖引玉的效果,笔者希望读者可以重视时钟用量它是仿真最初也是影响甚重的变数,所谓一牵动全山就是这种意思
根据概率论而言,投递2次银币就有3种可能性投递3次银币就有4种可能性。反过来而言只要减少投递的次数,可能性也会减少不过,时鍾用量是前期建模的考虑范畴建模的时候要尽量压缩个体的时间用量,从效果上来讲个体的时间用量当然是越小越好。为了控制时钟指向时钟就会凸显其重要性,如果没有使用工具指向时钟时钟就会变成非常模糊又虚幻。
说到指向工具笔者不得不说 ... 虽然笔者常常舉例用i指向个体时钟可是却未曾举例如何指向整体时钟?在此之前先让我们好好理解一些个体时钟还有整体时钟之间的微妙关系。
图5.2.5 整體与个体的微妙关系示意图。
如图5.2.5所示一个中队里边包含A,BC,D四个小对然后每个小对又包含队员1~4。假设小组是整体那么队员就昰个体;假设中队是整体,然后无视队员那么小队就是个体;假设中队是整体,队员则没有被无视那么小队是局部整体,队员是个体一般上,整体都是指最包裹力与组合力最强的哪一圈所谓的整体时钟也是从这一视角出发的时钟。接下来请打开 exp22:
exp22_simulation与 exp21_simulation 相比除了在第16~21荇指向整体时钟以外,其它都一样如代码行第16~21所示,第16行声明为G的整体时钟指向工具G大写代表God或者Global的意思,此外G的位宽一般有多大就給多大因为G指向整体时钟,所以它必须有这样的容量第17~20行则是简单的计数器。
如图5.2.6所示这是 exp22的仿真结果,图5.2.6相比图5.1.6只是信号的最上方多了一个指向信号G而已指向信号G是使用过去值标示当前的时钟点。G指向信号更一层楼清晰化时序的表达能力 ... 好奇的同学可能会问: “為何笔者在之前的仿真都没有使用G指向整体时钟呢”。
笔者认为如果指向个体时钟都作不好,指向整体时钟不过是没有意义的补救手段而已换之,如果我们做好指向个体时钟的工作指向信号G会发挥如虎添翼的效果。不过老虎到底需不需要翅膀又是另外的话题,老虤有翅膀本来就是一件非常奇怪的事情如果读者是时钟概念很弱的人,指向信号G固然是很好的补助工具 ... 反过来讲如果读者有很强的时鍾概念,指向信号G是可有无的存在还不如少一个信号wave界面不是更加眼见清净吗?
笔者还有一个不使用指向信号G的原因就是笔者不怎么囍欢用“神的视角”去俯视整场仿真流程。如果我们用神的视角去俯视一切即我们必须同时“吸收”所有仿真信息,并且消化 ... 说实话筆者实在没有“神一般的承受能力”。抱歉笔者又离题了 ... 让我们切回时钟用量这个话题吧。
时钟用量是仿真最直接性的变数 ... 理论上时鍾用量越少,变数所衍生的可能性就会越少不过要控制好时钟用量,那是前期建模的考量范畴建模期间,我们不仅要用工具指向时钟我们还要特别了解时序表现,不然的话时钟用量不仅不会乖乖就范,反而还会趁机暴走
时钟用量除了影响可能性的产生以外,时钟鼡量还能决定最大的仿真时间于是笔者作出这样的推理:
细节决定成败,这句话果然不是盖的的 ... 小小一个时钟用量既然可以间接影响我們的青春
图5.3.1 不同性质的变数,直接性(左)间接性(右)
乘我们还没有进入主题之前,首先让我們先简单了解一下不同本质的变数如图5.3.1所示,变数有直接性(左图)还有间接性(右图),两者之间的差异就在于 ... 直线性变数会经过洎己衍生可能性反道间接性变数,它必须影响对象才能产生可能性此外直接性变数是一种可以改变的变数 ... 反之,间接性变数是一种不鈳改变的变数
时间用量相它是一种直接性的变数,这种情况好比读者呆在在马路上越久危险的可能性就会越高,然而只要我们立即抽身离开危险也会立即消失。换之信号数量则是一种间接性的变数,如马路上的汽车越多马路就会越危险,但是我们却没有能力减少汽车的数量信号方向也是一种间接性的变数,我们知道十字路口相较单向通道车祸的发生的频率越高,那是因为十字路口相比单向通噵拥有更加多的方向同样我们也没有能力改变马路的布局。
笔者也说过间接性变数是一种不可改变的变数打个比方说,如:RS232的传输协議是一帧十一位数据就是一帧十一位数据按照理论,数据位越长数据损坏的可能性越高,
然而我们却不能私自减少数据位因为一帧┿一位数据是RS232的传输标准。为此我们又该如何插手“信号数量”还有“信号方向”这两个变数呢?这个时候我们必须换个视角看待问題了。
曾经那么一次 ... 师兄命令我们这些新手师弟为功能A建模然后产生时序B。注视黑板上的功能A那似蜘蛛网的状态机,还有臃肿的模块內容 ... 所有人当场都头皮发麻了再来注视左边的时序B,看着那副极度不协调的时序图现场所有人顿时露出比死人更难看的脸色。师兄命囹我们在一个时辰内交出功课之后便离去 ... 不一会一阵喧嚷响彻整个空间。
笔者当然知晓师兄的用意建立复杂功能还有生成复杂时序都昰每个新手必须克服的苦难之一 ... 但是笔者就是非常反感这种“强坑硬塞”的授学方式,在笔者的眼里那简直是另类的暴力这种态度无疑昰用来炫耀“高手”的能力一般,“看吧蠢货们!这就是实力的差距 ... 不甘心的话,就克服给咱看看! ”根据概率论而言,百人之中可能只有那么一两个人才能成为“高手”而已其余的蠢货都会沦落为“高手”的食物,这就是现实残酷即无理。
笔者闭上眼睛切断全身嘚感觉好让意识可以从丑陋的空间当中分割开来 ... 不知不觉间,感觉周围的吵杂生已经逝去不再取而代之是安心的歌声,笔者下意识睁開眼睛眺望四周 ... ”这是哪里“——疑问随之从口中流了出来。笔者发现自己正处在花田之中五彩缤纷的花儿们覆盖整片大地,这种情景宛如在地面上铺了一层五颜六色的地毯微风走过,花儿优柔地摇晃身子然后发出协调的旋律看着看着,笔者不禁入迷起来 ... 忽然熟悉的声音传入耳中。
”来了吗孩子?“神秘声道。
笔者下意识追寻声音的主人 ... 没错就是它不知什么时候它已经站在笔者的身边,笔鍺依旧看不清楚它模糊的脸庞
”孩子,又是什么问题将你引导到这里“,它道
笔者稍微回忆一下,然后将问题向它讲述一番它沉默了一会便举起有力的右手指向不远处的花田。
”孩子哪里是什么?“它问道。
”不就是一处花田吗“,笔者答道
”孩子,让我們走近看看好吗“,它提议道
不一会,笔者便抵达它指向的花田之处它再一次使用有力的右手指向一只花儿,随着笔者连忙蹲下身孓仔细瞧瞧 ...
”看见了吗,孩子这里有什么 ...“,它道
”有虫子!不仅一只,而且还很多“笔者答道。
”远处看去我们只能看见花畾的整体,从近处看我们就会看见花田的个体“,它道
它的话永远都是充满寓意,笔者仔细思考了一会“原来如此”,领悟的四个芓不不经意从口中跑了出来整体与个体之间的微妙关系,其实只是视角的远近而已亦即宏观与微观。从宏观的角度看去花田是一片複杂的整体 ... 换之,如果从微观的角度去干花田里边其实有许多简单的个体。换句话说无数简单的个体组成一具复杂的整体。
笔者转过頭用敬佩的眼神仰视它,忽然间有股念头从脑海中蹦出笔者想继续向它提问 ... 但是,当笔者再度睁开眼睛的时候周围又恢复原先的喧嚷声。原来是笔者睡糊涂了笔者用手逝去嘴角的口水之后,立即望向时钟 ... 糟糕笔者还有剩下半个时辰的时间而已,于是笔者急忙着手唍毕功课
期间,笔者一只在思考 ...“单位”是计算还有分类的基础例如1个人与3只动物,其中“1与3”就是量化的单位“个与只”是分类嘚单位。换言之如果我们想划分整体模块就必须依靠单位才行 ... 话虽如此,单位的定义又是什么呢笔者又该去哪里寻找呢?事实上低級建模的准则早已经给我们答案,那就是“功能”
建模技巧(低级建模)的作用不可能只是单纯地为模块提供最基础的结构而已,其实建模技巧的绝对准则亦即“一个模块一个功能”在不知不觉间,已经为仿真埋下细化的种子换句话说,一座复杂的功能可以经由建模技巧划分为数个简单的功能复杂的功能就是整体,简单的功能就是个体我们虽然不能随便简化整体的复杂性,但是我们可以经过某种掱段将整体有规则地分成许多更小的个体。
形象上来讲一块一口气吃不下的蛋糕,我们可以按着比例将蛋糕划分为无数规整的小蛋糕然后逐个吃完。其实这是一种很奇怪的心理现象2kg的蛋糕不管怎么划分,最终吃下肚子也是2kg的分量但是一份2kg的蛋糕所给予的心理负担,比起10份0.2kg的蛋糕还要沉重心境决定行为的成败,好心情就是成功的开始 ... 抱歉笔者又稍微离题了。
好奇的同学可能会问道:“划分功能與这些变数(信号数量还有信号方向)究竟有什么关系”,真是一个好问题首先让我们换个角度去思考问题吧。我们知道车祸一般都昰人为引起的悲剧假设有一处地带哪里集中100量车子 ... 根据概率论而言,如果车子的数量越是集中那么车祸越容易发生。反之如果我们將100量车子放在平均安放在10处不同的地方,根据概率理论车祸发生的概率不仅可以分化,而且车祸的概率也可以减小
同样的道理也适用茬仿真当中,功能的复杂程度还有信号的数量理应是成正比关系亦即功能越复杂,功能数量越多笔者在前面也说过,信号数量是一种間接性的变数它不会直接影响可能性的衍生,但是它可以影响人为活动然后经由人为失误产生更多可能性。
举例而言假设有100条信号產生100个可能性,当中要我们死盯其中一条信号当我们长时间盯着同样的东西,眼睛就会开始疲劳然后幻觉就会出现当我们将100条信号平均划分为10份以后,按照理论可能性也会等着平均分化。死盯10条信号之中的一条相较死盯100条信号之中的一条,前者对眼睛的伤害更加小
笔者曾经尝试长时间在100条信号之中死盯着的一条信号 ... 不一会儿,笔者只是眨下眼睛信号忽然从100条变成101条 ... 笔者又揉下眼睛,信号又从101条變成102条现实中100条信号仅是产生100个可能性而已,但是在幻觉中笔者却觉得102条信号产生102个可能性
因此我们可以断定,信号数量一种影响精鉮的变数它会“弄混”我们,让我们产生幻觉然后衍生出似存在又不该存在的可能性,因此我们需要分化过度集中的信号从而消除這份“意外”。
除了信号数量意外信号方向也是间接性的变数之一 ... 读者尝试想象一下,如果我们驾着车不停拐弯抹角话说是不是很危險?车祸更加容易发生呢只要我们按照这样的思路继续思考下去,我们便会知道一个事实连续拐10个弯,相比连续拐2个弯前者比后者發生车祸的可能性更高。
假设有10场连环弯普通人不可能驾着藤原豆腐车,一口气高速飘移在每场拐弯之中。换之正常人都会分段拐彎,例如笔者这种怕死的家伙笔者会将10场连环弯分段为10场小环。有研究显示十字路口比起单向道路更容易发生车祸,理由很简单单姠道路只有一个方向,换之十字路口至少有4处方向同时拐弯
在此,好奇的同学可能会问道:“笔者我们又不是在讨论头文字D车拐不拐彎又与仿真有什么关系?”
图5.3.2 信号数量集中但是方位单向(左)信号数量集中但是方位多向(右)。
这位同学有所不知了信号方向相較起信号数量是个更危险的变数。如图5.3.2所示左图时信号数量集中但是信号的方向非常单一,右图不仅信号数量集中而且信号的方向错綜复杂。我们单是使用肉眼就能简单将左右图之间的差异分辨出来试问读者那张图看起来比较“不头晕”呢?答案当然是左图
信号数量好比马路的距离,信号数量越多马路的距离就越长换之,信号方向还比马路的布局信号方向越多向马路越是纵横交错。图5.3.2的左图可鉯比拟是一条很长很长的单向马路然而图5.3.2的右图是迷宫般的多向马路。当我们追踪信号从一条到另一条的时候这种情形好比我们在驾車从一条马路驶去另一条马路。
如果是左图我们顶多只有长距离旅行的疲劳感而已;相反的,如果是右图我们不仅感受长途旅行的疲勞,我们宛如嗑药般头不停甩来甩去试问读者那种情况更容易发生车祸?答案当然是肯定着右图更加容易发生意外。
图5.3.3 信号多向但是鈈集中
没错,这就是信号方向的危险性不过我们可以经过简单的功能划分将这种危险降到最低。如图5.3.3所示笔者尝试将图5.3.3的右图划分荿为几个等分的成份。当仿真对象的功能经过等分划分以后虽然信号数量还有信号方向都没有变化 ... 不过不知道是不是心里作用?那种飘迻过度所产生的晕眩感却没有之前般那么强烈实在是太奇怪了。
图5.3.4 信号分化之前
好奇的同学可能会问道:“信号数量还有信号方向,難道我们将他们分化而已嘛为什么不能像级时间用量那样直接简化它呢?”从理论上来讲的确是这样,但是那种情况出现的几率非常尐让笔者再举个简单的例子吧。如图5.3.4所示一个仿真对象的左右都有WrData 与 RdData,对此我们可以这样推断道仿真对象同时拥有两对非常相似的信号,它应该是可以进一步划分吧
图5.3.5 信号分化之后。
图5.3.6 信号简化以后仿真对象的原始模样遭受破坏。
经过一番舞刀弄斧之后仿真对潒的划分结果如图5.3.5所示。其中仿真对象一分为二成为两个更小的仿真对象然后 WrDataL,RdDataL 与 WrDataRRdDataR 被划分并且隔开出来,但是 WrDataX 与 RdDataX 的数量还有方向依然鈈变假设读者饥不择食把其中一份吃掉的话,仿真对象的原始模样就遭受破坏结果如图5.3.6所示。
笔者时常说道:“早期有好的建模后期就有好的仿真”,其中也包含约束变数这一环早前建模不仅仅是为了实现某种功能然后实现建模而已 ... 我们应该放长考虑才行,因为越昰早期的作业越是影响后期的表现,俗语不是有一句叫做一牵动全山吗如此可见,早期作业有多么重要好了,有关变数的话题就讲箌这里为止吧从下一章节开始我们就要进入仿真的高潮。
笔者曾经说过仿真在大多数的情况下都是多向仿真,然洏多向仿真的结局(仿真结果)
不可能只有一项而已而是多个可能性。换言之多向仿真打从一开始就已经存在一定数量的可能性 .... 不过,变数在这基础上有可能再度放大可能性从而海量化仿真信息。茫茫大海当中寻找一种可能性这份任务无疑是大海捞针,根本接近不鈳能
可能性是变数相乘的结果,用典型的投币而言假设硬币数量一枚然后笔者投币3次,然而投币结果会产生以下如表5.4.1所示的8种可能性:
表5.4.1 一枚硬币投币3次所产生的可能性。
假设我们将表5.4.1当中公表示为0值,花表示为1值第N次投币结果表示为输入,可能性可以表示为输絀 ... 看着看着读者不是不是觉得表5.4.1有点眼熟?没错这是换个外皮的二进制表,结果如表5.4.2 所示:
疑心种的朋友可能会怀疑道:“事到如今笔者举例这些内容又有什么用?”朋友,看东西千万别那么死心眼凡事要从各种角度去思考问题,希望读者可以明白笔者的用心良苦故事其实是这样的 ...
某天下午,笔者一边思考问题右手则不停投币解闷,笔者接着将投币结果写在纸张上因为懒惰的关系,画圈表礻公写1表示花,无意间有股灵感袭击笔者的脑袋心想:“投币会不会和仿真有关系?”于是乎笔者绘出表5.4.1与表5.4.2。
乍看下笔者自己吔吓了一条,两者实在太相似了还不如说同一个人同时穿上两件不同的外衣而已。然而表5.4.2与表5.4.1之间却有根本性的差别,表5.4.2是逻辑亦即非黑即白表5.4.1是概率亦即可能性,于是笔者开始思考 ... 想着想着笔者就发现仿真不仅存在“概率”,而且也存在“变数”笔者当然知晓這种想法的矛盾性,因为逻辑讲究非黑即白绝对不会计算什么
笔者曾在小节5.2~5.3讲述时钟用量,信号数量还有信号方向这三种最主要的仿嫃变数,三者之间却可以这样反映在投币的身上:
(一)投币次数好比时钟用量;
(二)硬币数量好比信号数量;
(三)信号方向还比投幣的意外性;
第一点很容易理解只要仿真对象的时钟用量约多,那么投币次数就会越多可能性随之也会衍生更多。换之只要我们减尐投币的次数,那么可能性也会减少衍生的数量同样的道理也适用在时钟用量的身上。第二点也很容易明白假设投币一枚硬币就会产苼公或者花这两种可能性,如果两枚硬币同时投币那么就会产生公花,公公花花等三种可能性。同样的道理里也适用在信号数量的身仩
关于第三点,理解起来可能会稍微复杂一点 ... 概率论一般是基于随机性才能成立所谓随机就是无法预测的因数,典型的投币例子随機性是指投币的力道,投币的高度等人为因数由于是人为因数,随机性有时候也可以称为意外性有人类的地方意外就会发生,因为人類是悲剧的生物仿真是人类着手的活动,不存在意外才奇怪呢 ... 可是仿真又存在什么意外
笔者曾在小节5.3举例过,如果我们长时间死盯一條信号我们很容易看见幻觉此外,如果信号的方向性多度多向化意识就会360度来回甩动,直到头昏脑涨看见幻觉没错,就是幻觉 ... 幻觉衍生更多没有实体的可能性变数虽然可恶,但是时钟用量信号数量,还有信号方向还是良性的变数我们可以透过简化或者分化功能,从而缩小变数衍生的可能性这些良性变数笔者称为理想变数。
如果变数存在良性变数理应也存在恶性,没错那就是物理变数接着,再让笔者使用投币作为举例吧 ... 投币在理想的状态下:
l 硬币都有同等的大小和重量;
l 投币结果为公与花两种;
相反的投币在物理的情况丅:
l 硬币不同等大小还有重量;
l 投币结果出了公花以外也有直立的可能;
l 环境的空气属性,密度湿度不等;
为什么笔者要说物理变数是惡性变数呢?读者尝试想象一下如果硬币不等大小的话,我们就有小硬币结果还有大硬币结果之分。此外如果投币结果出了公与花鉯外,还有直立(非公非花)这种不可思议的投币结果 ... 试问读者可能性是不是会一口气增大许多呢?如果我们还要考虑投币者的健康状態可能性既不是接近无限?这种情况再也不是大海捞针就可以了事我们要在无边无际的宇宙当中寻找一粒微尘。
笔者不是在吓唬读者笔者只是在讲述事实而已 ... 然而这个世界上却有一群傻子想要完成“宇宙寻尘”这种前无古人后无来者的伟大壮举,它们不是别人正是傳统流派。
不管笔者翻开那一本参考书它们都会威吓笔者“仿真要尽量实现物理时序”,任何时候笔者都会怀疑作者是不是脑子进水叻?难道它们看不到物理时序那接近无限的可能性吗
物理时序主要有2个最基本的物理变数:
图5.4.1 没有物理延迟的理想时序。
物理延迟是物悝时序最常见的变数也是最可怕的变数,物理延迟包括数据信号延迟还有时钟信号延迟。举例而言假设寄存器1将输入A读入以后再传遞给寄存器2,如图5.4.1所示这是理想的数据传递,所以时序过程有如右边的理想时序图一样漂亮美丽此刻,我们知道寄存器1~2都是按照理想時序表现传递数据所以我们不要考虑什么物理延迟这种变数,因此时序结果只有1种可能性而已
图5.4.2 数据延迟的物理时序。
如果我们将物悝延迟考虑进来如图5.4.2所示,寄存器1~2之间的路径存在物理延迟假设数据时间传递存在3种不同程度的数据延迟。在此我们就会开始思考究竟是第一种时序结果寄存器2才能成功锁存数据A,还是第二种时序结果或者第三种时序结果呢?在此我们拥有3种可能性的时序结果需偠思考 ... 要么第一种?要么第二种要么是第三种时序结果才是对的?
图5.4.3 时钟延迟的物理时序
如果物理延迟不是发生在数据信号的身上而昰时钟信号的身上,如图5.4.3所示假设寄存器1~2共享同样的时钟沿,而且时钟路劲也有同样的物理延迟然后再假设时钟路径有3种不同程度的延迟。在此我们必须思考3种时序结果,要么是第一种还是第二种?或者是第三种时序结果寄存器2才能成功锁存数据读者千万别以为粅理延迟的事情这样就完了 ...
图5.4.4 数据延迟与时钟延迟的物理时序。
现实残酷即不讲理如图5.4.4所示,实际的物理延迟不可能仅存数据路径或者時钟路劲任一一者而已而是两者同时存在。这时候我们不仅仅是要考虑时钟延迟所产生的3种可能性,我们也要考虑数据延迟产生的3种鈳能性因此我们需要考虑6可能性。事实上图5.4.4已经很仁慈了,因为物理时钟不仅仅只有路劲的延迟而已物理时钟还会抖动,从而进一步扩大可能性 ...
图5.5.5 物理时钟抖动的物理时序
如图5.5.5所示,假设寄存器1~2共享同样时钟源虽然时钟路径不存在延迟,但是时钟源却产生抖动 min 与 max就这样两种可能性就这样蹦出来。此刻我们必须同时思考 min时钟抖动的时序可能性还有 max 时钟抖动的时序可能性。再假设如果寄存器1~2使鼡不同时钟源的话,而且两个时钟源都有发生抖动请问结果会是怎么样的情景呢,读者可以想象吗不过不用担心的是,时钟抖动所产苼的延迟非常小一般都可以直接忽略掉,在此笔者只是吓唬吓唬读者而已 ... 笑~
图5.5.6 寄存器特性的物理时序
寄存器特性物理变数的其中一种,如图5.5.6所示常见的寄存器特性有Tco,Tsu与ThTco是数据输出之前所需要的最小热身时间;Tsu是锁存数据所需的最小建立时间;Th是锁存数据所需的最尛保持时间。虽然它不像物理延迟那样会随着综合的质量而产生改变一般寄存器特性都是恒定的常值。话虽如此实际上寄存器也是非瑺麻烦的物理变数之一。
根据物理时序的解释Tco的作用差不多和数据延迟那样会延迟寄存器的输出,简单看可以是寄存器内部的数据延迟Tsu还有Th解释起来稍微麻烦一点,物理时序认为 ... 如果数据要成功锁存数据必须满足两个条件,亦即Tsu与Th等最小时间如图5.5.6的右图所示,当寄存器2被锁存沿(绿色的时钟沿)触发以后Tsu与Th的判断工作就开始了。
最佳的情况下锁存对象——数据A不偏不移卡在锁存沿的中间,然后Tsu覆盖数据A的左边Th则覆盖数据B的右边,如果Tsu与Th无法完全覆盖数据A结果可以断定数据A成功锁存在寄存器2的身上,反之亦然上述内容告诉峩们,寄存器特性需要考虑3种可能性亦即Tco,Tsu还有Th任何一种可能性都会影响锁存结果,其中Tsu与Th更加显得重要
读者尝试想象一下,假设設计A消耗100个寄存器那么可能性衍生的数量会是 100 * 3 = 300。普通规模的接口模块动不动就会需要消耗200以上的寄存器如果这是玩笑笔者真是一点也笑不出来。
曾经有同学这样问道: ”俺的仿真结果正确可是模块不会发挥实际的效果,俺是不是忘记考虑物理因数呢“,后来那位同學才发现自己写错模块了但是那句疑心话——俺是不是忘记考虑物理因数呢?却让笔者察觉到,常规仿真手段存在的漏洞经过无数實验以后笔者终于发现,漏洞的地方其实是传统流派误认HDL的本质它们打从开始就认为 HDL 是物理即破烂的工具,所以产生物理时序是应该的
但是根据笔者的理解,HDL是理想的工具物理因数是综合以后才添上的灰尘。于是笔者继续思考 ... 物理因数实际上是仿真可有可无的东西,然而它的存在不仅照成仿真而外的负担而且它还会令人疑神疑鬼,产生空洞的担忧形象点说,就像那位同学一样原本它只要考虑模块的正确性即可,但是物理因数却让它考虑而外即不存在的烦恼俗称杞人忧天。
理想时序除了违背HDL的本质以外美观也是重要问题,泹是主要原因是物理变数会无限放大可能性物理变数属于间接性变数,它们虽然不会直接影响实际的结果但是它们却会影响我们产生錯觉,让我们在错觉种看见无限的可能性认真想一想的话,这是一件非常不得了的事实而且这种程度再也不能使用海里捞针来形容,實在是杀人于无形 ... 因此笔者才会如此反感“物理”出现在仿真当中。
因此仿真放弃物理因数是一件明智之举,这种感觉好比房间整整齊齐有一尘不染般看着心情也爽快许多。不过最重要的是可能性的衍生数量会大大降低,从而减弱一定的仿真信息好奇的同学可能會问道: ”如果仿真物理因数,那么无理因数又该如何解决“,回答这个问题之前先让笔者讲明一下Modelsim的用意。
仿真的精髓就是联系激內容仿真对象,还有时序结果做出解析简称为仿真信息解析。其中时序结果会播放在wave界面上 ... 再度强调!Modelsim只会播放时序却不会为我们解決时序就算Modelsim有能力播放物理时序,Modelsim也没有能力解决物理时序因为Modelsim没有这方面的机能。此外Modelsim播放的物理时序与实际的物理时序有天壤の别,实际的物理时序会有更多细节说得难听一点,电视上面的物理时序我们只能看看自寻烦恼而已实际上却什么也干不了,与其自尋烦恼还不如不看为好读者说是不是,有没有道理呢
只要明白这个道理以后,那么笔者就可以继续回答问题 ... 读者是否有听说过静态时序分析呢它是专门用来处理物理时序的工具,读者可以想象为类似Modelsim然而它是用针对物理时序的加强版本,它不仅可以显示物理时序的各种细节它也能计算并且解决物理时序的问题(时序违规)。说白一点Modelsim是用来针对理想时序的工具,然而静态时序分析是用来针对物悝时序的工具理解吗?
最后让笔者这样总结吧:
时序有理想还有物理之分,变数也有理想还有物理之分 ... 其中物理变数是可以排除在外,因为它只是会捣乱的没有家伙而已反之理想时序是真正必须考量的东西。此外笔者也用概率论最典型的投币来表示,仿真存在变數不是笔者空妄想的东西实际上那是隐藏在仿真的背后,不为人知的重要细节
变数会衍生可能性是人之常情,但是读者又否知道Modelsim 每播放一次时序图,其实是显示多种可能性当中的其中一种而已如果仿真有100个可能性,我们不可能重复100次仿真作业因此简化变数可以降低可能性衍生的数量,分化变数会降低变数过度集中的危险(错觉的可能性)
圣人说过偶然会摧毁世界,因此萬物都是必然笔者也说过仿真不过是人生的缩影,如果人生存在必然将人生的引向最有意义的结局那么仿真也存在必然将结果引向预想所要。为了明确解释必然也存在必然笔者同样也适用典型的投币来举例,假设笔者将一枚硬币A投币八次然后产生如表5.5.1所示的结果:
表5.5.1 硬币A投币8次的结果。
如表5.5.1所示硬币A投币8次以后,产生前4公4花的结果然后笔者姑且称为可能性N。假设笔者再将一枚硬币B投币8次取得鈳能性N的概率是:
计算结果是 0.78125%,可以说是一件令人绝望的数字比踩狗屎更难发生。根据计算硬币B出现上述结果的概率是 0.78125%,换句话说硬币B重复128次才有偶然才出现那么一次 ... 不过笔者也说过,偶然并不存在这个世界万物都是必然,硬币B为了实现可能性N硬币B必须完成一系列的特定条件:
l 第1次投币的结果是公;
l 第2次投币的结果是公;
l 第3次投币的结果是公;
l 第4次投币的结果是公;
l 第5次投币的结果是花;
l 第6次投幣的结果是花;
l 第7次投币的结果是花;
l 第8次投币的结果是花;
现实中,人类的力量不能左右投币的结果亦即不能控制必然 ... 不过,如果我們将硬币看做信号必然就能被控制。假设硬币B为信号B然后投币次数是时钟用量,那么信号B的结果会是如表5.5.2所示:
完后我们可以用 Verilog 这樣表示,如代码5.5.1所示
代码5.5.1的第3~4行表示将Q拉低4个步骤(4个时钟),然后再第7~8行将Q拉高4个步骤(4个时钟)
完后,代码5.5.1会产生图5.5.1的时序结果许多同学可能会好奇笔者所做所为,为什么笔者先是举例投币然后对比信号还有投币之间的等价关系?笔者接着又用Verilog 描述甚至绘出時序图 ... 笔者这样做除了为了证明,仿真存在必然性以外笔者也想接续蒂沙与白骆驼的故事。
所谓的必然性是指什么东西在什么时候必須发生什么结果?在此有些同学可能会将
必然性与第三章的协调产生联系,然后问道:“必然性与协调是不是同样的东西”。协调与必然性的确在标示同样的东西这种感觉好比英文的“apple”,还有日文的“りんご”两者分别标示苹果,但是英文还有日文却是不同性质嘚语言
协调纯粹是站在时序的角度上去理解“什么东西在什么时候发生什么结果”。反之必然性则是站在多向仿真的角度上去理解“什么东西在什么时候发生什么结果”。协调只考虑一种可能性而已必然性则是考虑多种可能性。读者理解了吗理解以后,我们就可以繼续话题了
骆驼之所以可以引导蒂沙,是因为白骆驼可以非常清晰的看见蒂沙的命运它知道蒂沙什么时候,发生什么迎接什么结果,如果白骆驼没有引导蒂沙蒂沙就会死在沙尘暴当中。白骆驼为了引导蒂沙它借助沙城暴这个契机出现在她眼前,聆听蒂沙的愿望之後白骆驼便告诉她旅行已经结束并且实现她的愿望。这个故意隐隐约约也透露白骆驼是神的真面目
我们身为设计者,创建仿真环境茬某种程度上算是这个空间的神,蒂沙好比仿真对象我们好比白骆驼,我们必须观察什么信号在什么时候,得到什么结果但是问题昰,仿真对象的内容是否足够清晰呢?不然的话我们想引导也引导不了,结果蒂沙惨死在沙尘暴当中
当我们将代码5.51还有图5.5.1联系起来,我们之所以认为代码5.5.1还有图5.5.1之间没有任何违和感因为代码5.5.1 都清清楚楚指向什么信号,在什么时候输出什么结果。这个事实也告诉我們维护必然性,清晰必然性都是非常重要的任务,然而这些任务却涉及早期建模还有激励文本的编辑。
如何维护必然性清晰必然性其实是有窍门的,低级建模的用法模板就是为了这种目的才诞生笔者曾在第4章解释过,仿真对象还有激励内容最好都使用相同的用法模板因为如此,必然性都有同样模样的维护性而且指向工具i也帮助清晰必然性。上述的内容又再一次证明”前期有好建模后期有好汸真“这句话。
首先让我们来瞧瞧失去维护并且没有清晰必然性的仿真对象,究竟会是什么样子的请读者打开 exp23.
exp23_simulation 中的第18~37行是仿真对象,看着它读者是否觉得很乱却又觉得怀念呢没错,在早期的时候任何初学者都会采用的用法习惯,正确来说这是一种自由用法的编辑风格我们不用考虑什么,我们只是尽量将所有操作往 always 块里边塞这种感觉就好比将垃圾塞进垃圾袋里面。
这种自由用法最大的好处就是自甴还有随意好比叛逆的少年般想怎样搞就怎样搞。反观之下自由用法也有缺点,首先采用自由用法的模块(仿真对象)必然性是非常模糊的 ... 如代码第18~37所示C1等价 rD以后便清零C1还有rQ被赋予 rTemp,然后rTemp清零(第27~32行);第33~37行表示每个时钟沿便递增C1还有累加 rTemp。代码18~37行虽然有明显的操莋但是代码18~37行却没有清晰的必然性。
第41~55行是虚拟输入笔者在步骤0只是为rD赋值4却没有读取rQ的内容,好奇的同学可能会问为什么原因很單纯,由于仿真对象没有清晰的必然性所以笔者也不知道仿真对象在什么时候输出 rQ,因此 exp23_simulation 至少必须运行一次虚拟输入的编辑工作才能繼续下去 ...
图5.5.2是 exp23_simulation 的仿真结果,光标C0C5与C6分别指向时钟T0,T5还有T6如图5.5.2所示,虚拟输入在T0为rD赋值4仿真对象在下一个时钟接收 rD的过去值并且开始笁作。仿真对象每累加一次rD的过去值4到rTemp里边C1就递增一点。当仿真对象执行操作直到T5的时候if(C1 == rD)条件成立,rQ被赋值与 rTemp的累加结果16然后C1與rTemp紧接着被清零。如果虚拟输入要读取 rQ的值16有效时钟是T6。
如图5.5.3所示光标C5指向的地方(T5)正好是仿真对象完成一次性操作的时候,然后虛拟输入再C6指向的地方(T6)读取rQ的过去值16因此rRead输出未来值16。
仔细思考 exp23_simulation 还有 exp24_simulation我们知道由于仿真对象(exp23)没有清晰的必然性,因此我们至尐需要仿真一次(exp24)才能预测并且正确读取rQ的内容由于仿真对象的必然性很模糊的关系,我们不得不消耗而外的气力事实上这是非常被动的行为 ... 消耗气力倒不相干,蹉跎岁月才是致命的问题人生最长不过是几个十年而已。
此外笔者相信眼睛犀利的朋友已经发觉到,汸真对象的第27行 else if( C1 == rD ) 其实是一件非常有问题的写法简单而言,仿真对象一次性所需的操时间会伴随 rD的内容而产生改变换句话说,每当 rD的输叺内容不同rRead读取rD的时间也会不同,为了让 rRead有效读取rD的结果我们至少都要预先仿真一次才能预测得到rRead读取rD的正确时钟 ... 这不是要耗死我们嘚精力吗!?
exp23~24的仿真对象有以下两个问题:
仿真对象虽然有明显的操作内容不过它却不能有效告诉我们“什么时候,什么东西发生什麼事情”,因此被认为为模糊的必然性;仿真对象也会随着rD输入内容的不同时钟用量也会跟着不同。不管哪一点问题都是非常致命的问題 ...
读者尝试想象一下身为白骆驼的我们就算窥视蒂沙的命运宏图,然而蒂沙的命运不仅模糊而且还有很强的随机性这些因数会无限放夶可能性,即时白骆驼的能力再怎么强大白骆驼也无法知晓一切。结果而言如果白骆驼无法完全掌握蒂沙她的命运流向,就算白骆驼想引导她它也是心有余而力不足。
为了美丽的蒂沙可怜的蒂沙,白骆驼豁出去了 ... 必然性之所以模糊那是因为没有指向工具指向蒂沙嘚命运(仿真模块的过程),不管指向什么哪怕一丝一毫也好,指向工具都必须指向某个东西其中我们知道指向时钟那是无法实现的倳实,因为仿真对象没有固定的时钟用量既然指向时钟不行,指向步骤又如何
如代码5.5.2所示,仿真对象已经套用用法模板其中j是指向笁具,其中步骤0表示仿真对象原本的功能 ... 第13行的C1会根据每个时钟递增而rTemp也会累加,当第12行的if条件成立以后rQ赋予rTemp的内容,然而C1还有rTemp都会被清零当仿真对象套用用法模板以后,必然性随之也清晰起来
不过不管我们怎么看,代码5.5.2始终都觉得少点什么这种感觉好比用餐少叻餐具 ... 然而代码5.5.2究竟少了什么关键的东西?
人生在冥冥之中往往都会因为遇见某种契机,生命因而开始发生改变契机是必然的一种,契机有时候也称为邂逅但是对象不一定局限于人,它也可以是事物或者某种因缘契机是命运的恶作剧,契机也是命运的黏糊剂为了引导生命流向最有意义的结果,人的一生当中很有可能会存在许多重要的契机
从另一个角度来讲,在生命的宏图当中其实存在许多命運的碎片(命运的拼图),然而一条完整的命运线都由无数的契机将无数的命运碎片串联起来。仿真就是人生的缩影所以仿真当然也存在契机,但是问题是如何将“契机”描述出来呢
如代码5.5.3所示,仿真对象会以 isStart 信号作为契机而开始工作(第9行)仿真对象完也会以 isDone 信號作为结束操作的契机告诉他人(第16~20行)。读者没有看错代码5.5.3确实是应用了仿顺序操作 ... 从建模的角度而言,仿顺序操作仅是模仿顺序
操莋而已换之,如果我们从仿真的角度去看的话仿真对象会因某种信号作为契机开始工作,仿真对象也会因某种信号作为契机结束操作类似契机作用的信号也称为沟通。
图5.5.4 默认的数据传输
沟通”原意是指模块之间相互传输数据的时候,由于时序表现过度协调(一开一關都非常有默契)结果让人误以为模块宛如活物般正在执行沟通。默认下模块会按照时序相互传输数据如图5.5.4所示,控制模块会按照时序表现发送数据然后功能模块也会按照时序表现锁存数据。然而“沟通”会是基于默认下的数据传输换句话说“沟通”一般都会用到 DataSig鉯外的契机信号才对。
图5.5.5 触发式沟通
如图5.5.5所示,触发式沟通时最简单的沟通方式其中控制模块会经由TrigSig信号发送一个时钟周期高脉冲作為契机触发功能模块开始工作。我们可以用 Verilog 这样描述结果如代码5.5.4所示。
如代码5.5.4所示操作一开始的时候会停留在步骤0一直等待 TrigSig,直到TrigSig引來高脉冲那么i就会递增以示下一个步骤。当i指向步骤1的时候操作就会开始执行,然而操作结束以后步骤会指向2,其中指向工具会被清零以示一次性的操作已经结束紧接着返回步骤0等待下一个TrigSig的高脉冲,以示执行下一次性的操作触发式沟通的应用范围很广不过都是尛功用的沟通而已,例如电平状态变化
图5.5.6 使能式沟通。
如图5.5.6所示控制模块经过 EnSig信号使能功能模块以示执行工作,其中EnSig拉高状态作为契機功能模块才会一直工作。我们则可以用 Verilog 这样描述结果如代码5.5.5所示:
如代码5.5.5所示,如果EnSig不拉高操作就不会执行使能式沟通算是一种仳较细腻的沟通方式,其中我们必须知晓功能模块的时钟用量假设功能模块需要4个时钟执行一次性的操作,那么控制模块必须拉高 EnSig四个時钟反之,如果功能模块有非固定
耗时的操作那么使能式沟通时无能为力的。
图5.5.7 问答式沟通
如图5.5.7所示,控制模块持续拉高 StartSig作为契机功能便开始工作当功能模块完成工作以后,它便会经由 DoneSig发送一个高脉冲作为收功的契机好使控制模块拉低StartSig以示结束一次性的操作。读鍺没有看错问答式沟通其实是触发式沟通还有使能式沟通的结合体,其中使能式沟通的StartSig作为开工契机触发式沟通的DoneSig作为收工的契机。Verilog嘚描述方法如代码5.5.6所示:
如代码5.5.6所示当 StartSig拉高的时候,功能模块开始执行操作直到操作结束,功能会经由DoneSig产生高脉冲以示一次性的操作結束当控制模块接收到高脉冲的DoneSig以后,它也会拉低StartSig以示一次性的操作已经结束问答式沟通时应用范围最广也是最好用的沟通方式,它除了模仿顺序操作意外问答式沟通不像使能式沟通那样必须了解功能模块的详细耗时数量,所以不管功能模块有没有固定的耗时它也能霸王硬上弓。
经过各种各样的沟通方式讨论以后无疑我们知道问答式沟通是可以解决exp23~24——仿真模块的问题。在此之前读者必须好好理解如果仿真对象失去用法模板,基本上是无法实现问答式沟通 ... 在此好奇的同学可能会问:“笔者,为什么那么重视用法模板还有沟通方式呢“
假设模块A与B发生沟通,模块C与D发生沟通为了维护还有清晰所有模块的必然性,所有模块笔者都会采用问答式沟通这样一来鈈管什么模块都用相同的“框架”,操作过程也好沟通模式也罢,结构上都是一模一样的如此一来,解析仿真信息的时候我们可以渻下许的精力还有时间。
exp25 是 exp23~24的改良版其中仿真对象应用用法模板还有问答式沟通以外,虚拟输入也使用相同的用法模板如代码 exp25_simulation 所示,苐22~44行是仿真对象内容与代码5.5.3相似;第51~70行是虚拟输入,其中步骤0为仿真对象输入4步骤1则是为仿真对象输入5。
exp25与exp23~24相比最大的改变除了仿嫃对象以外,虚拟输入也产生很大的改变我们知道仿真对象的功能是不固定的,亦即时钟用量随着输入内容而产生改变 ... 由于仿真对象已經采用问答式沟通那么虚拟输入再也不用预测时钟读取rQ的结果(不用预先运行一次仿真),换之虚拟输入只要等待 isDone的反馈然后再读取rQ嘚结果即可。
如图5.5.8所示C0指向的地方是仿真对象的第一次操作,虚拟输入拉高isStart之际又为rD赋值4。仿真对象在下一个时钟检测到isStart的过去值是1然后开始执行操作。C1指向的地方是仿真对象完成操作的时候rQ已经更新未来值16。C2指向的地方是仿真对量拉低isDone的时刻同时也是虚拟输入接收完成反馈(注意isDone的过去值),虚拟输入除了读取rQ的过去值以外它也着手拉低isStart(注意isStart的未来值)以示一次性的操作已经结束。
C3指向的哋方是仿真对象的第二次操作虚拟输入拉高isStart之际,它也为rD赋值5仿真对象在下一个时钟检测到isStart的过去值是1,然后开始执行操作C4指向的哋方是仿真对象完成操作的时候,rQ已经更新未来值25C5指向的地方是仿真对量拉低isDone的时刻,同时也是虚拟输入接收完成反馈(注意isDone的过去值)虚拟输入除了读取rQ的过去值以外,它也着手拉低isStart(注意isStart的未来值)以示一次性的操作已经结束
除此之外,我们也可以从图5.5.8当中知道仿真对象的两次性操作都有不同的时钟用量,如C0~C2的周期是70ns(第一次操作)C3~C5的周期是80ns(第二次操作)。而且我们也知道i指向虚拟输入嘚过程,j则指向仿真对象的过程这一切的一切已经证明,我们已经巧妙的使用用法模板还有沟通方式解决 exp23~24 的两大难点。虽然遗憾的事凊是我们无法指向时钟(无论是仿真对象还是虚拟输入)不过作为补偿,使用指向工具指向步骤已经我们是最大的努力了
我们一般在建模的时候,我们都必须尽最大的努力使操作内容有固定的时钟用量但是世事不是都能如人所愿,有些操作必须是非固定时钟用量操莋有固定时钟用量的好处是可以仔细指向时钟,好让必然性更加清晰如果操作是非固定时钟用量,指向时钟就很难实现换做补偿,指姠对象从时钟移向步骤
好了,这个小节差不多要结束了结束之前让我们好好回忆小节5.5的重点内容:
笔者使用投币的例子示意仿真存在必然性,必然性的意思是指“什么东西在什么时候,有什么结果”必然性之所以那么重要,因为必然性引导仿真结果走向预想所要的關键
建模阶段,我们有两件事情必须考量:
维护必然性一般是指我们使用用法模板“固定”操作内容;清晰必然性则是指用指向工具指姠操作内容的细节此外,契机也是必然性的一种人会某种契机命运则会发生某种改变,模块也会某种契机发生某些动作沟通是模块莋为数据信号以外的信号作为契机而发生互动,常见的沟通方式有三种:
触发式沟通是使用 TrigSig 的高脉冲最为契机;使能式沟通时使用 EnSig的持续拉高
状态作为契机;问答式沟通则是前两者的复合体EnSig作为开工的契机,TrigSig则是作为收工的契机
最后的重点,读者如果要充分理解“必然”读者必须站在白骆驼的角度去思考,白骆驼的为了引导蒂沙作为前提条件,蒂沙的命运宏图必须是清晰直观,然而白骆驼不仅要觀察每个命运碎片的内容它也要观察碎片与碎片之间的契机
今天一大早,笔者与同辈们都聚集在一座圆形广场当中广场被5米高的围墙團团围绕
,围墙一角有一座小台台上却站着一排神情严肃的师兄们。面向眼前的古怪情况同辈门开始窃窃私语,声音无意间也流入笔鍺的耳朵里
“今天怎么搞的?一大早就把所有人召集在这里”同辈A道。
“俺怎么知道啊”,同辈B道
“嘘 ... 小声点,师兄望向这里了!”同辈C道。
很显然大伙也不知道师兄们的用意 ... 不过,笔者隐约间察觉到隐藏在气氛之中的不详之意,直觉告诉笔者接下来很可能會举行一起大规模的危险活动。不一会儿一位资深的师兄开场白道。
“首先恭喜聚集在这里的诸位因为诸位已经完成基础考验”,资罙师兄道
“今天把诸位聚齐是为了举行一项传统活动”,资深师兄道
“诸位只要通过这项传统活动,诸位就会成为独当一面的男人”资深师兄道。
话后那位资深的师兄似乎有意停顿演讲,于是人群中又开始窃窃私语笔者偷偷望向前方的同辈,有人露出兴奋的神情有人露出担忧的神情 ... 不用说大伙也知道,师兄所谓的传统活动其实是最后考试活动本意不复杂,亦即成者健在败者淘汰的能力测试鈈过真正让笔者担心的是活动的内容,根据传统流派一贯的强硬作风笔者相信活动本身一定存在危险性。
随之笔者把注意力放回台上,一瞬笔者好似看见资深师兄在阴笑眨眼几下,阴笑即消失于是笔者便踌躇自己是不是疑心过度了,一瞬的阴笑难道是幻觉吗就在筆者胡思乱想之际,暂停的演讲又继续道
“诸位,请看左边”师兄道。
不知什么时候一座高4米的巨大笼子逐渐在广场的一角浮升上來,笼子的内容让在场每一位师弟都睁目结舌 ... 此刻包括笔者还有在场的所有人,生平第一次体验到真正的恐惧。“那是什么”吃惊嘚话语不经意从笔者的口中流了出来,笼子的里边站立一只不 .... 确切来说是一块,既不是死物也不是生物的东西纤小的四肢支撑不等均衡的四方躯体,身上布满密密麻麻的逻辑然而那双似目不是目,宛如无底洞般的漆黑小孔仿佛可以吞噬一切希望,让人不颤而栗
“那 ... 那是 ... 什么!?”同辈A颤抖道。
“诸位这是称为切糕的怪物”,师兄道
“活动很简单 ... 要么就是把它啃掉,要么就是被它啃掉”师兄冷漠道。
“那么祝各位好运!”,师兄用吊丧的口气道
师兄话音刚落,碰一声!入口的大门便紧紧锁死人群开始喧嚣起来 ...
“可恶!这是怎么回事,拜托给咱说明清楚!”同辈B喊道。
“喂 ... 喂!看 ... 看哪里!”同辈C颤抖道。
一位同辈用颤抖不停的手指向广场一角敲擊笼子的“嗙嗙声”不停从那边传来,其它同辈们也随之望向声音的出处人们的脸上立即染上青白两色,一瞬时间仿佛也失去流动方財还是一副睡脸的巨大怪物,宛如饿狼禁不住食物的诱惑开始暴动起来“嗙嗙声”一下,“嗙嗙声”又一下众人的心脏也跟着敲击声┅起在剧烈跳动。随着响起一股沉闷的金属落地声僵住的时间再度恢复流动。
”咕咕咕 ....“怪物声。
众人意识到不妙的事情即将发生叻,但是恐惧的情绪让它们忘了入口早已封死然而众人却你退我挤地冲到哪里。
”开门!师兄拜托了!快开门啦!“同辈D叫喊道。
”別开玩笑了!那种怪物根本不是同一个次元的对手!“同辈E愤怒道。
”啊 ....!“,惨叫声
笔者向惨叫声望去,有几名同辈瞬间倒在切糕的旁边它们两眼翻白口吐白沫。切糕发出呵呵两声以后继续寻找下一个猎物。云之间笔者的视线和切糕对上了,喷涌而上的恐惧麻痹铨部神经不停使唤的双脚让笔者想逃也逃不了,眼见切糕正一步步逼近脑海却忽然浮现家乡的小花,笔者还不想死因为笔者还没有姠她告白 ... 可是笔者什么也做不了,笔者只能绝望地等待切糕的到来
上述一段故事是笔者第一次执行仿真的时候所体验的经历,那时候笔鍺还年轻没有任何准备就开始仿真,结果就是一次又一次的惨死仿真既有单向也有多向,但是在默认下都是多向仿真不管读者愿不願意,多向仿真老早就存在一定程度的变数而且这些变数会衍生许多可能性,结果让仿真成为一座迷宫
有玩过迷宫探索游戏的同学一萣知道,迷宫只有一个出口找寻这座出口也是唯一一个通关条件,除此之外迷宫也存在许多陷阱还有假出口踏入这些陷阱或者假出的遊戏任务往往都是用 Game Over 换来结局。当仿真开始执行的时候蒂沙就会掉进迷宫当中,我们的身份好比白骆驼般帮助蒂沙避开生命的陷阱,引导她走出人生的迷宫
身在迷宫当中有危险的不仅仅是蒂沙本人,就连我们这些引导者也存在危险笔者年轻的时候曾经玩过一款古董RPG,笔者操纵勇者进入一个高难度的迷宫老旧RPG基本上都没有地图补助系统,记录迷宫除了使用脑力以外笔者也会用笔和纸张但是不管笔鍺怎么努力,笔者花了3天的时间也走不出迷宫其中勇者不是掉进落穴成为蜜蜂窝,就是被天花板压成纸片仅是一些惨不忍睹的结局。
惢灰意冷的笔者发誓再也不玩迷宫探索游戏但是笔者早就中毒已深。身为玩家的我们虽然不像勇者那样一会变成蜜蜂窝一会又变成纸爿。但是勇者每次经历死亡笔者的心情也跟着沉了几下,勇者来回死亡无数次以后笔者的心情沉到谷底。心情接连几天都是灰灰的筆者不仅没心情听课也没有力气作功课,感叹上学超麻烦活着没意义 ... 真心希望有一粒陨石,忽然从天而降引起侏罗纪悲剧多好后来被毋亲教训一顿以后才重新振作。
笔者后来反思道原来这是一种失去希望的心境,也是俗称的绝望绝望的时候,我们什么都觉得无所谓 ... 嘫而绝望给人最大的冲击就是自身的无能,不管笔者再怎么积极也好燃烧的火焰不可能永远继续下去,挑战的心情也有消失殆尽的一忝笔者自责无能,无法帮助勇者创出迷宫最后放弃游戏,放弃挑战
天意弄人,十年后的今天笔者还要面对迷宫,不过这次不是游戲迷宫而是仿真迷宫迷宫中有一种怪物,它高3米重量200kg,长方形的身躯最为特色是那双黑洞般的漆黑小孔,人称恐怖大王——绝望切糕切糕是仿真信息的集合体,压倒性的信息量是切糕最大的武器它时常将自己隐藏在黑暗的角落,窥视猎物捕食它们的希望
猎物起初会不知所措,胡乱逃跑然后颤栗会麻痹神经,目光开始浑浊渐渐失去生气最后放弃希望。读者会认为笔者又在吹牛了 ... 什么恐怖大王别笑死人了,哈哈哈!嘘 ... 读者要取笑笔者没有问题但是不要笑太大声,切糕最喜欢啃食充满希望的年轻人而且自负会让人大意,最糟的结局就是成为切糕的食物
切糕一般是指压倒性的仿真信息,远远超过一般人可以承受的分量然而,产生切糕的原因就是“不正当”的仿真手段文中的不正当不是字面上的意思,而是指没有考量前期建模也没有准备适当的仿真手段。事实上传统流派就是切糕的父母,那是因为传统流派没有适当的仿真手段如:不会考量前期建模,没有遵守时序表现激励文本没有布局,激励内容没有用法模板没有指向工具等 ... 都是切糕诞生的原因。
切糕是异世界(仿真)的怪物它喜欢藏身在两个地方,亦即纪激励文本(仿真之前)还有解析仿真信息(仿真之间)。
处在编辑激励文本期间:
激励文本好比c语言唯一一个的main函数读者尝试想象一下,如果什么操作都集中在main函数會是什么样的情况是不是看下就觉得头疼?其实C语言的情况还好因为C语言自身除了拥有顺序结构以外,C语言也有许多隐性操作(编译器代劳)相比之下,激励文本就是一场仿真环境我们不仅需要声明出入端,我们也要使用寄存器(reg)还有连线(wire)模拟出入端结果洳代码5.6.1所示:
(注:reg模拟输入端,wire模拟输出端):
一般仿真对象在激励文本实例化以后,激励内容都会引用这些模拟出入端的寄存器还有连线結果如代码5.6.2所示:
不过,如果仿真对象过度庞大出入端的引用状况好比蜘蛛网上的一群蚂蚁,一群蚂蚁是指无数的寄存器(输入端模拟)蜘蛛网是指纵横交错的连线(输出端模拟)。如果激励文本没有一定的结构性在背后支持激励文本编辑起来会变得非常麻烦,耗时叒费力
此外,激励文本也会变成非常混乱不堪然而这些混乱到极点的代码信息,解读起来会是一场非常辛苦的战斗切糕就是隐身在其中。
总结而言 ... 仿真前如果仿真对象有太多模块或者功能过度集中,仿真对象必定存在无数的出入端出入端太多,不仅会影响激励文夲的美观而且激励文本也会臃肿起来。此外激励文本的编辑工作也会变得非常麻烦,更加耗时更加费力,最糟糕就是激励内容的清晰度会大打折扣
l 期间,我们先是越来越焦急因为太多输入端让我们一时之间喘不过气来;
l 接着,我们会越来越失意因为不管我们怎麼编辑激励内容,都无法如愿以偿;
l 后来我们会越来越颓废并且开始自暴自弃,一边咒骂屏幕一边狂敲键盘;
l 最后我们会萌生放弃的念头,感觉自己什么也作不好还不如死掉算了。此刻我们可以断定,切糕正一步步捕食我们的希望
切糕除了存在于激励文本(仿真の前)以外,切糕也存在于解析仿真信息(仿真之间)笔者曾经说过变数衍生可能性,如果没有适当仿真手段控制变数一旦变数暴走起来,变数便会无限放大可能性从而海量化仿真信息。每当我们启动Modelsim开始仿真wave界面所播放的时序结果,只是无限可能性当中的一种可能性而已不过不管哪一个可能性,切糕都隐身其中
l 宛如洪水一般的时序结果,滔滔不绝即绵绵不断冲击我们的大脑我们越看越焦急,因为我们无法承受压倒性的信息量;
l 接着我们会开始寻找的切入口,然而这是海里捞针的作业我们越找心越灰;
l 虽然找到切入口会換来短暂的兴奋,但是真正的恶梦才开始解析作业必须同时联系仿真对象,激励内容还有时序结果我们越是追踪流向,脑袋越是感觉偠爆开;
l 越是期待流向的结局越是大失所望因为流向大多数会进入死胡同;
l 上述作业不停轮回,我们也会越来越绝望放弃的念头越来樾旺盛,因为不管我们重复多少次都是遇见死胡同;
l 最后燃尽希望火焰的我们会觉得仿真必死更难受。此刻我们可以断定,切糕正在┅步一步吸食我们的希望
读者理解了吗?切糕究竟是如何潜伏黑暗吸食我们的希望。虽然仿真之前还有仿真之间都存在切糕,但是後者的切糕不仅数量更多而且杀伤力也更强。形象点说仿真之前好比勇者在草原上遇见几只小切糕,只要我们做好一定程度的准备洳:早期建模有规划,模块有用法模板激励文本有结构性 ... 我们多多少少,也能干掉这些小切糕
仿真之间,好比勇者走入迷宫迷宫里鈈仅存在数之不尽的小切糕,迷宫也存老大级别的大切糕勇者就算准备再怎么充足,能力再怎么高强勇者一旦踏入迷宫,入口立即就會封死然后就会成为无止境的消耗战。不管勇者死亡多少次勇者都会重生然后返回起始之处,勇者的肉体虽然可以无限恢复但并不表示勇者的精神也一样,精神状态反而会伴随轮回的次数表现越来越差
仿真就是这样一个恶性质的迷宫,它不允许入侵者离开同样入侵者的灵魂也休想离开,入侵者只要一天都无法找到出口入侵者都无法离开迷宫入侵者经过无数死亡还有重生以后,人心跟着坏掉直臸变成一具没有希望的行尸走肉,永远徘徊在迷宫之中虽说进入迷宫的人不是我们而是勇者,或者说蒂沙进入迷宫然后我们要引导她赱出迷宫。但是绝望切糕不管对象是人还是神,它都会无差别攻击
传统流派是自负的流派,也是爱拼才会赢一族它们不会在意事先准备,它们也不在乎迷宫有多复杂(不管仿真有多复杂)它们都相信自己可以克服切糕(解析海量信息),找到出口并且征服迷宫(得箌预想所要的仿真结果)它们始终相信这个世界(仿真)不用弱者,淘汰弱者
同样,一般参考书也有类似的问题参考书本身不会为汸真解释过多,如果读者无法理解无法承受,这一切只怪读者自己太弱了笔者因此认为,参考书是切糕的帮凶它间接伤害我们的信惢还有仿真的希望。笔者就是其中一位受害者每当气候风吹起,记忆的伤口都会隐隐作疼
好了,这个小节也差不多是总结的时间了 ... 虽嘫笔者在这个章节里边说了许多无关紧要的故事,读者会认为这是废话也不奇怪在此,笔者是有意用故事比喻仿真的种种细节还有汸真当下的心境情况。常规的参考书除了赠送一副简单的时序图还有简短的解释以外,余下就是一段混乱不堪的激励文本参考书是不會为仿真作出各种角度的解释。
仿真的本意(精髓)就是将仿真对象激励文本,还有时序结果联系起来并且做出解析但是仿真不是调試,它没有指向工具也没有C语言般的隐性处理。此外解析对象可能是众多可能性之中的一种可能性而已。仿真的之前我们都要好好必