请选择 进入手机版 | 继续访问电脑版
搜索
查看: 136|回复: 2

“钱多人傻死的早”?芯片开发的苦与乐(转载)

[复制链接]
发表于 2017-6-2 11:17 | 显示全部楼层 |阅读模式
很多人都觉得从事芯片开发或者软件开发是一件很苦逼的事情,确实事实多半如很多人感觉。因为这项工作有时加班到要死,很多从事这项工作的人员身体状态差到要命。换做任何一个外人可能都会觉得这项工作很苦逼吧,也难怪很多人喜欢调侃或者直述程序员的状态是“钱多,人傻,死的早”。业界有一张很有名的照片,我想很多人都应该看过吧,不知道你们看过是什么感觉,我反正是大笑了,然后感觉很心酸。大笑的原因是感觉太形象了,心酸的原因是你们为什么一下子就戳中了我的痛处。
1.jpg
芯片设计行业确实有很多它的不是,但是没有这个行业,没有在这个行业里兢兢业业奋斗的工作人员,人类文明,科技的进步不可能达到现在的情景。你也不可能用到这么便宜的智能手机,平板,汽车电子。事实上,芯片行业的竞争已经异常的激烈,很多的成本已经被压缩到不可能压缩的地步了,很多的利润已经达到了微薄,甚至亏本的程度了。所以有时我会和同事或者同学调侃,房地产行业或者中国的其他行业要是能像这样竞争就好了,或许很多人就不用这么劳累了。

我在这个这个行业呆了这么久,其实也早就萌生想写点什么的冲动了,迟迟未动笔的原因也有许多,一方面自己的经验积累还远远不够,很难写出与众不同的东西,很难让人从我写的内容中获取真正的知识;另一方面,真正踏入社会后,你的时间很多时候并不随你的意愿支配,你会忙工作,忙家庭,忙学习。不过庆幸的事情是,这些年来我还是做了蛮多的积累,也许还没到厚积薄发的程度,但是希望能够抛砖引玉,为后来者提供一点讯息和信息,为稍感迷茫的人指点道路。

后续,我会分节段发布我这些年来的一些积累,有心得感悟,有干货知识,这些都是平常记录。大致会分如下几个大的章节,其中每个大的章节会分若干个小章节:
一、时钟篇
二、总线篇
三、外设篇
四、片上系统
五、综合及时序分析
六、后端流程
七、软件测试
大抵如此,希望大家积极提出意见,指正错误,望与君共勉,共同进步!

一、时钟篇

前言
如果把SOC看成人的身体,那么时钟就是身体里的血液,没有血液身体不能获得能量,不能正常的生活,工作,学习;没有时钟,一颗SOC芯片不能够动起来,芯片中的电路不能正常的运作。血液在身体内会到处“走线“,流淌到身体里的每个角落,时钟在SOC芯片内也会”走线“,通常所说的时钟树大体就是这个道理。时钟遍及芯片的每一个角落,驱动着触发器进行数据的翻转,同时触发器又具备记忆功能,这样数据流会一级一级的传下去,经过电路的运算,最后输出想要的结果。
2.jpg
身体内的血液路径

这些路径遍及身体的各个角落,为身体补充氧气和能量,这样身体的每个细胞才能正常的活动,整个身体才能有机的运转下去。
3.jpg
时钟驱动触发器
时钟驱动着每级触发器的翻转,触发器的输出经过一定的电路逻辑运算,然后进入下一级触发器,这个SOC可以看成是由若干个 触发器串起来的电路链。
4.jpg
  时钟树

时钟树,是个由许多缓冲单元(buffer cell)平衡搭建的网状结构,它有一个源点,一般是时钟输入端(clock input port),也有可能是design内部某一个单元输出脚(cell output pin),然后就是由一级一级的缓冲单元搭建而成,具体的多少级,根据你的设置以及所使用的单元而定,目的就是使所用终点的clock skew(一般最关心这个)、insertion delay以及transition尽量满足设计要求。

IC芯片设计跨时钟域

芯片设计中最重要的就是时钟处理,如何处理好时钟的关系成为一款芯片成功的关键。通常来讲将时钟分为同步时钟和异步时钟两大类。

同步时钟:时钟之间有固定的相位关系。
5.jpg

异步时钟:同频不同相,两个时钟的频率是相同的,但是它们之间的相位是不同的;不同频率,两个时钟源不同。
6.jpg
7.jpg

为什么要处理跨时钟域?

A时钟域的数据传输到B时钟域,被B时钟域的触发器采样到,表面看起来好像没什么问题,整个传输的过程看起来很Happy的样子。可是如果我们时钟无限放大,传输的信号无限放大,自然而然你就会有疑问,会不会传输信号的跳变沿碰到了采样时钟的跳变沿?如果碰到了会出现什么问题,是采样到了0,还是采样到了1?很好,这个问题其实就引出了触发器的setup(建立)时间和hold(保持)时间。
8.jpg

A时钟域的信号传输到B时钟域,无法保证B时钟域触发器的setup time和hold time,这个时候就会出现metastability,也就是所谓的亚稳态,这个亚稳态是芯片设计中最忌讳的东西,它会传播到下一级,甚至引起电路的震荡,危害非常之大。最要命的是亚稳态问题进行仿真的过程中是无法发现的,很多时候是上了FPGA或者芯片回来以后才发现,但是这个时候多半已经晚了。
9.jpg

如上图所示,S是异步输入源,在clk上升沿采样的时候,s也发生了跳变,这个时候问题就出现了,q的输出是0还是1,q可能采样到中间值,所以可能随机成0或者1,功能正确不能保证,电路也会偶尔正确,偶尔错误。
10.jpg

上公式给出了亚稳态出现的频率,可以看出它和采样频率,异步数据源的跳变频率,触发器的setup/hold time的window有关。
11.jpg

上图示意了当亚稳态发生时真实的电路工作情况和平时的仿真情况,从上图看出,平时仿真和真正硬件工作时的数据可能差一个周期。但是,这些情况是不可预期的,不可预期的东西在芯片上会带来很大的麻烦,譬如芯片正常工作的时候突然挂掉了,你甚至都不知道该怎么debug。
一种模拟亚稳态仿真的方法就是故意随机的插入1T的延时,如下图所示,数据经过同步后再经过随机的mux进行选择,这样可以使仿真更接近实际的工作情况。
12.jpg

如何处理跨时钟域?

上一节讲了系统中如果出现跨时钟域的数据信号交互如果不进行同步处理可能会出现一系列不可期的问题,那么如果要处理该如何处理呢。

1)        控制信号的处理,事实上控制信号处理也分很多种,如慢时钟域的信号如何同步到快时钟域的,快时钟域的如何同步到慢时钟域的。

1.1)电平信号的同步
13.jpg

上图示意了慢时钟域的信号采用两级dff同步到快时钟域,此时要求cdc_s信号stable要维持足够长的时间,如上图右侧的公式,否则仍然可能出现不能正确同步的情况。这种电路一般用于同步电平信号或者pusle很宽的信号。使用限制:保险起见,输入信号的脉冲宽度至少是同步器同步时钟的2倍

1.2)边沿检测电路及其同步

14.jpg
如上图,是在1.1的基础上实现的边沿检测电路(上升沿检测电路,大家可以想象一下下降沿检测电路该如何实现,右上角的A&(~B)改成(~A)&B,如果将这两种都合并呢,其实就是抑或逻辑。),当它检测到clk1的时钟域有个上升沿的时候,会在clk2的时钟域产生一个pulse。这种电路在应用于控制信号中非常常见。使用限制:保险起见,输入信号的脉冲宽度至少是同步器同步时钟的2倍。如果不满足条件,则只能使用下面提到的脉冲检测电路。
下图是边沿检测电路,其实就是右上角的电路换成异或逻辑,下面提到的脉冲检测电路会利用这个电路的特性实现。
15.jpg

1.3)脉冲检测电路及其同步
16.jpg
如上图是脉冲检测电路,可以将快时钟域的脉冲同步到慢时钟域中,这种电路有个使用注意点,就是快时钟域的脉冲之间要保留一定的时间间隔,否则第二个脉冲会检测不到,同步后的脉冲变成了一个,保险起见脉冲之间的间隔至少保留2个同步器同步时钟。那么有人会问如果真正的电路会出现间隔很小的脉冲那该如何进行同步处理。我提供的第一种方法是故意将彼此之间的间隔拉开,另一种方法就是采用下面提到的异步fifo处理了。提示:右上角的电路其实就是data^Q(异或)。
使用注意事项:
17.jpg
.....(未完待续)

回复

使用道具 举报

发表于 2017-6-19 10:41 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

facebook google plus twitter linkedin weibo
©2018 Tensilica Corporation

小黑屋|手机版|Archiver|Tensilica技术社区

GMT+8, 2018-1-23 04:10 , Processed in 0.114883 second(s), 9 queries , MemCache On.

快速回复 返回顶部 返回列表