一种提高电路仿真器收敛性的方法 【技术领域】
本发明属于集成电路计算机辅助设计领域。
背景技术
牛顿迭代是电路仿真工具的求解器所使用的的基本方法,它从未知变量的一组初始值出发,循环的执行以下步骤,,直到未知变量满足收敛条件:
(1)计算F(xk)和F’(xk),求解F’(xk)dk=-F(xk),
(2)xk+1=xk+dk,k=k+1。
晶体管级电路仿真所使用的几乎所有半导体器件,诸如二极管、MOS管等等,它们的模型当中都存在指数函数的关系,由于指数函数是一个增长很快的函数,如果它的参数在某一步牛顿迭代突然变大,那么函数值将会急剧增长,甚至出现溢出,这对于牛顿迭代的收敛性是没有好处的。Verilog-A标准中规定了limexp这条语法,其功能是计算某个变量的指数函数值,同时能够改善牛顿迭代的收敛性,这一功能通常是通过限制其参数的增长来实现的,这相当于使用阻尼牛顿迭代。所谓阻尼牛顿迭代,是指执行牛顿迭代的步骤(2)时,为牛顿方向dk乘以一个实数a,然后更新未知变量xk,即xk+1=xk+adk。
【发明内容】
本发明提出了一种新的实现limexp,提高牛顿迭代收敛性的方法,并给出了其具体实施方式。
在牛顿迭代过程中,limexp的参数可能突然变大,这将导致函数值过大甚至出现溢出错误,从而大幅度降低牛顿迭代的收敛性。为了减弱limexp对收敛性的影响,通常的方法是使用阻尼牛顿迭代,对limexp的参数作限制,不能让其在牛顿迭代过程中变得过大。在计算xk+1=xk+dk,也就是用牛顿方向dk更新未知变量的过程中,如果发现某个变量更新后的大小超过了一定的限度M,那么使用作为阻尼因子来限制这个变量的增长,这样得到的阻尼因子是一个实数。
使用一个实数作为阻尼因子相当于缩短了用牛顿方向改进未知变量的步长,所有的未知变量的改进都由于阻尼因子而变小了,因为改进的步长变小了,那么迭代到真解所需要的步数必然增加,也会延缓收敛速度。也就是说,这种做法对变量增长的限制过于苛刻,并不是所有的变量都只能用很小的阻尼因子作改进。实际上,对于不作为limexp参数的变量而言,它们不会引起函数值的突然增长或者溢出,也就不存在对收敛性的影响,因此是不需要阻尼因子的。而且在一个实际电路当中,作为limexp参数的变量毕竟是少数,所以很有必要对不同类型的变量选择不同的阻尼因子。
本发明提出的计算混合阻尼因子的方法就是对这种想法的实现。对那些不会导致函数值突然增长的变量,可以共同使用一个较大的阻尼因子,而对其它作为limexp参数的变量,根据变量的变化对limexp函数值增长的影响,分别为每个变量计算阻尼因子。这样每次在牛顿方向上改进变量时,如果变量与limexp无关,则使用公用的阻尼因子改进该变量,因为公用的阻尼因子比较大,所以这些变量的收敛性不会受到其它变量过小的阻尼因子的影响,能够正常的收敛;如果变量是limexp的参数,则使用该变量对应的单独的阻尼因子对变量作改进,这样能够保证结果在一个合理的范围,不会因为过大的残差影响迭代的收敛性。与实数阻尼因子不同,这种是一种混合阻尼因子。
【附图说明】
图1带有混合阻尼因子的牛顿迭代流程
图2搜索阻尼因子的流程
【具体实施方式】
采用修正节点分析方法(Modified Nodal Analysis)建立电路方程。在每次迭代提供方程时,提取在xk点电路中每个器件地方程,从而算出当前的函数值F(xk)和它的残差,根据残差判断迭代是否收敛,同时记录下所有作为limexp参数的变量编号。如果没有达到收敛条件,则计算F′(xk),求解F′(xk)dk=-F(xk),得到牛顿方向,为了确保数值稳定性,使用LU分解的方法来求解线性方程组。然后搜索混合阻尼因子,在牛顿方向上利用混合阻尼因子改进未知变量,进行下一步牛顿迭代。带混合阻尼因子的牛顿迭代的流程图如图1所示。
假设方程组一共有n个未知变量,用xkj表示第k步牛顿迭代时未知变量的第j个分量,这个过程中搜索混合阻尼因子的方法如下:
(1)j=0;
(2)判断xkj是否作为limexp的参数,如果是,执行(3),否则,执行(4);
(3)用普通牛顿迭代的方法更新变量,即计算xk+1,j=xkj+dkj,执行(6);
(4)计算a=log(|xkj|+1);
(5)如果dkj>a,那么xk+1,j=xkj+a,否则xk+1,j=xkj+dkj;
(6)j=j+1,如果j<n,执行(2),否则停止;
以上过程的流程图如图2所示。