ASIC设计中各个阶段需要注意的问题

[复制链接]
查看1271 | 回复0 | 2020-12-17 08:51:21 | 显示全部楼层 |阅读模式
本帖最后由 Gaohanqing 于 2020-12-17 08:54 编辑

    01
        基本的ASIC设计流程
ASIC设计流程可以粗分为前端设计和后端设计,如果需要更细的划分,可以分成如下几个步骤:
1.包括系统结构分析设计、RTL编码以及功能验证;
2.逻辑综合、PreLayoutSTA以及形式验证
(RTL代码与逻辑综合生成的Netlist之间);
3.Floorplan、Placement、ClockTree插入以及全局布线(GlobalRouting)
4.形式验证(逻辑综合的Netlist与带有CT信息的Netlist之间)、STA;
5.DetailedRouting,DRC;
6.PostlayoutSTA,带有反标延迟信息的门级仿真;
7.Tape-Out 
当然,这还是一个比较粗的流程,其中每个步骤还可以分得更细,通常所说的前端设计主要包括上述流程中的1,2,4,6这几个部分。同时,这个流程是一个迭代的过程。对于一些通常的问题以及其中的一些方法,已经有大量的文献中提到,本文将不再赘述,因此本文着力于讨论在设计各个阶段中一些容易被忽视的或者可能带来潜在危险的地方。    
    02
        结构分析设计、RTL编码 
这一阶段在整个ASIC设计中占非常重要的地位,结构分析设计阶段主要是从产品的功能定义出发,对产品采用的工艺、功耗、面积、性能以及代价进行初步的评估,从而制定相应的设计规划,对于规模很大的ASIC设计,在这一阶段估算芯片的功耗面积非常困难。
在这里引入一个ASIC设计中很重要的概念:划分(Partitioning),在不同的设计阶段这个概念都将提到。首先,必须在芯片的Top-1级进行功能划分,Top-1级通常可以分为4个大的功能模块,IOPads、边界扫描逻辑、核心功能逻辑,以及PLL时钟模块,然后再对核心功能逻辑依据功能进一步细化。核心功能部分将是RTL编码设计的重点部分,下面就这一部分展开说明。
        良好的编码风格
编码风格对芯片的正确性、可读性、可维护性以及综合后芯片的性能、面积都有很大的影响。自然,对于编码中遇到的所有问题一一阐述不是一篇论文所能做到的,下面只对一些经常遇到的可能产生错误的地方进行重点说明。
无论从可重用设计的角度还是代码仿真行为与实际芯片的行为一致性的角度来说,采用工艺独立的设计是必要的,一些工程师在编码时可能用到一些延迟单元或者延迟线,来生成一个脉冲来操作,由于延迟单元对温度、电压以及制造工艺敏感,这些因素的改变也会改变生成的脉冲的宽度,因此,可能在仿真的时候没有问题,或者在某些操作条件下没有问题,而实际芯片工作时或者工作条件改变时芯片就没有按照设计目标工作了。
在RTL级编码时应该尽量避免采用例化标准单元门的方式编码,这不仅降低代码的可读性,当采用新的单元库或者新的工艺时,这些代码就需要反复的修改,综合工具也不会对这些代码进行逻辑优化。
其他问题如:由于没有对所有的条件分支赋值引起潜在的Latch问题、always块中的敏感列表问题,以及阻塞赋值与非阻塞赋值的选择问题很多文献中都提到,就不再赘述。下面提到一个容易被忽视的问题,在定义时序块时,有些信号是需要复位的,有些不需要复位,如果编码时把它们写在一个always块中,综合出来的电路就不是我们设想的。对于那些不需要复位的信号,综合后可能把复位信号连到对应的触发器使能端,这样导致RTL代码和Netlist的行为不一致,而这类问题在形式验证时也没法发现,需要通过大量的门级仿真才可能发现。
ASIC设计应该尽量避免采用Latch作为时序单元,Latch设计潜在的问题,如:如果使能输入端有Glitch,就会导致锁存噪声数据。或者你能够保证数据稳定时间可以包住使能信号,可你很难保证在使能关闭的瞬间D输入端没有Glitch,尤其在接收总线数据的时候。同时,Latch设计还带来STA和DFT的困难,而采用触发器的设计,通过Setup/Hold时间的检查报出这些问题。因此,尽管Latch设计有面积、低功耗等方面的优势,由于这些潜在的风险使得设计变得不可控,因此不推荐使用。
尽量避免把时钟当作信号使用,在RTL验证时不会出现什么问题,但是,如果在后端设计的时候忽略了对这些点的时钟skew控制,就会产生意想不到的结果。例如:例1:
module  gen_clk(cka,rst_n,ckb);
  input  cka,rst_n;
  output  ckb;
  reg[1:0]ck_cnt;
  always@(posedgecka)begin
  if(!rst_n)  ck_cnt
  else    ck_cnt
  end
  assign   ckb=ck_cnt;
  endmodule
这个代码在RTL级仿真时是不会有任何问题的,其中潜在的问题留待后面讨论。
        同步设计和跨时钟域数据传输
尽管异步系统有很多优势,如低功耗,也没有同步系统中让工程师头疼的时钟分布以及skew问题,但是其复杂的各种握手协议,以及异步电路在测试上的困难,使得同步系统还是数字电路设计的首选。同步设计的一个特点就是所有的时序单元都是对统一的时钟边沿敏感。要使整个芯片只采用一个时钟并不现实,因此,异步时钟域之间的数据传输以及其中的一些问题将是本节讨论的重点。
通常,为了能够更好的综合和STA,需要对设计进行划分,一般的原则是将异步时钟域之间有数据交换的部分独立出来单独处理,其他的模块都在单一的同步时钟域中工作。对于这些模块如何在综合过程中特殊处理在下面的章节中讨论,本节主要讨论在代码设计中需要考虑的问题。
        异步时钟之间的亚稳态(Metastability)问题,亚稳态主要是由于被采样数据的变化十分靠近采样时钟的边沿引起的,这样接收(采样)触发器的输出就是亚稳态,并在传输过程中发散而引发逻辑错误,也就是通常所说的同步失败。在同步时钟域中的这种问题是Hold问题,可以通过EDA工具或插入buffer消除,因为EDA工具可以检测到这种问题。那么在异步接收设计中通过两级Flipflop来消除这种可能出现的亚稳态。现在也有工具检测代码中可能出现的亚稳态问题。多位接收控制信号之间的skew引起的问题如图1,如果其中一位如C2延迟大于C1,Ck采样的数据就变成了C2=1,C1=0,如果按照无skew传输的波形是C2’的样子,应该是00才对。
        而skew是不可避免的,可能是由于C2C1信号的Launch时钟本身的skew引起,也可能是传输延迟引起。对于简单的情况,我们可以通过简化逻辑,尽量让控制信号是1位宽。而这样的问题同样出现在多位宽的数据接收情况。这时通常推荐使用异步FIFO接收,或者通过握手协议接收。有的系统设计数据交换协议约定,异步接收过程中,当某个事件发生后(如图1中采样到V信号为1后)的1个Cycle后(也可以约定多个Cycle)数据肯定是正确的;也可以消除这种skew问题,但是,这种实现需要后端设计时保证这些相关信号的skew不会超过约定的周期,同时发送方的数据也要保持足够的周期数。如图1中C2”信号,如果skew2>Period(一个CKCycle),则收到V信号一个Cycle后采样数据还是错误的。
        

            图1 Skew引起的异步接收问题
        复位策略
        复位信号中最主要的问题是Removal,也就是要保证所有的触发器必须在同一节拍内离开Reset状态,另外,Reset信号完成的时刻不能与时钟边沿太靠近,以防止触发器进入亚稳态(Metastability)。同步复位和异步复位各有利弊,很难说哪种更有优势。除了在编码风格时讲到的一个问题,在这里再对两种策略中可能出现的问题进行分析说明。
        同步复位有一个好处就是复位的时刻发生在时钟的边沿,这样可以防止复位信号的Glitch。如果是内部生产的Reset信号,就必须保证Reset脉冲有足够的宽,至少2个Cycles,能够让时钟采样到。同时,这也是它的缺点,因为它需要一个活动的时钟,在加电时无法对一些电路产生复位。另外,综合可能把同步复位的逻辑移到触发器的D输入端,作为普通的信号处理,由于Reset信号通常有传输负载和延迟,这样处理会导致DataPath上较长的延迟。
        异复位的最大好处就是不需要活动的时钟,对于一些需要加电复位的电路,如总线,是很必要的;同时,不像同步复位那样,复位信号会被用作D端的输入逻辑,使得整个DataPath非常干净。如果异步复位有Glitch可能使芯片进入复位状态,这时可以通过两级DFF接收Reset,再通过tree给复位触发器使用,这样可以消除输入引起的Glitch,如果设计中有多个时钟域,可以对每个时钟分配两个DFF接收Reset信号。
        门控时钟
        GatedClock主要的优点在于能够降低功耗面积,也可以简化逻辑从而提高频率。在编码时需要考虑无Glitch的门控信号设计。同时,在DFT设计时,由于触发器的时钟是前一级逻辑的输出(其他派生时钟也有同样的问题),为了测试这类触发器,需要为时钟增加一级Mux,在正常工作模式下,采用派生时钟,在扫描测试时采用正常的时钟。门控时钟的主要问题出现在综合、CTS插入以及STA分析的时候,在后面将进行特别的分析讨论。
        总线实现
        在这里只讨论总线实现的方式,不涉及总线的协议。在设计总线时将面临着两种基本方式的选择,是采用三态总线还是采用多路选择结构的总线。在全定制设计时,设计者似乎更喜欢采用三态,挂在总线上的各个部件可以分布在芯片的各个部分。
        同时,由于可以减少连线的数量,它必须保证在任何时候,不发生总线冲突,如果多个驱动总线可能导致严重的错误,需要通过一些措施消除这种隐患,比如三态的使能通过解码器产生Onehot的编码,防止多驱动引起的逻辑错误和对芯片的损害;同时,三态总线需要连到上拉电阻上,以防止在一段时间内不驱动总线产生总线数据不确定,而DC等综合并不支持。
        另外,三态总线的电容负载也是一个不可忽视的问题,对性能和面积造成不利的影响,其负载主要来自总线连接的多个电路单元,总线布局本身带来一定的负载;最后,三态总线给DFT设计也带来困难。基于这些理由,在非定制ASIC设计时,我们实在不必要选择三态总线的方式。相比之下,采用多路选择器的问题是较多连线带来的布线拥塞问题,选择器的延迟问题基本上不是什么问题,深亚微米设计中,门的延迟差别已经变少,同时多层金属也带来了足够的布线资源。
    03
        逻辑综合以及后端设计相关问题
        编码风格检查
        DC对编码风格的检查提供良好的支持,在进行逻辑综合之前最好先分析一下DC的log文件,看是否有上述的或其他的一些编码风格问题。通过set_dont_use命令可以禁止使用一些工艺相关的单元,all_registers带参数也可以报告出设计中所用到的Latch。下面主要讨论前面提到的一些情况在综合以及后端实现时的特殊处理。同时,还有很多EDA工具提供编码风格进行检查。
        异步时钟域
        在编码设计中我们通过划分,将异步时钟域接收模块分离成独立的模块,其他模块都采用单独的时钟,综合约束相对简单。对于那些带有异步时钟域的模块,如果不进行约束,DC总是试图去满足采样时钟的setup/hold时间,事实上,设计者并不关心异步时钟域之间的这些问题,而其Metastability问题在编码阶段已经解决。
通常,可以设置异步时钟域之间的Path为false_path。如:set_false_path-from[get_clocksCLKB]-to[get_clocksCLKA]。
        如果异步接口数据的控制按照最后一种方式(也就是在约定的节拍内读取数据),也就需要发送方的数据skew控制在一定范围内。由于没有对这些路径进行约束(虽然可以设置这些path的Maxdelay,但是这种约束对于skew的控制并不能取得好的效果),工具无法对这些路径进行自动优化。因此最好采用手工布局的方法,让这些skew在一个可控的范围内,在STA阶段,也需要对这些skew进行单独的分析。   
        特殊时钟信号处理
        门控时钟像所有的内部时钟一样,时钟的skew可能引起一些保持时间问题,默认条件下,时钟树综合工具并不把逻辑门相连的时钟信号连到时钟树上,非门控的触发器上的时钟是连在时钟树上,这个时钟延迟是相当可观的,为了控制门控时钟与非门控时钟的skew,通常从时钟树叶子节点的上一级引出时钟信号作为控制门的时钟输入。在STA阶段需要对门控时钟的Setup/Hold时间进行特殊分析,以及Glitch检查。
然后,我们再回顾一下例1的代码中的情况,可以用图2的示意图所示。    

        为了方便讨论,时钟树插入以后,假设A与B之间有1个ckaCycle的skew;从图3可以看到如果采用A点作加法器的输入时产生的波形是ckb’,采用B点作为输入时的波形是ckb,显然,从例1的代码来看,ckb才是正确的。因此必须注意到,如果时钟当作普通的信号使用时可能带来的问题,这类问题并没有一个通用的解决办法。
        在这个例子中,不采用时钟树上的信号才是正确的,但是在另外一些应用中,就必须采用时钟树上的信号。比如,时钟是CK的两个触发器中锁存的数据再由CK的高电平和低电平选择输出,那么,这个时候就需要作为选择信号的CK从时钟树上拉过来。因此,如果设计中用到了时钟信号作为普通信号的情况,在后端设计时就必须特殊处理。
        

            图3 Skew引起的设计错误
        如果设计中用到时钟的上升沿和下降沿,在时钟树插入的时候也需要注意采用能够平衡上升沿和下降沿的buffer,以保证较好的占空比。
        位信号
        复位中的Removal问题,对于异步复位信号,需要tree来平衡各个负载点上的skew,但是,Reset信号的skew控制不像时钟那么严格,只要满足Removal检查就可以,PT等STA工具支持Removal的检查。
    04
        带Post-Layout延迟信息的门级仿真
        门级仿真非常重要,它是最后一道关卡,可以从两个方面入手,功能性验证和时序验证,最主要的是时序验证,功能性验证基本上由RTL级已经做了很多充分的工作,如果等价性验证通过,功能性基本没问题。
        时序仿真需要了解到一些仿真工具所采用的延迟模型,仿真工具的延迟计算都是基于一种简单延迟模型:CircuitDelay=TransportDelayInertialDelay
        时序仿真的目标是通过反标SDF文件中延迟信息,模拟一些在RTL级无法出现的一些情况,如复位,状态机的翻转。充分的验证应该包括在bestcase下检查短路径的hold时间,在worstcase下检查长路径的setup时间。
        这些问题虽然在STA也作了检查,门级仿真还是很必要的,尤其在用到时钟双边沿的设计中;另外,对于有异步时钟接口的设计,需要调整异步时钟的相位关系,检查是否存在着同步失败问题;特殊时钟问题,都可以通过门仿验证其正确性;一些窄脉冲是否能通过IOBuffer。总之,这是一个非常重要的过程,需要花大量的时间去分析一些关键信号的波形与设想的是否一致。
    05
        结语
        ASIC设计是一个复杂和全局的过程,从结构设计、代码设计、综合以及物理设计、时序分析、门级仿真,整个过程周期长,每个环节都不能孤立的思考。需要设计人员大量的时间去降低或消除设计中潜在的风险,才能设计出功能正确,性能满足要求的产品。
附:典型的ASIC设计流程(详细)
        1) 结构及电气规定。
        2)RTL级代码设计和仿真测试平台文件预备。
        3)为具有存储单元的模块插进BIST(Design For test 设计)。
        4)为了验证设计功能,进行完全设计的动态仿真。
        5)设计环境设置。包括使用的设计库和其他一些环境变量。
        6)使用 Design Compiler工具,约束和综合设计,并且加进扫描链(或者JTAG)。
        7)使用 Design Compiler自带静态时序分析器,进行模块级静态时序分析。
        8)使用 Formality工具,进行 RTL级和综合后门级网表的 Formal VerificatiON。
        9)版图布局布线之前,使用PrimeTime工具进行整个设计的静态时序分析。
        10)将时序约束前标注到版图天生工具。
        11)时序驱动的单元布局,时钟树插进和全局布线。
        12)将时钟树插进到DC的原始设计中。
        13)使用 Formality,对综合后网表和插进时钟树网表进行 Formal Verification。
        14)从全局布线后的版图中提取出估算的时间延时信息。
        15)将估算的时间延时信息反标注到Design Compiler或者 Primetime。
        16)在Primetime中进行静态时序分析。
        17)在Design Compiler中进行设计优化。
        18)设计的具体布线。
        19)从具体布线的设计中提取出实际时间延时信息。
        20)将提取出的实际时间延时信息反标注到Design Compiler或者Primetime中。
        21)使用Primetime进行版图后的静态时序分析。
        22)在 Design Compiler中进行设计优化(假如需要)。
        23)进行版图后带时间信息的门级仿真。
        24) LVS和DRC验证,然后流片。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

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

本版积分规则