请关闭浏览器的阅读/畅读/小说模式并且关闭广告屏蔽过滤功能,避免出现内容无法显示或者段落错乱。
“好。”他终于开口,声音有些沙哑,但很稳,“我这把老骨头,就陪你们年轻人,再折腾一回。”
“性能优化小组”成立的第一天,气氛有点尴尬。
办公室还是那个办公室,人还是那些人,但周毅和老马的角色,发生了奇妙的对调。之前是周毅写代码,老马在一旁挑刺。现在,是老马在一张大纸上画电路,周毅和几个年轻人围在旁边,像小学生一样听讲。
“看这里,”老马用铅笔头,指着一个由十几个逻辑门构成的复杂结构,“这就是‘超前进位’的核心。我们不用等低位的进位信号,像多米诺骨牌一样,一个一个传过来。我们用这个‘进位生成单元’,直接根据输入的A和B,把每一组的进位信号,‘预测’出来。”
他讲得兴起,唾沫星子横飞,眼睛里闪着光。这是他浸**了几十年的领域,每一个细节都烂熟于心。
周毅他们听得云里雾里。这些电路图,比教科书上的复杂一百倍,充满了各种巧妙的“野路子”。他们能理解单个逻辑门的功能,但当这些门以一种诡异的方式组合在一起时,他们就完全无法理解其背后的设计思想了。
“马总工,”周毅硬着头皮打断他,“您画的这个……这个‘进位生成’的逻辑,它的布尔表达式能写出来吗?”
“写那玩意儿干啥?”老马眉头一皱,“多麻烦!你照着图,用代码把它‘翻译’出来不就行了?”
周毅的脸憋得通红:“问题是……我们不知道该怎么‘翻译’。Verilog里,没有一个叫‘马总工的进位生成单元’的现成模块。”
“那就造一个!”老马理直气壮。
这句话,把周毅噎得半天说不出话。这简直就是鸡同鸭讲。老马的世界里,是具体的、看得见摸得着的晶体管和连线。而周毅的世界里,是抽象的、行为描述的代码。两者之间,隔着一道巨大的鸿沟。
一个下午过去,进展为零。老马画了一黑板的图,周毅他们记了满满一笔记本的笔记,但没有一行有效的代码被写出来。
晚上,吴佳栋把林秋拉到了一边,神色凝重。“小林,这样下去不行。他们这是两种思维体系的碰撞,根本不在一个频道上。老马想的是‘怎么搭’,周毅想的是‘怎么说’。这个问题不解决,那个‘方案C’永远也搞不出来。”
林秋点了点头,他白天也一直在观察。“我明白。我们不能强迫他们任何一方,去完全接受对方的体系。我们得找到一个‘中间语言’。”
第二天,林秋搬了一块小白板,坐到了优化小组的中间。
“马总工,我们换个玩法。”林秋说,“我们今天不聊整个32位的加法器,太复杂了。我们就聊一个4位的加法器。”
他转向周毅:“你,用你最熟悉的‘行波进位’方式,写一个4位加法器的代码。”
周毅很快就写好了,就是最简单的`assign C_out, Su= A+ B;`。
“好。”林秋又转向老马,“马总工,请您也画一个,您心目中最优的4位加法器的电路图。”
老马拿起笔,很快也画好了,正是那个“超前进位”的微缩版。
林秋把两样东西放在一起。“现在,我们的任务,就是让周毅的代码,经过综合之后,生成的电路,能和马总工画的图,一模一样。”
这一下,目标变得具体而清晰。
“周毅,你看马总工的图。”林秋开始引导,“他这里,是不是先把每一位的‘进位生成信号’G和‘进位传递信号’P算出来了?G= A B,P= A^ B。这个,用Verilog能描述吗?”
“能。”周毅点头,这很简单。
“好。那下一步,马总工用G和P,去计算最终的进位信号C1, C2, C3, C4。比如C1= G0|(P0 C0)。这个逻辑,能描述吗?”
“也能。”
“最后,再用每一位的P和C,去计算最终的和Su。Su_i= P_i^ C_i-1。这个呢?”
“也可以。”
林秋笑了:“你看,我们把马总工的‘设计思想’,一步步分解,翻译成了代码能够理解的‘逻辑步骤’。你现在把这些步骤组合起来,写成一个新的4位加法器模块,我们再来综合一次,看看结果。”
周毅和他的组员们恍然大悟。他们之前想的是如何一步到位地“描述”那个最终结果,却忘了可以把“过程”也描述出来。这是一种全新的编程思路,不是在写“行为”,而是在写“结构”。