创新30年,从Altera那里学到什么?
时间:10-02
整理:3721RD
点击:
编者语:笔者本科专业电子信息工程,读书时代用的第一块开发板就是Altera公司的,当时脑子里完全没有Altera这个概念,只知道这是块FPGA开发板。但就是这块开发板让我开始接触并深刻认识到FPGA技术、VHDL语言的魅力。虽然后来没去钻研做技术,但它给我留下的印象是最深刻的。那么,各位自称FPGA工程师的你们是不是也一样呢?Altera公司的FPGA开发板用了那么多年,Quartus II 软件用得那么顺手。但是却不了解“Altera这家伙到底是什么呢?“、”它多大了?“、”它为什么能在中国这片广阔天地上培育出这么多牛叉的工程师?“...笔者在跟很多FPGA工程师聊天的过程中,经常会听到这些疑问。凑巧Altera今年30周岁,笔者就带着大家一起来见识下Altera的30年发展历程吧... 创始年代
1983年,Altera公司正式成立。很多人现在对这一年印象还非常深刻——挑战者号和哥伦比亚号航天飞机首航,菲律 宾总统小阿基诺被暗杀,美国入侵格林纳达等。而在技术领域却是白驹过隙,30年显得如此漫长。TCP/IP成为ARPANET的正式协议——那时还没有互 联网。IBM推出了PC-XT——个人计算机还没有硬盘。宣布了GNU项目。
在电子设计领域,微处理器在很多嵌入式设备中得到了广泛应用,替代了高端微型计算机,在低端则替代了大量的小规模数字芯片。典型的数字系统包括微处理器或 者微控制器,周围是接口电路,连接芯片总线和外部存储器芯片以及接口。小规模逻辑芯片和中等规模功能模块IC还在使用,更多的用在建立微处理器周围的接 口,或者桥接总线,对于性能关键的应用,则协助微处理器完成一些操作。
而且,这一时期,在设计领域逐渐采用了新的替代解决方案。逻辑门阵列——特别是经过预制造的逻辑门阵列,在最终产品阶 段,由一系列客户定义的金属层进行配置,支持设计人员将数千个逻辑门和存储器封装到一个芯片中。对于很多项目,并不熟悉设计过程,依靠于基于工作站的 EDA工具进行原理图采集,获取库单元,进行仿真,而前端费用非常昂贵。但是对于规模较大、资金较充裕的设计团队,逻辑门阵列是很好的替代方案,减少了芯 片数量,提高了设计性能,同时降低了功耗。
从今天的标准来看,那时的设计风格也是千差万别。习惯于数字逻辑的工程师通常使用形式结构来进行设计:布尔代数和最小表 达式定义组合逻辑,通过状态机来描述时序逻辑。这些工程师会使用手动方法或者越来越多的计算机软件工具来采集并分析其设计。但是工程师的背景各不相同,特 别是模拟工程师,通常会使用更直观的方法。这些设计人员倾向于使用原理图进行设计输入,从左侧的空白开始设计,然后是输入信号到输出,增加逻辑门、触发 器、中等规模的器件,以及要连接的微处理器。逻辑门阵列用户也倾向于采用原理图方法,这只是因为它能够对在芯片中建立的电路进行近似描述。这两种相反的设 计风格在设计发展过程中都扮演了一定的角色,但是业界在1983年出现了另一种创新方法,并逐渐得到广泛应用。
1978年,出现了另一种替代方法,但还没有引起重视。Monolithic Memories的芯片设计团队开发了一款名为PAL的器件(对于“可编程阵列逻辑”,采用了更知名的术语“可编程逻辑阵列”)。芯片是一次性编程数字器 件,实现布尔表达式的简化标准形式:乘积求和格式。PAL含有很多宏单元,每个单元包括开关阵列,这可以将芯片的任意输入和输出连接至8个乘积项中的每一 个。然后,宏单元在宽OR逻辑门中对乘积项进行求和,提供可配置触发器,寄存OR逻辑门的输出,为选择时钟提供一些复用器,旁路寄存器,等等。1983 年,PAL的容量、速度和配置发展很快,使得设计人员有很大的选择余地。
这些可编程器件为数字设计人员提供了很好的方法:逻辑密度高于小规模逻辑门和触发器,比专用商用中等规模器件更灵活,例 如,计数器、寄存器和解码器,与逻辑门阵列相比,还提供非常熟悉的设计流程,没有前端开支。供应商为微型计算机和大型机提供软件工具,这可以转换成布尔表 达式、状态机,某些机制转换为芯片开关映射。
Altera登场
这是Altera于1984年推出其首款产品的环境。EP300芯片( 图1)是可编程逻辑芯片,但是在四个方面与PAL有明显的不同。首先,EP300是可重新编程的,看起来比较方便,而事实表明这成为了业界的关键因素。封装上的石英窗口支持用户对管芯进行紫外灯照射,擦除含有器件配置的EPROM单元,因此,可以再次对芯片进行编程。
图1.通过管芯上的窗口,照射紫外光,Altera EP300具有可擦除能力。 其次,EP300是CMOS器件,那时,还是采用高功耗的双极工艺来制造大部分PAL、小规模和中等规模逻辑。第 三,Altera芯片是通用的——即,用户可以对EP300进行编程,几乎可以模拟绝大部分现有PAL类型器件的配置。最后,Altera为EP300提 供了设计工具,这一工具运行在IBM PC上,而不是工程工作站或者微型计算机上。Altera资深副总裁Don Faria回忆说:“这的确是创新。PC刚刚出现,工程师对其很有兴趣,有时候,人们观看我们的演示就是为了看一看PC-XT。”
还有另一点不同,是与Altera有关,不仅仅是EP300。Altera采用了代工线模式。那时大部分半导体公司都依 靠他们自己生产线的专用工艺来获得竞争优势,Altera设计的EP300也尽可能采用通用EPROM工艺。因此,可以在很多其他公司生产线上生产芯片, 只需要对设计进行很小的改动即可。石印掩膜就是刀刻红膜相片——只修改设计文件参数并不能改变它。因此,开发的设计要在性能上有竞争力而且可移植性要好, 这的确有一定的难度。
Faria回忆说,这一新器件非常符合系统设计人员的需求。20引脚封装含有8个宏单元。每个宏单元( 图2) 含有的寄存器接收8个乘积项的OR运算。因此,每个宏单元很容易解码16位地址总线。早期数据资料中的一个例子是,衍生器件EP310连接了微处理器地址 总线,为RAM、EPROM和5个串行I/O收发器提供了片选信号。器件还可以进行复杂的转换,例如,解码二进制数,驱动7段显示屏的每一段。或者,一个 芯片可以实现非常复杂的状态机,具有8个二进制状态变量。
图2.EP300被排列成可配置乘积求和。 通过在EP300中实现接口和状态机,设计人员可以尝试新的逻辑表达式,重新配置设计,重新映射地址总线,以及类似的试 验,不会有PAL各种各样的问题。更重要的是在成本上,这可能不是令人很激动,但他们可以设计一块电路板,在成品中安装各种型号器件,甚至可以在现场进行 重新配置。由于有这些优势,EP300及其衍生型号很快得以广泛应用,设计人员自然会希望将更多的功能在可编程器件中实现。这种趋势促使生产出规模更大的 器件。
越来越多的问题
Altera的响应是扩展芯片系列,含有更多的宏单元,最终在EP1800中,68引脚的含铅芯片载体上实现了48个宏 单元器件。在这一点,对逻辑容量的需求对PAL体系结构带来了很大的压力,促使体系结构开始发展变化。Faria解释说:“我们知道标准PAL体系结构很 难进行调整。”
在传统的PAL中,每一宏单元的每个乘积项可以访问所有输入信号,所有宏单元输出,以及所有这些信号的互补信号。随着宏单元数量的增加,这一排列好的互联矩阵会呈几何级数增长,很快将无法承受。Faria说:“因此,我们开始对互联进行划分。”
在EP1800中,这一趋势非常明显,一个封装中实际是四个独立的EP300器件( 图3)。由内部总线将这四个器件连接起来,而不是都尝试去驱动相同的乘积项矩阵。这种组织使得器件具有可制造性,但是,要求设计人员要想清楚哪一宏单元去实现某一逻辑表达式,其他的哪一宏单元要访问结果。器件四个部分的连接会带来额外的延时。
图3.随着可编程器件容量的增长,简单的乘积求和组织被划分设计替代,并不是所有的乘积项要访问所有信号。
新体系结构,新参与者 大约在此时,1985年,发生的一个外部事件影响了Altera体系结构:最近成立的Xilinx发布了其第一款FPGA。FPGA与EPLD相比是根本不同的体系结构,这些不同触发了Altera内部的多项创新。
FPGA并不是汇集宏单元,而是尝试仿真逻辑门阵列的结构。第一款芯片是逻辑单元阵列——相对简单的逻辑单元(LE), 每个都含有一个三输入查找表(LUT),用于产生逻辑功能,还有一个可配置触发器,以及用于调整信号和选择时钟的复用器。逻辑单元并没有采用固定连接,而 是通过交换结构连接至多层金属堆叠,这具有不同的长度和方向:可编程互联。正如在逻辑门阵列中,FPGA用户能够决定一小簇逻辑门(逻辑单元)的功能,这 些逻辑簇怎样连接至芯片的其他簇,通过连接逻辑单元,逐步构建形成电路。
这些器件的三个方面引起了逻辑设计人员的注意。首先,与小规模EPLD中的宏单元数量相比,FPGA中有大量的逻辑单 元,因此,FPGA表面上看起来的容量通常都不太正确。其触发器的确比等价EPLD的多,但是对于组合逻辑,密度是不可比的。第二个吸引人的方面是,与后 来非常流行的逻辑门阵列非常相似,这给研究并采用新技术的设计人员带来了很大的想象空间。第三,对于习惯于把设计考虑成原理图而不是布尔等式的设计人员而 言,FPGA看起来更直观。很清楚的知道逻辑门和触发器网络应怎样映射到FPGA中。
后一点成为发展趋势。越来越明显的是很难调整基于布尔表达式的形式设计,这与设计实现它的PAL相似。布尔代数能够准确简明的表达设计人员使用几百个逻辑门的目的。但是对于一千个逻辑门,印刷错误以及难以理解表达式的含义实际上意味着,很难实现这么多逻辑门。
1985年,Altera基于PC的设计套装提供了四种不同的设计输入方法:布尔表达式、状态机映射、网表和原理图。软 件采用任何一种形式来进行设计,简化为布尔表达式,简明的进行表达,将表达式映射到目标器件电路中,提供仿真器,因此,设计人员能够看到芯片是怎样工作 的。工具还使得用户能够选择通过配置芯片的单独的EPROM单元来直接控制,认识到这一事实,有经验的设计人员进行优化工作,效果要比一些软件好得多。
Altera的回答
Altera对FPGA的响应是提高其下一代器件的逻辑容量。而Altera设计人员完成这一工作时并没有复制FPGA体系结构,或者尝试简单的扩大EPLD。相反,他们将划分PAL这一概念扩展为一类新体系结构:复杂PLD (CPLD)。
在后来采用的工艺密度(大约1 μm)中,CPLD解决了两类问题,这在FPGA中很快体现出来。这些问题之一是扇入
FPGA逻辑单元中的LUT只有三路输入。因此,FPGA需要级联多级LE才能实现大扇入功能,例如地址解码器( 图4)。多级通常导致很大的延时,低效的占用了大量的互联和逻辑单元。
图4.某些功能,例如这一8比特地址解码器,可以采用PAL宽扇入两个逻辑级来实现,但是,如果采用较窄的FPGA逻辑单元输入,则需要多个逻辑级。 第二个问题是时序预测性。在PAL中,任何逻辑表达式的延时相同,不论它有多复杂,或者放置在哪里,只要能够适配到一个 宏单元中即可。如果一个表达式需要PAL或者CPLD中的多个宏单元,单元之间的桥接只会在时序上增加额外的固定延时。因此,您实际上可以很快计算出逻辑 功能的通路延时。
这种简洁并没有体现在FPGA中。在早期的器件中,资源非常宝贵,互联的延时非常大。因此,时序的差别会很大,具体取决 于工具怎样将您的设计映射到逻辑单元和互联中。器件逐渐填满后,工具必须付出很大的努力才能找到开放布线通路和自由的逻辑单元,问题越来越严重。在利用率 达到90%的FPGA中,如果您看一下说明,制造商并不推荐这种情况,看起来对逻辑不大的改变就会导致布局和时序出现很大的变化,很难连接。
Altera的第一款CPLD是1988年的MAX5000器件,不用放弃PAL的确定性时序,便可以实现更高的逻辑密度。通过针对工艺特性来优化逻辑粒度,体系结构达到了其目标。
一项对比说明了这一点。在传统的PAL中,每一乘积项要访问芯片中的每一变量。那么,划分粒度就是整个器件。在第一个 FPGA中,每个LUT都要访问其本身的或者其他单元的三路信号。Altera设计人员认真思考了PAL的大粒度太大无法进行扩展,而早期FPGA的精细 粒度导致了时序不可预测这一问题。对于1988年的工艺技术,最好的答案应位于两者之间。
MAX 5000体系结构( 图5) 找到了最佳点。每一MAX芯片含有一个或者多个逻辑阵列模块(LAB)。每个LAB,实际上是没有I/O端的较大的(16个或者32个宏单元) PAL。LAB的宏单元每个都有四个乘积项。而每个LAB都含有一些非专用的乘积项,可以连接至宏单元,以延长其连接距离。每个LAB都连接至片内可编程 互联阵列(PIA),在LAB之间连接信号,具有固定的额外延时。所有LAB共享一个可编程I/O布线矩阵,将逻辑连接至焊盘环。
图5.MAX体系结构通过将乘积和模块分组到LAB中,提供几种分层互联级,同时提高了逻辑密度和可预测性。 MAX CPLD是成功的折中方案。时序虽然不像小规模PAL那样简单,但仍然是确定性的,限制在非常窄的窗口中。把设计映射到器件中并不简单,但是由设计软件自动完成,可以选择手动编辑。
1980年底直至1990年初一直都要求提高逻辑密度。随着逻辑门数量的增加,应用开发人员开始考虑CPLD,它具有优 异的扇入和确定性,是解码器和状态机等需要大量逻辑的最佳选择。对于需要大量寄存器的功能,设计人员之所以选择FPGA是因为它在触发器数量上有很大的优 势。
人越来越难以理解器件,但设计工具越来越智能,因此,对手动编辑的需求降低了。在1980年底,出现了一种全新的设计风 格,它基于Verilog硬件描述语言(HDL)的自动逻辑综合。除了名称,HDL与Verilog一样,根本就没有描述硬件。而是,采用名为寄存器传送 逻辑的新形式来描述硬件功能。
使用Verilog (及其ADA衍生竞争对手,VHDL)无意得到的结果是,综合产生了有很多寄存器的同步设计。这些设计直观上更适合在有大量寄存器的FPGA体系结构中实现,而不是在组合逻辑CPLD中实现。
直觉并不意味着现实,由于FPGA结构的限制,早期尝试面向FPGA进行逻辑综合失败了。但是,设计人员仍然开始思考采 用Verilog等文本语言进行逻辑设计,开始考虑FPGA不仅仅是接口单元,而是实现其设计完整功能模块的方法。Altera成立二十年的时候,半导体 工艺逻辑密度不断增长,同样非常关键的是越来越丰富的工艺互联,这些都带来了新机遇。这恰恰是Altera开始另一次革命的时候。
从胶合逻辑到子系统:Altera的第二个十年
这是 1994 年。美国航天飞机还在执行常规任务。全世界兴致勃勃的关注彗星 Shoemaker-Levy 9 的分裂,它最终撞向了木星的大气层。连接英国和法国的英吉利海峡终于圆梦百年。令人意想不到的是,临时共和军停止了在北爱尔兰的军事敌对行动。在电子行 业,英特尔刚刚宣布,奔腾处理器克服了著名的奔腾中断缺陷,成为个人计算机的主流处理器。 Altera 开始了他的第二个十年。
从作为简单逻辑芯片开始 , 可编程逻辑器件 (PLD) 十多年来一直按照摩尔定律发展 , 越来越复杂 —— 逻辑容量超过了 10K 等价逻辑阵列。在发展过程中, PLD 分成了两种体系结构:基于布尔乘积求和的复杂 PLD (CPLD) ,并通过 EEPROM 单元进行编程,以及基于查找表 (LUT) 的 FPGA ,以微小 SRAM 来实现这些查找表。
这两种体系结构一开始都有其专用性。CPLD ( 图 1) 适用于具有大扇出或者严格时序约束的电路。 FPGA 适用于具有大量寄存器的设计。对于关心组合逻辑模块和状态机的设计人员,一般都认为 CPLD 更友好一些 —— 在 1994 年,这是老观点。而更喜欢 FPGA 的一批年轻设计人员则把逻辑看成文本: Verilog 或者 VHDL 。
图1.CPLD体系结构 这两种体系结构有一个共同的发展趋势 : 随着芯片逻辑容量的增长 , PLD 的应用出现了变化。当 CPLD 还受限于几千个等价逻辑门时,设计人员采用芯片主要是实现中央微处理器或者微控制器 (MCU) 芯片周围的简单功能。较小的器件用作地址解码器、中断控制器,或者总线扩展器。较大的器件可以是快速状态机智能直接存储器访问控制器,处理某些实时操作, 而软件完成这些操作太慢了。
但是 , 10K 逻辑门带来了新机遇。设计人员可以在大约 3K 逻辑门中开发一个 8 位 MCU , 或者一个简单的 16 位 CPU 内核 , 例如 , 已经成为古董的 8086 ,它 只需要两倍的逻辑门。采用 10K-20K 逻辑门,设计人员能够开发基于小型 CPU 的子系统,例如,总线接口和可编程串行接口控制器,这些都包含在 PLD 中。与标准产品非 PLD 解决方案相比,这类设计要慢一些,能效也低,但却是完全用户可定义的,可重新编程的。最显著的是,大部分这类子系统设计都有大量的寄存器,很多都需要大量 的内部 SRAM kilobytes (KB) 。
Altera转向FPGA发展
在这种环境下 , Altera设计人员总结出 , 市场需要一类新产品。与 FPGA 相似,它应该采用精细粒度逻辑单元,每一个单元都含有 LUT 和寄存器。但是像 CPLD 一样,它应该使用层次化的确定性互联,以保持时序的可预测性,而且简单。 Altera 增加了第三种单元,借鉴了某类逻辑门阵列。这一新单元是一组嵌入到体系结构中的 SRAM 模块,设计用作缓冲或者高速暂存存储器、寄存器文件,或者实现复杂函数发生器的查找表。这种理念的结果是, 1995 年, Altera 推出了第一款类似 FPGA 的系列产品, FLEX? 10K 器件 ( 图 2) 。
图2.FLEX 10K器件结构图 Altera 工程师还进一步打破了公司传统 , 使用 SRAM 单元 —— 而不是他们可信的 EEPROM 技术来保存 FLEX 芯片的配置数据。这种选择意味着,系统每次上电时,必须从外部存储器对 FLEX 进行配置,就像基于 SRAM 的 FPGA 。但这也意味着,不需要占用大量空间的 EEPROM 单元, FLEX 逻辑单元会小很多。而且,十年磨一剑,转到 SRAM 意味着,只要有新工艺, Altera 就能够采用前沿工艺开发自己的器件,而不用等待代工线两年以上来开发嵌入式 EEPROM 。这些变革最终促使半导体行业在每一新工艺节点的第一批设计都使用了 FPGA 。
新应用 , 新技术
FLEX 10K 器件及其后续器件促进了 PLD 行业的发展 ( 图 3) 。新体系结构使得新应用成为可能,这要求采用新工具和技术,反过来进一步增加了对新体系结构的需求。
图3.FPGA发展图 FLEX 器件多达 250K 等价逻辑门 , SRAM 高达 40K , 使用其 SRAM 模块 , 能够实现某些非常复杂的状态机和算术功能 , 已经远远超出了传统的接口和胶合逻辑应用。用户可以考虑整个子系统,例如以太网接口,其介质访问控制器、协议卸载引擎;或者完整的信号处理加速器,包括其 总线接口、本地存储,以及硬件有限冲击响应 (FIR) 滤波器等;所有这些都含在一片 FLEX 芯片中。虽然 Altera 最初的目的是彰显 FLEX 器件与 FPGA 的不同,但 FPGA 却成为大规模 PLD 的总称, Altera 也就逐渐采用了这一术语。
当用户开始考虑子系统时 , 他们发现了新需求。子系统一般需要多个时钟,每一时钟与自己的锁相环 (PLL) 同步。但是分立 PLL 价格昂贵,占用较大的电路板空间。因此,从 1996 年开始, Altera 推出了具有内部可编程 PLL 的 FLEX 器件。其强大的功能节省了电路板空间,能够提高芯片时钟质量。而更重要的是,它揭示了很重要的发展趋势: FPGA 成为子系统,开始集成常用的非 PLD 硬件模块,以改进系统总体设计。
设计方法也在改变。在 1990 年后期 , 具有 100K 逻辑门的 FLEX 器件超越了传统的一张白纸式的设计方法。设计团队将其工作分成多个模块,尝试使用以前设计好的模块,而不用开发新模块。团队开始许可来自第三方知识产权 (IP) 开发商的模块。 Altera 开始开发 IP 库。应用了设计工具,增加了新特性以帮助实现 IP 重用,新特性包括,能够通过简单的用户界面设置可重用 IP 模块的参数,第三方供应商能够以加密形式提供 IP 模块。
容量的增加也带来了另一问题 : 调试。对于小型 PLD ,最常用的调试方法一直是“冒烟测试”:插入芯片,打开电源。在 100K 逻辑门,第一次尝试芯片就能够工作,或者设计人员通过采用逻辑分析仪来观察外部引脚,从而发现问题的概率几乎为零。“冒烟测试”没有用。设计人员开始在 ASIC 环境中仿真相关部分,在针对 FPGA 将其综合到网表中之前,采用 RTL 仿真器测试他们的寄存器传送级 (RTL) 代码。
但是 , 在仿真中可行的 RTL 在实际中可能还无法工作。设计人员需要一种方法来观察芯片运行时的内部工作情况。采用 SRAM 可编程 FPGA ,可以将 ad-hoc 调试电路写入到 RTL 中,重新综合,重新测试。但是,这样做的投入较大,非常耗时。因此,在 1999 年, Altera 推出了 SignalTap? 逻辑分析器:这一硬件特性支持用户在系统运行时监视 FLEX 器件中的每一个寄存器。
进入处理器 , 巨大的变化
这些大规模 FPGA 最需要的一种 IP 模块是某类微处理器内核。对于 ASIC 设计,一般都能够以硬核网表和 RTL 的形式提供 CPU 内核 IP 。但是,对于 FPGA 而言, CPU 却是一种挑战。算术单元和多端口寄存器文件等对于 CPU 内核非常关键的结构无法适配到 FPGA 硬件中。很难在 CPU 内核的关键通路上实现时序收敛。
因此 , 在 2000 年 , Altera 推出了 Nios? , 这一微处理器内核是由 FPGA 设计团队开发的 , 在 FLEX 器件中实现。与基于单元的 ASIC 内核不同,这一 16 位 RISC Nios 处理器非常小,而且很快 —— 在 FPGA 架构中,对于 CPU 而言, 50 MHz 已经非常快了,比较容易实现。内核周围很快出现了总线接口、外设和软件等辅助支持系统。
然而 , 在 2000 年中期 , 停止了发展。互联网泡沫 , 不仅将股票价格推高到荒谬的地步 , 而且虚构出巨大的互联网容量 , 导致灾难性的崩溃 , 随着泡沫的破灭 , 半导体的需求急剧下降。泡沫使得网络设备供应商成为 FPGA 的主要用户,因此, FPGA 公司受到的伤害最大。随着金融的紧缩, FPGA 供应商更积极的追求网络之外的应用。
2001 年 , 泡沫还没有退去的时候 , Altera 选择在嵌入式系统大会上发布一款新器件 ,它注定成为泡沫退去后的“ 报春花 ”,这 要比一款长寿命产品更有意义。 Excalibur? 处理器统一了 APEX? 器件系列 FPGA 架构 —— 这是 FLEX 器件体系结构的发展,具有运行速度高达 200 MHz 基于单元的 ARM922 CPU 内核。器件的推出表明 FPGA 尝试转向嵌入式应用,在把关键 IP 模块嵌入到 FPGA 硬件的实践中迈出了一大步。
IP 中的发展趋势
随着 FPGA 的发展 , IP 重用更切实可行 , 出现了更多的新趋势。毫无疑问,设计团队希望能够有置入到设计中的处理器内核。而且,他们希望内核支持业界标准接口。而新需求也体现在这些方面。
例如 , 从需要高带宽的通信行业开始 , 系统设计人员不再采用具有分立时钟的并行接口 , 而是采用高速自有时钟串行 I/O 。电路板上芯片之间的信号类似来自硬盘读放大器或者卫星接收机的信号。这些芯片中的收发器电路具有相对复杂的混合信号模块,速度通常高达 Gigahertz 。请参考 图 4。
这些收发器完成专门的设计任务 —— 超出了大部分 FPGA 用户的专业知识 , 不适合在可编程逻辑中实现。对此 , 在 2001 年 , Altera 发布 Mercury? 器件系列 FPGA , 它具有内置为硬核 IP 的 1.25 Gbps 收发器。模块包括 1.25 GHz 模拟驱动器和接收器,以及混合信号时钟数据恢复电路,从接收波形中重建最初的数据。
在信号处理领域也出现了相似的过程, 包括无线通信和军事应用。对于这些设计中最关键的构建模块 —— 乘法累加器,采用可编程逻辑很难实现它们。从 Mercury 器件的专用 8x8 乘法器子模块开始, Altera 于 2002 年推出 Stratix? 器件体系结构,转向了嵌入式全数字信号处理 (DSP) 构建模块。
图4.Mercury器件采用了时钟恢复电路实现高速串行互联 不断发展的方法
FPGA 容量在不断增长 , 它们包含越来越多的硬核 IP 模块 , 例如 , PLL 、调试控制器、串行收发器 , 以及某些应用中的 CPU 内核等。用户将以前设计好的 IP 模块连接起来,逐步开发自己的设计。某些设计是专用加速器,通常用于数据包处理或者信号处理,实现一条功能强大的流水线。而现在还出现了另一体系结构:围 绕 CPU 内核展开设计,从 CPU 伸出的系统总线成为主干,其他模块都挂在这一总线上。
这一设计方法强调了 IP的选择和验证 , 进行正确的连接 , 在 Verilog 中建立新的子系统。 Altera 再次积极响应,创新实现了SOPC Builder 。这一工具具有交互式的导航用户界面,用于在 FPGA 上开发基于 CPU 的系统。用户标明把哪些模块装配到哪里,由工具生成所需要的 RTL 。
不断的发展变化促进了革命。 PLD 从胶合逻辑和总线接口组件发展到包含了数据包处理、信号处理功能和基于 CPU 的子系统。具有足够的逻辑容量、合适的 IP 以及相应的工具, FPGA 已经从子系统的角色成为系统的核心。
第三个十年:FPGA成为SoC
2003 年,互联网泡沫破灭的时候,Altera开始了他的第三个十年。这是大结局的一年:哥伦比亚号航天飞机悲剧谢幕,先驱者10号失去联络,最后一台大众甲壳 虫驶出装配线。但这也是开始的一年:伊拉克战争,美国股市大牛市的开始,私人开发的SpaceShipOne第一次超音速飞行,中国第一次载人航天。
在系统设计领域,FPGA悄然向下一阶段发展。使用最先进的CMOS技术,FPGA的逻辑密度和速度足以在一个芯片中实现CPU内核及其外设。 Altera发布了Nios,这一RISC CPU内核针对FPGA进行了优化,合作伙伴也开发了在FPGA中实现的其他流行CPU内核。Avalon是一种多主机总线体系结构,适用于CPU和芯片 系统之间的可编程逻辑规范互联。市场上还出现了SoPC Builder,这款工具可以自动的在基于FPGA的SoC中装入知识产权(IP)。
这些底层工作导致人们对可编程逻辑进行全新的思考。设计人员会继续在CPLD中开发胶合逻辑。对高性能有要求的设计人员会继续在数据包交换、信号处理和相关应用中实现更快、功能更强大的加速器和子系统。而此外,在Altera的第三个十年,FPGA作为芯片系统冉冉升起。
以CPU为中心的时期
即使在这十年中,SoC也趋向于采用简单模式,以它们所替代的电路板级计算机为基础。一片SoC通常包括一个CPU内核,一个本地高速缓存或者紧耦合SRAM,一个DRAM控制器,一条片内微处理器总线,以及应用程序所需要的外设控制器等(图1)。这类应用会包括DMA控制器或者应用加速器,适用于经常性的繁杂任务,例如,数据传送、加密计算,或者快速傅里叶变换(FFT)等。
图1.一个典型的以CPU为中心的Soc设计 在FPGA中实现SoC有很大的优点。设计人员可以只选择CPU内核中需要的硬件模块。数字加速器可以使用Altera FPGA中的高速数字信号处理(DSP)模块,其算术性能要远远高于微处理器和DSP芯片组合所能达到的水平。设计人员还可以使用嵌入在FPGA架构中的 可编程逻辑、DSP模块以及RAM模块实现定制加速器。可以把这些加速器设计用作微处理器总线单元,或者独立直通处理器,开发与微处理器控制平面相独立的 数据平面。
据Altera产品规划经理Bernhard Friebe,提高集成度的一个重要优点是能效。FPGA中的RAM和DSP模块等硬件功能的能效不会低于等价的ASIC或者货架功能产品的能效。在可编 程逻辑中实现的功能的功耗通常要比等价的标准产品高,但并不总是这样。但是,在这一时期,很多系统的主要能耗来自I/O。数据通过FPGA架构传送不但非 常快,而且效率要远远高于通过芯片边界进行传送。通过限制FPGA内部宽带数据传送,系统设计人员能够有效的降低系统级能耗。
由于已经有了硬件和IP来支持以CPU为中心的SoC,因此,Altera的重点放在了工具流程上。很显然,SoC开发人员的工具需求与传统逻辑设 计人员的完全不同。传统上,接口或者数据通路组件设计人员会以VHDL或者Verilog的形式详细的表达他们的设计,然后,每一个单元要通过逻辑验证、 映射至FPGA资源以及时序收敛等步骤。
而SoC设计人员更关注抽象级。硬件足够快,片内RAM容量足够大?总线和存储器带宽够用吗?总线接口能够互联吗?由于能够充分重新使用IP,因 此,设计投入的重点由全部SoC逻辑转向编写软件,利用已有IP开发一个或者两个新模块,将其置入到设计中。换句话说,SoC开发人员就像系统设计人员那 样进行思考,而不像芯片设计人员那样。
这样带来的一个结果就是Altera于2005年首次推出的渐进式编译功能。设计投入一般是集中在SoC的一个或者两个模块上,而硬件大部分工作保 持不变。Altera的渐进式编译特性支持设计人员对设计中的一部分重新进行设计,一般是固定位置和引脚约束,不需要通过工具链重新运行整个设计。这不仅 节省了编译时间,而且降低了已经设计好的硬件部分受到干扰的风险。
SoC设计还导致偏向使用FPGA I/O引脚。作为总线桥接或者加速器,FPGA会有突发或者流形式的数据流过芯片,一般是从一条标准总线到另一条总线。一般而言,只有较少的时钟域,大部分是由总线定义的。
以CPU为中心的SoC带来了新需求。通常会有标准外部总线,例如,PCI或者USB。而现在,FPGA会最先使用总线,而不仅仅是总线上的一个用 户。当然还会有DRAM端口,使得FPGA面临如何使用DDR SDRAM接口技术的难题。在片内外设控制器和外部器件之间还会有很多串行或者并行连接。这种多样性意味着更多的引脚,I/O上更多的信号和更大的电压变 化,以及更多的时钟域。这些变化反映在越来越复杂的FPGA I/O单元和时钟网络上。
内核和多核
半导体工艺一直在不断改进,晶体管密度也越来越高。但是在Altera的第三个十年中,越来越难以进一步提高电路速度了。相应的,CPU生产商关注 的重点从提高时钟频率转向两个、四个甚至管芯上更多的CPU内核——多核体系结构。SoC设计人员在ASIC设计和FPGA设计上都紧随其后。
多核思路体现在FPGA使用上有两个明显的方向。一个思路就是简单的复制CPU内核。这相对比较容易将多个处理器内核编译到FPGA中。但是将其连 接起来就不那么容易了。这里,可编程逻辑提供了丰富的资源,设计人员几乎可以实现从阵列到紧耦合内核,直至共享L2高速缓存体系结构的所有一切,设计实现 多主机Avalon?总线上的独立CPU。
多核的另一个思路采用了不同的方法:异构系统。实现一个CPU内核例化的同一总线、IP和工具支持同时实现CPU内核和多个对等的加速器 (图2)。这也导致完全不同的多核设计思路:以软件为中心的方法。
图2.一个异构多核SoC设计 设计同构多核系统非常直观,极其简单。您需要知道比单个CPU速度快多少倍。使用更多的CPU,多出一个或者两个也有可能降低效率。根据您期望的线 程之间共享的存储器等级,选择互联体系结构。在CPU之间划分软件线程,仿真系统,并重复直至符合规范要求。这一过程一直是以硬件为中心的,选择一种体系 结构,实现它,然后,划分代码,适配到硬件中。
但是,能够建立自己的加速器则创立了全新的方法。它是这样工作的。分析您的代码,找到热点。对于最难处理的代码部分,建立定制加速器,这节省了 CPU周期,降低了能耗。仿真系统,然后再分析步骤,并重复,直到性能满足要求。这一方法从一个CPU内核上的工作软件开始,产生定制满足实际系统软件要 求的多个硬件加速器。系统第一次反映了软件需求,而不是强制软件符合要求。
2006年,Altera推出了两项创新,支持这种异构多核设计风格。一项是编译器,将一组可执行ANSI C代码转换成加速器,针对Altera FPGA中的Nios? CPU内核进行了优化。这种C语言至硬件加速(C2H)编译器工具自动完成以软件为中心的设计中最耗时和最容易出错的步骤:生成加速器。
第二项创新则不太明显。如果您对比一个快速单核处理器与时钟速度较慢的一组等价处理器的功耗,由于高效的加速器,动态功耗会大幅度下降。但是泄漏 ——多年来一直难以解决的问题,不论电路是否工作,都随着晶体管数量的增加而增大。因此,对于多核设计,泄漏电流对能效的影响最大。
Altera以第二项创新——可编程功耗技术来解决这一问题。硬件和软件工具相结合,对于时序不关键的通路,选择慢速低泄漏电路,减小了FPGA中的泄漏电流,同时实现了时序收敛。结果是,不管深亚微米工艺的泄漏有多大,都满足了异构多核设计的能耗要求。
一致性和增强
最后阶段标志着Altera第三个十年的结束:IP选择的一致性。逐渐的,系统设计领域更加关注最棘手问题的特殊解决方案。特别是,嵌入式系统开发 人员几乎都采用了C语言,嵌入式计算普遍采用ARM?内核,一些接口标准开始成为某些应用的主要标准,例如,高速系统总线、背板链接和芯片间互联等。由 此,Altera开发创新技术来支持这些解决方案。
一个例子是,编程人员表达并行代码的方式。C语言虽然能够很好的定义顺序执行的程序,但是无法表达熟练的编程人员使用的并行处理方法。但是,名为 OpenCL?的C衍生语言可以。2011年,Altera推出了一组工具,支持编程人员采用越来越流行的OpenCL编写并行算法,将其翻译成FPGA 中的并行硬件以及传统CPU中的控制代码,这不需要专门的FPGA设计知识。
多核SoC越来越一致的使用ARM Cortex?-A类CPU内核带来了第二项创新。只要每一个设计团队希望有不同的CPU,FPGA供应商就要满足这些需求,在可编程逻辑中实现软核。但是这种灵活性有其成本:占用逻辑单元、高功耗和低速。
Altera则采用了别的方法:在越来越多的嵌入式和无线应用中使用Cortex-A9。2012年,公司开始推出具有管芯硬核处理器子系统的 FPGA样片:双核Cortex-A9群,有自己的高速缓存、本地RAM、经过优化的存储器控制器,以及部分外设控制器,这些都在ASIC类型基于单元的 硬件中实现。芯片设计人员非常小心的优化子系统和可编程逻辑架构之间的互联,以实现异构多核系统。
这种多核处理器系统和FPGA之间不断的融合带来了另一项更关键的创新。2013年,Altera发布其下一代高端FPGA不仅由传统的代工线合作 伙伴制造,而且还由Intel公司制造,使用了14 nm三栅极工艺,这源自Intel自己的CPU和SoC。从ASIC定位的代工线市场转向擅长CPU的代工线,Altera FPGA独辟蹊径来解决功耗和性能问题,优化半导体工艺特性,而不是优化满足ASIC代工线要面对的各种市场需求,这对于工艺单元、本地RAM和高速互联 都非常关键。
Altera相信,这种选择的结果是打破FPGA业界多年以来所习惯的性能和能耗模式。这是新十年最好的开始。
Altera技术发展里程碑
Altera由Robert Hartmann、Michael Magranet、Paul Newhagen和Jim Sansbury于1983年创立,这些有远见的人们对当时的研究进行投资,认为半导体客户将从用户可编程标准产品中受益,逐步取代逻辑门阵列。为满足这 些市场需求,Altera的创始人发明了首款可编程逻辑器件(PLD)——EP300,开创了半导体业界全新的市场领域。这一灵活的新解决方案在市场上打 败了传统的标准产品,为Altera带来了半导体创新领先企业的盛誉。
1983年,Altera公司正式成立。很多人现在对这一年印象还非常深刻——挑战者号和哥伦比亚号航天飞机首航,菲律 宾总统小阿基诺被暗杀,美国入侵格林纳达等。而在技术领域却是白驹过隙,30年显得如此漫长。TCP/IP成为ARPANET的正式协议——那时还没有互 联网。IBM推出了PC-XT——个人计算机还没有硬盘。宣布了GNU项目。
在电子设计领域,微处理器在很多嵌入式设备中得到了广泛应用,替代了高端微型计算机,在低端则替代了大量的小规模数字芯片。典型的数字系统包括微处理器或 者微控制器,周围是接口电路,连接芯片总线和外部存储器芯片以及接口。小规模逻辑芯片和中等规模功能模块IC还在使用,更多的用在建立微处理器周围的接 口,或者桥接总线,对于性能关键的应用,则协助微处理器完成一些操作。
而且,这一时期,在设计领域逐渐采用了新的替代解决方案。逻辑门阵列——特别是经过预制造的逻辑门阵列,在最终产品阶 段,由一系列客户定义的金属层进行配置,支持设计人员将数千个逻辑门和存储器封装到一个芯片中。对于很多项目,并不熟悉设计过程,依靠于基于工作站的 EDA工具进行原理图采集,获取库单元,进行仿真,而前端费用非常昂贵。但是对于规模较大、资金较充裕的设计团队,逻辑门阵列是很好的替代方案,减少了芯 片数量,提高了设计性能,同时降低了功耗。
从今天的标准来看,那时的设计风格也是千差万别。习惯于数字逻辑的工程师通常使用形式结构来进行设计:布尔代数和最小表 达式定义组合逻辑,通过状态机来描述时序逻辑。这些工程师会使用手动方法或者越来越多的计算机软件工具来采集并分析其设计。但是工程师的背景各不相同,特 别是模拟工程师,通常会使用更直观的方法。这些设计人员倾向于使用原理图进行设计输入,从左侧的空白开始设计,然后是输入信号到输出,增加逻辑门、触发 器、中等规模的器件,以及要连接的微处理器。逻辑门阵列用户也倾向于采用原理图方法,这只是因为它能够对在芯片中建立的电路进行近似描述。这两种相反的设 计风格在设计发展过程中都扮演了一定的角色,但是业界在1983年出现了另一种创新方法,并逐渐得到广泛应用。
1978年,出现了另一种替代方法,但还没有引起重视。Monolithic Memories的芯片设计团队开发了一款名为PAL的器件(对于“可编程阵列逻辑”,采用了更知名的术语“可编程逻辑阵列”)。芯片是一次性编程数字器 件,实现布尔表达式的简化标准形式:乘积求和格式。PAL含有很多宏单元,每个单元包括开关阵列,这可以将芯片的任意输入和输出连接至8个乘积项中的每一 个。然后,宏单元在宽OR逻辑门中对乘积项进行求和,提供可配置触发器,寄存OR逻辑门的输出,为选择时钟提供一些复用器,旁路寄存器,等等。1983 年,PAL的容量、速度和配置发展很快,使得设计人员有很大的选择余地。
这些可编程器件为数字设计人员提供了很好的方法:逻辑密度高于小规模逻辑门和触发器,比专用商用中等规模器件更灵活,例 如,计数器、寄存器和解码器,与逻辑门阵列相比,还提供非常熟悉的设计流程,没有前端开支。供应商为微型计算机和大型机提供软件工具,这可以转换成布尔表 达式、状态机,某些机制转换为芯片开关映射。
Altera登场
这是Altera于1984年推出其首款产品的环境。EP300芯片( 图1)是可编程逻辑芯片,但是在四个方面与PAL有明显的不同。首先,EP300是可重新编程的,看起来比较方便,而事实表明这成为了业界的关键因素。封装上的石英窗口支持用户对管芯进行紫外灯照射,擦除含有器件配置的EPROM单元,因此,可以再次对芯片进行编程。
图1.通过管芯上的窗口,照射紫外光,Altera EP300具有可擦除能力。 其次,EP300是CMOS器件,那时,还是采用高功耗的双极工艺来制造大部分PAL、小规模和中等规模逻辑。第 三,Altera芯片是通用的——即,用户可以对EP300进行编程,几乎可以模拟绝大部分现有PAL类型器件的配置。最后,Altera为EP300提 供了设计工具,这一工具运行在IBM PC上,而不是工程工作站或者微型计算机上。Altera资深副总裁Don Faria回忆说:“这的确是创新。PC刚刚出现,工程师对其很有兴趣,有时候,人们观看我们的演示就是为了看一看PC-XT。”
还有另一点不同,是与Altera有关,不仅仅是EP300。Altera采用了代工线模式。那时大部分半导体公司都依 靠他们自己生产线的专用工艺来获得竞争优势,Altera设计的EP300也尽可能采用通用EPROM工艺。因此,可以在很多其他公司生产线上生产芯片, 只需要对设计进行很小的改动即可。石印掩膜就是刀刻红膜相片——只修改设计文件参数并不能改变它。因此,开发的设计要在性能上有竞争力而且可移植性要好, 这的确有一定的难度。
Faria回忆说,这一新器件非常符合系统设计人员的需求。20引脚封装含有8个宏单元。每个宏单元( 图2) 含有的寄存器接收8个乘积项的OR运算。因此,每个宏单元很容易解码16位地址总线。早期数据资料中的一个例子是,衍生器件EP310连接了微处理器地址 总线,为RAM、EPROM和5个串行I/O收发器提供了片选信号。器件还可以进行复杂的转换,例如,解码二进制数,驱动7段显示屏的每一段。或者,一个 芯片可以实现非常复杂的状态机,具有8个二进制状态变量。
图2.EP300被排列成可配置乘积求和。 通过在EP300中实现接口和状态机,设计人员可以尝试新的逻辑表达式,重新配置设计,重新映射地址总线,以及类似的试 验,不会有PAL各种各样的问题。更重要的是在成本上,这可能不是令人很激动,但他们可以设计一块电路板,在成品中安装各种型号器件,甚至可以在现场进行 重新配置。由于有这些优势,EP300及其衍生型号很快得以广泛应用,设计人员自然会希望将更多的功能在可编程器件中实现。这种趋势促使生产出规模更大的 器件。
越来越多的问题
Altera的响应是扩展芯片系列,含有更多的宏单元,最终在EP1800中,68引脚的含铅芯片载体上实现了48个宏 单元器件。在这一点,对逻辑容量的需求对PAL体系结构带来了很大的压力,促使体系结构开始发展变化。Faria解释说:“我们知道标准PAL体系结构很 难进行调整。”
在传统的PAL中,每一宏单元的每个乘积项可以访问所有输入信号,所有宏单元输出,以及所有这些信号的互补信号。随着宏单元数量的增加,这一排列好的互联矩阵会呈几何级数增长,很快将无法承受。Faria说:“因此,我们开始对互联进行划分。”
在EP1800中,这一趋势非常明显,一个封装中实际是四个独立的EP300器件( 图3)。由内部总线将这四个器件连接起来,而不是都尝试去驱动相同的乘积项矩阵。这种组织使得器件具有可制造性,但是,要求设计人员要想清楚哪一宏单元去实现某一逻辑表达式,其他的哪一宏单元要访问结果。器件四个部分的连接会带来额外的延时。
图3.随着可编程器件容量的增长,简单的乘积求和组织被划分设计替代,并不是所有的乘积项要访问所有信号。
新体系结构,新参与者 大约在此时,1985年,发生的一个外部事件影响了Altera体系结构:最近成立的Xilinx发布了其第一款FPGA。FPGA与EPLD相比是根本不同的体系结构,这些不同触发了Altera内部的多项创新。
FPGA并不是汇集宏单元,而是尝试仿真逻辑门阵列的结构。第一款芯片是逻辑单元阵列——相对简单的逻辑单元(LE), 每个都含有一个三输入查找表(LUT),用于产生逻辑功能,还有一个可配置触发器,以及用于调整信号和选择时钟的复用器。逻辑单元并没有采用固定连接,而 是通过交换结构连接至多层金属堆叠,这具有不同的长度和方向:可编程互联。正如在逻辑门阵列中,FPGA用户能够决定一小簇逻辑门(逻辑单元)的功能,这 些逻辑簇怎样连接至芯片的其他簇,通过连接逻辑单元,逐步构建形成电路。
这些器件的三个方面引起了逻辑设计人员的注意。首先,与小规模EPLD中的宏单元数量相比,FPGA中有大量的逻辑单 元,因此,FPGA表面上看起来的容量通常都不太正确。其触发器的确比等价EPLD的多,但是对于组合逻辑,密度是不可比的。第二个吸引人的方面是,与后 来非常流行的逻辑门阵列非常相似,这给研究并采用新技术的设计人员带来了很大的想象空间。第三,对于习惯于把设计考虑成原理图而不是布尔等式的设计人员而 言,FPGA看起来更直观。很清楚的知道逻辑门和触发器网络应怎样映射到FPGA中。
后一点成为发展趋势。越来越明显的是很难调整基于布尔表达式的形式设计,这与设计实现它的PAL相似。布尔代数能够准确简明的表达设计人员使用几百个逻辑门的目的。但是对于一千个逻辑门,印刷错误以及难以理解表达式的含义实际上意味着,很难实现这么多逻辑门。
1985年,Altera基于PC的设计套装提供了四种不同的设计输入方法:布尔表达式、状态机映射、网表和原理图。软 件采用任何一种形式来进行设计,简化为布尔表达式,简明的进行表达,将表达式映射到目标器件电路中,提供仿真器,因此,设计人员能够看到芯片是怎样工作 的。工具还使得用户能够选择通过配置芯片的单独的EPROM单元来直接控制,认识到这一事实,有经验的设计人员进行优化工作,效果要比一些软件好得多。
Altera的回答
Altera对FPGA的响应是提高其下一代器件的逻辑容量。而Altera设计人员完成这一工作时并没有复制FPGA体系结构,或者尝试简单的扩大EPLD。相反,他们将划分PAL这一概念扩展为一类新体系结构:复杂PLD (CPLD)。
在后来采用的工艺密度(大约1 μm)中,CPLD解决了两类问题,这在FPGA中很快体现出来。这些问题之一是扇入
FPGA逻辑单元中的LUT只有三路输入。因此,FPGA需要级联多级LE才能实现大扇入功能,例如地址解码器( 图4)。多级通常导致很大的延时,低效的占用了大量的互联和逻辑单元。
图4.某些功能,例如这一8比特地址解码器,可以采用PAL宽扇入两个逻辑级来实现,但是,如果采用较窄的FPGA逻辑单元输入,则需要多个逻辑级。 第二个问题是时序预测性。在PAL中,任何逻辑表达式的延时相同,不论它有多复杂,或者放置在哪里,只要能够适配到一个 宏单元中即可。如果一个表达式需要PAL或者CPLD中的多个宏单元,单元之间的桥接只会在时序上增加额外的固定延时。因此,您实际上可以很快计算出逻辑 功能的通路延时。
这种简洁并没有体现在FPGA中。在早期的器件中,资源非常宝贵,互联的延时非常大。因此,时序的差别会很大,具体取决 于工具怎样将您的设计映射到逻辑单元和互联中。器件逐渐填满后,工具必须付出很大的努力才能找到开放布线通路和自由的逻辑单元,问题越来越严重。在利用率 达到90%的FPGA中,如果您看一下说明,制造商并不推荐这种情况,看起来对逻辑不大的改变就会导致布局和时序出现很大的变化,很难连接。
Altera的第一款CPLD是1988年的MAX5000器件,不用放弃PAL的确定性时序,便可以实现更高的逻辑密度。通过针对工艺特性来优化逻辑粒度,体系结构达到了其目标。
一项对比说明了这一点。在传统的PAL中,每一乘积项要访问芯片中的每一变量。那么,划分粒度就是整个器件。在第一个 FPGA中,每个LUT都要访问其本身的或者其他单元的三路信号。Altera设计人员认真思考了PAL的大粒度太大无法进行扩展,而早期FPGA的精细 粒度导致了时序不可预测这一问题。对于1988年的工艺技术,最好的答案应位于两者之间。
MAX 5000体系结构( 图5) 找到了最佳点。每一MAX芯片含有一个或者多个逻辑阵列模块(LAB)。每个LAB,实际上是没有I/O端的较大的(16个或者32个宏单元) PAL。LAB的宏单元每个都有四个乘积项。而每个LAB都含有一些非专用的乘积项,可以连接至宏单元,以延长其连接距离。每个LAB都连接至片内可编程 互联阵列(PIA),在LAB之间连接信号,具有固定的额外延时。所有LAB共享一个可编程I/O布线矩阵,将逻辑连接至焊盘环。
图5.MAX体系结构通过将乘积和模块分组到LAB中,提供几种分层互联级,同时提高了逻辑密度和可预测性。 MAX CPLD是成功的折中方案。时序虽然不像小规模PAL那样简单,但仍然是确定性的,限制在非常窄的窗口中。把设计映射到器件中并不简单,但是由设计软件自动完成,可以选择手动编辑。
1980年底直至1990年初一直都要求提高逻辑密度。随着逻辑门数量的增加,应用开发人员开始考虑CPLD,它具有优 异的扇入和确定性,是解码器和状态机等需要大量逻辑的最佳选择。对于需要大量寄存器的功能,设计人员之所以选择FPGA是因为它在触发器数量上有很大的优 势。
人越来越难以理解器件,但设计工具越来越智能,因此,对手动编辑的需求降低了。在1980年底,出现了一种全新的设计风 格,它基于Verilog硬件描述语言(HDL)的自动逻辑综合。除了名称,HDL与Verilog一样,根本就没有描述硬件。而是,采用名为寄存器传送 逻辑的新形式来描述硬件功能。
使用Verilog (及其ADA衍生竞争对手,VHDL)无意得到的结果是,综合产生了有很多寄存器的同步设计。这些设计直观上更适合在有大量寄存器的FPGA体系结构中实现,而不是在组合逻辑CPLD中实现。
直觉并不意味着现实,由于FPGA结构的限制,早期尝试面向FPGA进行逻辑综合失败了。但是,设计人员仍然开始思考采 用Verilog等文本语言进行逻辑设计,开始考虑FPGA不仅仅是接口单元,而是实现其设计完整功能模块的方法。Altera成立二十年的时候,半导体 工艺逻辑密度不断增长,同样非常关键的是越来越丰富的工艺互联,这些都带来了新机遇。这恰恰是Altera开始另一次革命的时候。
从胶合逻辑到子系统:Altera的第二个十年
这是 1994 年。美国航天飞机还在执行常规任务。全世界兴致勃勃的关注彗星 Shoemaker-Levy 9 的分裂,它最终撞向了木星的大气层。连接英国和法国的英吉利海峡终于圆梦百年。令人意想不到的是,临时共和军停止了在北爱尔兰的军事敌对行动。在电子行 业,英特尔刚刚宣布,奔腾处理器克服了著名的奔腾中断缺陷,成为个人计算机的主流处理器。 Altera 开始了他的第二个十年。
从作为简单逻辑芯片开始 , 可编程逻辑器件 (PLD) 十多年来一直按照摩尔定律发展 , 越来越复杂 —— 逻辑容量超过了 10K 等价逻辑阵列。在发展过程中, PLD 分成了两种体系结构:基于布尔乘积求和的复杂 PLD (CPLD) ,并通过 EEPROM 单元进行编程,以及基于查找表 (LUT) 的 FPGA ,以微小 SRAM 来实现这些查找表。
这两种体系结构一开始都有其专用性。CPLD ( 图 1) 适用于具有大扇出或者严格时序约束的电路。 FPGA 适用于具有大量寄存器的设计。对于关心组合逻辑模块和状态机的设计人员,一般都认为 CPLD 更友好一些 —— 在 1994 年,这是老观点。而更喜欢 FPGA 的一批年轻设计人员则把逻辑看成文本: Verilog 或者 VHDL 。
图1.CPLD体系结构 这两种体系结构有一个共同的发展趋势 : 随着芯片逻辑容量的增长 , PLD 的应用出现了变化。当 CPLD 还受限于几千个等价逻辑门时,设计人员采用芯片主要是实现中央微处理器或者微控制器 (MCU) 芯片周围的简单功能。较小的器件用作地址解码器、中断控制器,或者总线扩展器。较大的器件可以是快速状态机智能直接存储器访问控制器,处理某些实时操作, 而软件完成这些操作太慢了。
但是 , 10K 逻辑门带来了新机遇。设计人员可以在大约 3K 逻辑门中开发一个 8 位 MCU , 或者一个简单的 16 位 CPU 内核 , 例如 , 已经成为古董的 8086 ,它 只需要两倍的逻辑门。采用 10K-20K 逻辑门,设计人员能够开发基于小型 CPU 的子系统,例如,总线接口和可编程串行接口控制器,这些都包含在 PLD 中。与标准产品非 PLD 解决方案相比,这类设计要慢一些,能效也低,但却是完全用户可定义的,可重新编程的。最显著的是,大部分这类子系统设计都有大量的寄存器,很多都需要大量 的内部 SRAM kilobytes (KB) 。
Altera转向FPGA发展
在这种环境下 , Altera设计人员总结出 , 市场需要一类新产品。与 FPGA 相似,它应该采用精细粒度逻辑单元,每一个单元都含有 LUT 和寄存器。但是像 CPLD 一样,它应该使用层次化的确定性互联,以保持时序的可预测性,而且简单。 Altera 增加了第三种单元,借鉴了某类逻辑门阵列。这一新单元是一组嵌入到体系结构中的 SRAM 模块,设计用作缓冲或者高速暂存存储器、寄存器文件,或者实现复杂函数发生器的查找表。这种理念的结果是, 1995 年, Altera 推出了第一款类似 FPGA 的系列产品, FLEX? 10K 器件 ( 图 2) 。
图2.FLEX 10K器件结构图 Altera 工程师还进一步打破了公司传统 , 使用 SRAM 单元 —— 而不是他们可信的 EEPROM 技术来保存 FLEX 芯片的配置数据。这种选择意味着,系统每次上电时,必须从外部存储器对 FLEX 进行配置,就像基于 SRAM 的 FPGA 。但这也意味着,不需要占用大量空间的 EEPROM 单元, FLEX 逻辑单元会小很多。而且,十年磨一剑,转到 SRAM 意味着,只要有新工艺, Altera 就能够采用前沿工艺开发自己的器件,而不用等待代工线两年以上来开发嵌入式 EEPROM 。这些变革最终促使半导体行业在每一新工艺节点的第一批设计都使用了 FPGA 。
新应用 , 新技术
FLEX 10K 器件及其后续器件促进了 PLD 行业的发展 ( 图 3) 。新体系结构使得新应用成为可能,这要求采用新工具和技术,反过来进一步增加了对新体系结构的需求。
图3.FPGA发展图 FLEX 器件多达 250K 等价逻辑门 , SRAM 高达 40K , 使用其 SRAM 模块 , 能够实现某些非常复杂的状态机和算术功能 , 已经远远超出了传统的接口和胶合逻辑应用。用户可以考虑整个子系统,例如以太网接口,其介质访问控制器、协议卸载引擎;或者完整的信号处理加速器,包括其 总线接口、本地存储,以及硬件有限冲击响应 (FIR) 滤波器等;所有这些都含在一片 FLEX 芯片中。虽然 Altera 最初的目的是彰显 FLEX 器件与 FPGA 的不同,但 FPGA 却成为大规模 PLD 的总称, Altera 也就逐渐采用了这一术语。
当用户开始考虑子系统时 , 他们发现了新需求。子系统一般需要多个时钟,每一时钟与自己的锁相环 (PLL) 同步。但是分立 PLL 价格昂贵,占用较大的电路板空间。因此,从 1996 年开始, Altera 推出了具有内部可编程 PLL 的 FLEX 器件。其强大的功能节省了电路板空间,能够提高芯片时钟质量。而更重要的是,它揭示了很重要的发展趋势: FPGA 成为子系统,开始集成常用的非 PLD 硬件模块,以改进系统总体设计。
设计方法也在改变。在 1990 年后期 , 具有 100K 逻辑门的 FLEX 器件超越了传统的一张白纸式的设计方法。设计团队将其工作分成多个模块,尝试使用以前设计好的模块,而不用开发新模块。团队开始许可来自第三方知识产权 (IP) 开发商的模块。 Altera 开始开发 IP 库。应用了设计工具,增加了新特性以帮助实现 IP 重用,新特性包括,能够通过简单的用户界面设置可重用 IP 模块的参数,第三方供应商能够以加密形式提供 IP 模块。
容量的增加也带来了另一问题 : 调试。对于小型 PLD ,最常用的调试方法一直是“冒烟测试”:插入芯片,打开电源。在 100K 逻辑门,第一次尝试芯片就能够工作,或者设计人员通过采用逻辑分析仪来观察外部引脚,从而发现问题的概率几乎为零。“冒烟测试”没有用。设计人员开始在 ASIC 环境中仿真相关部分,在针对 FPGA 将其综合到网表中之前,采用 RTL 仿真器测试他们的寄存器传送级 (RTL) 代码。
但是 , 在仿真中可行的 RTL 在实际中可能还无法工作。设计人员需要一种方法来观察芯片运行时的内部工作情况。采用 SRAM 可编程 FPGA ,可以将 ad-hoc 调试电路写入到 RTL 中,重新综合,重新测试。但是,这样做的投入较大,非常耗时。因此,在 1999 年, Altera 推出了 SignalTap? 逻辑分析器:这一硬件特性支持用户在系统运行时监视 FLEX 器件中的每一个寄存器。
进入处理器 , 巨大的变化
这些大规模 FPGA 最需要的一种 IP 模块是某类微处理器内核。对于 ASIC 设计,一般都能够以硬核网表和 RTL 的形式提供 CPU 内核 IP 。但是,对于 FPGA 而言, CPU 却是一种挑战。算术单元和多端口寄存器文件等对于 CPU 内核非常关键的结构无法适配到 FPGA 硬件中。很难在 CPU 内核的关键通路上实现时序收敛。
因此 , 在 2000 年 , Altera 推出了 Nios? , 这一微处理器内核是由 FPGA 设计团队开发的 , 在 FLEX 器件中实现。与基于单元的 ASIC 内核不同,这一 16 位 RISC Nios 处理器非常小,而且很快 —— 在 FPGA 架构中,对于 CPU 而言, 50 MHz 已经非常快了,比较容易实现。内核周围很快出现了总线接口、外设和软件等辅助支持系统。
然而 , 在 2000 年中期 , 停止了发展。互联网泡沫 , 不仅将股票价格推高到荒谬的地步 , 而且虚构出巨大的互联网容量 , 导致灾难性的崩溃 , 随着泡沫的破灭 , 半导体的需求急剧下降。泡沫使得网络设备供应商成为 FPGA 的主要用户,因此, FPGA 公司受到的伤害最大。随着金融的紧缩, FPGA 供应商更积极的追求网络之外的应用。
2001 年 , 泡沫还没有退去的时候 , Altera 选择在嵌入式系统大会上发布一款新器件 ,它注定成为泡沫退去后的“ 报春花 ”,这 要比一款长寿命产品更有意义。 Excalibur? 处理器统一了 APEX? 器件系列 FPGA 架构 —— 这是 FLEX 器件体系结构的发展,具有运行速度高达 200 MHz 基于单元的 ARM922 CPU 内核。器件的推出表明 FPGA 尝试转向嵌入式应用,在把关键 IP 模块嵌入到 FPGA 硬件的实践中迈出了一大步。
IP 中的发展趋势
随着 FPGA 的发展 , IP 重用更切实可行 , 出现了更多的新趋势。毫无疑问,设计团队希望能够有置入到设计中的处理器内核。而且,他们希望内核支持业界标准接口。而新需求也体现在这些方面。
例如 , 从需要高带宽的通信行业开始 , 系统设计人员不再采用具有分立时钟的并行接口 , 而是采用高速自有时钟串行 I/O 。电路板上芯片之间的信号类似来自硬盘读放大器或者卫星接收机的信号。这些芯片中的收发器电路具有相对复杂的混合信号模块,速度通常高达 Gigahertz 。请参考 图 4。
这些收发器完成专门的设计任务 —— 超出了大部分 FPGA 用户的专业知识 , 不适合在可编程逻辑中实现。对此 , 在 2001 年 , Altera 发布 Mercury? 器件系列 FPGA , 它具有内置为硬核 IP 的 1.25 Gbps 收发器。模块包括 1.25 GHz 模拟驱动器和接收器,以及混合信号时钟数据恢复电路,从接收波形中重建最初的数据。
在信号处理领域也出现了相似的过程, 包括无线通信和军事应用。对于这些设计中最关键的构建模块 —— 乘法累加器,采用可编程逻辑很难实现它们。从 Mercury 器件的专用 8x8 乘法器子模块开始, Altera 于 2002 年推出 Stratix? 器件体系结构,转向了嵌入式全数字信号处理 (DSP) 构建模块。
图4.Mercury器件采用了时钟恢复电路实现高速串行互联 不断发展的方法
FPGA 容量在不断增长 , 它们包含越来越多的硬核 IP 模块 , 例如 , PLL 、调试控制器、串行收发器 , 以及某些应用中的 CPU 内核等。用户将以前设计好的 IP 模块连接起来,逐步开发自己的设计。某些设计是专用加速器,通常用于数据包处理或者信号处理,实现一条功能强大的流水线。而现在还出现了另一体系结构:围 绕 CPU 内核展开设计,从 CPU 伸出的系统总线成为主干,其他模块都挂在这一总线上。
这一设计方法强调了 IP的选择和验证 , 进行正确的连接 , 在 Verilog 中建立新的子系统。 Altera 再次积极响应,创新实现了SOPC Builder 。这一工具具有交互式的导航用户界面,用于在 FPGA 上开发基于 CPU 的系统。用户标明把哪些模块装配到哪里,由工具生成所需要的 RTL 。
不断的发展变化促进了革命。 PLD 从胶合逻辑和总线接口组件发展到包含了数据包处理、信号处理功能和基于 CPU 的子系统。具有足够的逻辑容量、合适的 IP 以及相应的工具, FPGA 已经从子系统的角色成为系统的核心。
第三个十年:FPGA成为SoC
2003 年,互联网泡沫破灭的时候,Altera开始了他的第三个十年。这是大结局的一年:哥伦比亚号航天飞机悲剧谢幕,先驱者10号失去联络,最后一台大众甲壳 虫驶出装配线。但这也是开始的一年:伊拉克战争,美国股市大牛市的开始,私人开发的SpaceShipOne第一次超音速飞行,中国第一次载人航天。
在系统设计领域,FPGA悄然向下一阶段发展。使用最先进的CMOS技术,FPGA的逻辑密度和速度足以在一个芯片中实现CPU内核及其外设。 Altera发布了Nios,这一RISC CPU内核针对FPGA进行了优化,合作伙伴也开发了在FPGA中实现的其他流行CPU内核。Avalon是一种多主机总线体系结构,适用于CPU和芯片 系统之间的可编程逻辑规范互联。市场上还出现了SoPC Builder,这款工具可以自动的在基于FPGA的SoC中装入知识产权(IP)。
这些底层工作导致人们对可编程逻辑进行全新的思考。设计人员会继续在CPLD中开发胶合逻辑。对高性能有要求的设计人员会继续在数据包交换、信号处理和相关应用中实现更快、功能更强大的加速器和子系统。而此外,在Altera的第三个十年,FPGA作为芯片系统冉冉升起。
以CPU为中心的时期
即使在这十年中,SoC也趋向于采用简单模式,以它们所替代的电路板级计算机为基础。一片SoC通常包括一个CPU内核,一个本地高速缓存或者紧耦合SRAM,一个DRAM控制器,一条片内微处理器总线,以及应用程序所需要的外设控制器等(图1)。这类应用会包括DMA控制器或者应用加速器,适用于经常性的繁杂任务,例如,数据传送、加密计算,或者快速傅里叶变换(FFT)等。
图1.一个典型的以CPU为中心的Soc设计 在FPGA中实现SoC有很大的优点。设计人员可以只选择CPU内核中需要的硬件模块。数字加速器可以使用Altera FPGA中的高速数字信号处理(DSP)模块,其算术性能要远远高于微处理器和DSP芯片组合所能达到的水平。设计人员还可以使用嵌入在FPGA架构中的 可编程逻辑、DSP模块以及RAM模块实现定制加速器。可以把这些加速器设计用作微处理器总线单元,或者独立直通处理器,开发与微处理器控制平面相独立的 数据平面。
据Altera产品规划经理Bernhard Friebe,提高集成度的一个重要优点是能效。FPGA中的RAM和DSP模块等硬件功能的能效不会低于等价的ASIC或者货架功能产品的能效。在可编 程逻辑中实现的功能的功耗通常要比等价的标准产品高,但并不总是这样。但是,在这一时期,很多系统的主要能耗来自I/O。数据通过FPGA架构传送不但非 常快,而且效率要远远高于通过芯片边界进行传送。通过限制FPGA内部宽带数据传送,系统设计人员能够有效的降低系统级能耗。
由于已经有了硬件和IP来支持以CPU为中心的SoC,因此,Altera的重点放在了工具流程上。很显然,SoC开发人员的工具需求与传统逻辑设 计人员的完全不同。传统上,接口或者数据通路组件设计人员会以VHDL或者Verilog的形式详细的表达他们的设计,然后,每一个单元要通过逻辑验证、 映射至FPGA资源以及时序收敛等步骤。
而SoC设计人员更关注抽象级。硬件足够快,片内RAM容量足够大?总线和存储器带宽够用吗?总线接口能够互联吗?由于能够充分重新使用IP,因 此,设计投入的重点由全部SoC逻辑转向编写软件,利用已有IP开发一个或者两个新模块,将其置入到设计中。换句话说,SoC开发人员就像系统设计人员那 样进行思考,而不像芯片设计人员那样。
这样带来的一个结果就是Altera于2005年首次推出的渐进式编译功能。设计投入一般是集中在SoC的一个或者两个模块上,而硬件大部分工作保 持不变。Altera的渐进式编译特性支持设计人员对设计中的一部分重新进行设计,一般是固定位置和引脚约束,不需要通过工具链重新运行整个设计。这不仅 节省了编译时间,而且降低了已经设计好的硬件部分受到干扰的风险。
SoC设计还导致偏向使用FPGA I/O引脚。作为总线桥接或者加速器,FPGA会有突发或者流形式的数据流过芯片,一般是从一条标准总线到另一条总线。一般而言,只有较少的时钟域,大部分是由总线定义的。
以CPU为中心的SoC带来了新需求。通常会有标准外部总线,例如,PCI或者USB。而现在,FPGA会最先使用总线,而不仅仅是总线上的一个用 户。当然还会有DRAM端口,使得FPGA面临如何使用DDR SDRAM接口技术的难题。在片内外设控制器和外部器件之间还会有很多串行或者并行连接。这种多样性意味着更多的引脚,I/O上更多的信号和更大的电压变 化,以及更多的时钟域。这些变化反映在越来越复杂的FPGA I/O单元和时钟网络上。
内核和多核
半导体工艺一直在不断改进,晶体管密度也越来越高。但是在Altera的第三个十年中,越来越难以进一步提高电路速度了。相应的,CPU生产商关注 的重点从提高时钟频率转向两个、四个甚至管芯上更多的CPU内核——多核体系结构。SoC设计人员在ASIC设计和FPGA设计上都紧随其后。
多核思路体现在FPGA使用上有两个明显的方向。一个思路就是简单的复制CPU内核。这相对比较容易将多个处理器内核编译到FPGA中。但是将其连 接起来就不那么容易了。这里,可编程逻辑提供了丰富的资源,设计人员几乎可以实现从阵列到紧耦合内核,直至共享L2高速缓存体系结构的所有一切,设计实现 多主机Avalon?总线上的独立CPU。
多核的另一个思路采用了不同的方法:异构系统。实现一个CPU内核例化的同一总线、IP和工具支持同时实现CPU内核和多个对等的加速器 (图2)。这也导致完全不同的多核设计思路:以软件为中心的方法。
图2.一个异构多核SoC设计 设计同构多核系统非常直观,极其简单。您需要知道比单个CPU速度快多少倍。使用更多的CPU,多出一个或者两个也有可能降低效率。根据您期望的线 程之间共享的存储器等级,选择互联体系结构。在CPU之间划分软件线程,仿真系统,并重复直至符合规范要求。这一过程一直是以硬件为中心的,选择一种体系 结构,实现它,然后,划分代码,适配到硬件中。
但是,能够建立自己的加速器则创立了全新的方法。它是这样工作的。分析您的代码,找到热点。对于最难处理的代码部分,建立定制加速器,这节省了 CPU周期,降低了能耗。仿真系统,然后再分析步骤,并重复,直到性能满足要求。这一方法从一个CPU内核上的工作软件开始,产生定制满足实际系统软件要 求的多个硬件加速器。系统第一次反映了软件需求,而不是强制软件符合要求。
2006年,Altera推出了两项创新,支持这种异构多核设计风格。一项是编译器,将一组可执行ANSI C代码转换成加速器,针对Altera FPGA中的Nios? CPU内核进行了优化。这种C语言至硬件加速(C2H)编译器工具自动完成以软件为中心的设计中最耗时和最容易出错的步骤:生成加速器。
第二项创新则不太明显。如果您对比一个快速单核处理器与时钟速度较慢的一组等价处理器的功耗,由于高效的加速器,动态功耗会大幅度下降。但是泄漏 ——多年来一直难以解决的问题,不论电路是否工作,都随着晶体管数量的增加而增大。因此,对于多核设计,泄漏电流对能效的影响最大。
Altera以第二项创新——可编程功耗技术来解决这一问题。硬件和软件工具相结合,对于时序不关键的通路,选择慢速低泄漏电路,减小了FPGA中的泄漏电流,同时实现了时序收敛。结果是,不管深亚微米工艺的泄漏有多大,都满足了异构多核设计的能耗要求。
一致性和增强
最后阶段标志着Altera第三个十年的结束:IP选择的一致性。逐渐的,系统设计领域更加关注最棘手问题的特殊解决方案。特别是,嵌入式系统开发 人员几乎都采用了C语言,嵌入式计算普遍采用ARM?内核,一些接口标准开始成为某些应用的主要标准,例如,高速系统总线、背板链接和芯片间互联等。由 此,Altera开发创新技术来支持这些解决方案。
一个例子是,编程人员表达并行代码的方式。C语言虽然能够很好的定义顺序执行的程序,但是无法表达熟练的编程人员使用的并行处理方法。但是,名为 OpenCL?的C衍生语言可以。2011年,Altera推出了一组工具,支持编程人员采用越来越流行的OpenCL编写并行算法,将其翻译成FPGA 中的并行硬件以及传统CPU中的控制代码,这不需要专门的FPGA设计知识。
多核SoC越来越一致的使用ARM Cortex?-A类CPU内核带来了第二项创新。只要每一个设计团队希望有不同的CPU,FPGA供应商就要满足这些需求,在可编程逻辑中实现软核。但是这种灵活性有其成本:占用逻辑单元、高功耗和低速。
Altera则采用了别的方法:在越来越多的嵌入式和无线应用中使用Cortex-A9。2012年,公司开始推出具有管芯硬核处理器子系统的 FPGA样片:双核Cortex-A9群,有自己的高速缓存、本地RAM、经过优化的存储器控制器,以及部分外设控制器,这些都在ASIC类型基于单元的 硬件中实现。芯片设计人员非常小心的优化子系统和可编程逻辑架构之间的互联,以实现异构多核系统。
这种多核处理器系统和FPGA之间不断的融合带来了另一项更关键的创新。2013年,Altera发布其下一代高端FPGA不仅由传统的代工线合作 伙伴制造,而且还由Intel公司制造,使用了14 nm三栅极工艺,这源自Intel自己的CPU和SoC。从ASIC定位的代工线市场转向擅长CPU的代工线,Altera FPGA独辟蹊径来解决功耗和性能问题,优化半导体工艺特性,而不是优化满足ASIC代工线要面对的各种市场需求,这对于工艺单元、本地RAM和高速互联 都非常关键。
Altera相信,这种选择的结果是打破FPGA业界多年以来所习惯的性能和能耗模式。这是新十年最好的开始。
Altera技术发展里程碑
Altera由Robert Hartmann、Michael Magranet、Paul Newhagen和Jim Sansbury于1983年创立,这些有远见的人们对当时的研究进行投资,认为半导体客户将从用户可编程标准产品中受益,逐步取代逻辑门阵列。为满足这 些市场需求,Altera的创始人发明了首款可编程逻辑器件(PLD)——EP300,开创了半导体业界全新的市场领域。这一灵活的新解决方案在市场上打 败了传统的标准产品,为Altera带来了半导体创新领先企业的盛誉。
纵观历史,这点真的不算什么啊。
再来关注,坐上板凳
了解一下,学习学习
关注下,多多学习了!
前景还是非常不错的
小编威武 分析的很详细 用心分享值得赞
小编威武 分析的很详细 用心分享值得赞
非常不错的分享。 技术在纵向上整理一下,感觉真是有趣。