楼上的靴子
在板子上,FPGA与ASIC之间的是以“异步”方式工作。双方一问一答。前面问的事有了答复,才接着问下一件事。过期不答,就要中断报警。对FPGA发来的每一个读写要求,ASIC都应该发回一个应答信号(ACK)。正常的ACK应该是一个负脉冲,宽度为一个时钟周期。可是我现在看到的却是另一番奇怪的情景:ACK脉冲迅速降到低电平,一个时钟周期后,却没有跳回到高电平,而是循着一条漫长的RC充电曲线返回,远远看去成了一个锯齿波。
难怪FPGA读出的数据要慢几拍!
FPGA在检测到ACK信号的负跳变后,就进入等待状态。一旦ACK回到高电平,就开始按规定的时序发送或读取数据。现在ACK产生了负跳变,却迟迟没有返回。FPGA则就像苏文茂的相声里说的那个老头儿,痴痴地等着楼上掉下的第二只靴子,却一直没有动静。老头儿没听到靴子响不敢睡觉,FPGA没看到期待中的高电平,也不敢造次,不能进行下一步的操作,被“干”在这儿了!
严格地说,FPGA楼上的第二只靴子还是掉下来了,只是晚了些。因为ACK电平的恢复虽然慢,但毕竟还是回来了。鬼使神差的是这个恢复时间并没有超过规定的时间间隔,所以FPGA也没把它按“超时”处理,产生中断。
“哥们儿不就是晚来了一会儿吗,你还动真格的?真要打911报警呀!”
“但你可是把我坑苦了!你不是有上拉电阻吗?怎么还这么磨磨蹭蹭的!”
这个ACK信号线上是应该有一个上拉电阻的。在ASIC一旦放弃对它的低电平驱动后,电源会经过这个上拉电阻对其快速充电,使之回到高电平。如果没有它,这个充电过程就要经过其它回路,其时间常数要远大于正常情况。所看到的结果就是这个德行。由于ACK的恢复周期拉长,返回的数据也就姗姗来迟。而测试平台只是进行功能检查,读写的速度要远低于实际系统的情况,对这种延迟不敏感。在系统中进行手动读写时,因为是手敲命令,更慢,当然也发现不了。
莫非我记错了?再翻ASIC的技术文件,没错呀!上面明明白白写着ACK输出端内部有上拉电阻啊!难道是做ASIC的那帮小子偷工减料?我得找他们!
ASIC的总体负责人叫戴维。他也是当年S公司留下来的几只大鸟之一。戴维和电影里的那个骑着扫帚乱飞的小男孩是一个地方的人。却没有印象中那儿的人的刻板。为人很热情幽默。据他说,当初离开那儿来这儿,就是因为受不了那里的沉闷和拘束。尤其痛恨的就是动不动就要西装革履打领带。现在除了说话还是舌头根儿发硬的哈利波特味儿,与其他人别无两样。
我风风火火地找到他:
“您老人家在那个ACK管脚上到底放没放上拉电阻啊?”
“哦,我得查查……”他倒是不着急。
过了一会他来到我这儿,靠着墙不紧不慢地说:
“我们的确有一个上拉电阻在那……”
“噢……”
“不过……”
“什么?”
“……那个电阻有效时间只有一个时钟周期……”
“嘛玩意儿?一个时钟周期?!您老这是嘛路子?”
……
费了好大的劲,我才从戴维的解释中明白点儿意思。
这个ASIC是由C公司自己设计的,但生产却要由IBM代工。就是现在那些“Fabless”公司常见的做法。要由别家公司代工,芯片的设计在一定程度上就要迁就代工公司的工艺要求,还要在性能和成本之间折中。在芯片内部,电阻实际上都是由处于各种状态的CMOS单元构成。ACK这个信号所处位置,要构成一个完全意义上的上拉电阻有些困难。于是就因陋就简用了一个逻辑代替,而且只在ACK处于低电平的状态下开通,以确保能出现一个负跳变。剩下的他们觉得无关紧要,不影响其他性能,因为很容易在板子上弥补。
所以说,技术文件上说有上拉电阻并没错,不过嘛……
听了这些,我不禁仰天长叹:这可真是IBM做的片子,真有大爷的风范!只管一个时钟周期,到点儿拍屁股走人。留下一个烂摊子要我来收拾。
到现在,原因已经彻底清楚了:区区一个电阻的事!因为它只有效一个时钟周期,驱动过后,ASIC的ACK端子就成了开路状态,只能靠FPGA一头的输入端一点儿微小的漏电流充电。等它再回到高电平,黄花菜都凉了!
想我半世“英名“,在这行儿里混迹多年,也算个吃过见过的主儿。没想到今天栽在一个不起眼的上拉电阻手里!天理何在?!
现在,楼上的那只靴子倒是掉下来了,可我还能睡吗?
{pagination}
迟到的惨胜
使出吃奶的劲儿找出的毛病,解决起来倒是轻而易举。虽然板子上没预留上拉电阻的位置,但是所用的FPGA支持在它的IO管脚上可以选择开通上拉或下拉电阻,只要在它的合成限制文件中指明即可。
急忙修改了FPGA,加上这个电阻。样机改好后,不敢再大意,又重新测试了一遍,确认正常。这时早已过了下班时间。我径直把样机拿到机房,插到软件组用的机架上,接好光缆,确认面板上相关的指示灯转为绿色后,才离开。
软件的那个哥们已经走了。我给他发了电邮,通知改动情况以及现在样机位置和状态,告诉他可以接着试了。我相信他一定在网上挂着,可以看到。
前方道路上的暗堡已经清除,现在,就看他的了!
两个小时后,我在家里收到了他发来的电邮。标题栏里写了个大大的“PING”。打开邮件,是他从终端上拷贝下来的测试结果,满篇的惊叹号看得我眼睛发花,心怦怦直跳……已经不用再去读他写的是什么了。
PING了!
向克丝蒂通报这个结果时她已经知道了。没有祝贺之类的表示,她反而对我发出了一连串的质问:
“为什么解决这样一个问题用了这么长的时间?”
“为什么没有让戴维他们复核一下你的FPGA设计?”
“为什么在设计中没有考虑到这些情况?”
“……”?
“……”?
这些天攒在她哪儿的那点儿火,终于有机会发出来了!
“对不起,这个结果得记到你今年员工考核的记录中去!”最后她说。
……
公司每年都要对员工的表现和成绩进行考核,半年小结,全年总结。用“低于期望”,“团队主体”,“优异表现”等三级来划分各项考核项目。考核的结果对奖金,工资以及级别晋升都有影响。
我没有分辨。尽管她的质问并不都在理。
虽然没有让戴维他们复核FPGA的设计,但是我们已经进行了全面的功能模拟。这要比人工检查Verilog代码要更全面彻底。
因为是功能模拟,像上拉电阻这类的东西就只是在相应的端口简单地设一个“1”, 反应不出这种“只有效一个周期”的情况。自然也发现不了这个问题。
“不是我们无能,而是这个电阻太狡猾……”
但说这些都毫无意义。让一个上拉电阻耽误了这么多天,真是“窝囊”的可以!今天的结果,和原来的期望相差太远。可以用“惨胜”来形容。无论对她,还是对我,都难以接受。
几天后,按惯例又举行了“PING party”。 但我却没有以往的兴奋。冰激凌吃到嘴里感到索然无味。
这本来应是一个多星期之前就吃上的!
看着周围谈笑的同事,我却笑不出来。有人前来说一句“Congratulations!”,我也不知回答什么是好。
我突然想起了美国电影“遥远的桥”中那个整天叼着雪茄的美国佬:
这个美军101空降师的上校,带着部队赶到了那座预定抢占的大桥桥头,却因一步之差,眼睁睁的看着德国人把它炸成了碎片。他对部下连哄带骂,对友军连求带吓,费劲九牛二虎之力,总算把桥又架了起来。可是已经比原订计划整整晚了六个小时。看着桥上隆隆通过的车队,欢呼的士兵,他却笑不出来,铁青着脸,骂了一句:“Shit!”
“……一个上拉电阻!”,我愤愤地想着。
几个月以后,到了员工考核总结的时候。在克丝蒂给我填写的考核表格中,我并没看到她说过要写的东西。多数考核项目都是“团队主体”的水平,有几项还给予了“优异”的评价。她还说,我现在的工资水平已经处于这个级别的上限,调整空间不大了。她已经着手申请给我调整级别,这样,有利于以后的涨工资……
谁都有着急上火的时候,她能这么做,就还是个好同志!对不?至于以前说过什么,咱就甭计较了吧!是吧?呵呵!
不过,这个上拉电阻的事,我算记住了!
作者:电子工程专辑博主merlin07
介绍: 吃烧饼油条长大,啃洋面包也已多年。装过8管的晶体管收音机,也设计过当时速度最高的路由器的单元。做过国营大厂的项目负责人,也干了多年北美高科技公司的工程师。虽然也曾走投无路,但成功后的兴奋和喜悦却是最让我难以忘记。一个出息不大,但却乐此不已的工程师虫子。
点击进入博客参与讨论:merlin07
本文属于《电子工程专辑》网站作者原创,谢绝转载。