模型检验(1)(091230)大家承认,计算机领域的ACM图灵奖相当于自然科学的诺贝尔奖。2007年图灵奖授予EdmundM.Clarke,E.AllenEmerson,和JosephSifakis。他们创立了模型检验---一种验证技术,用算法的方式确定一个硬件或软件设计是否满足用时态逻辑表述的形式规范。如果不能满足,则提供反例。他们在1981年提出这个方法,经过28年的发展,已经在VLSI电路、通信协议、软件设备驱动器、实时嵌入式系统和安全算法的验证方面得到了实际应用。相应的商业工具也已出现,估计今后将对未来的硬件和软件产业产生重大影响。2009年11月CACM发表了三位对模型检验的新的诠释。本人将用几次对他们的诠释做一个通俗的介绍,对我自己也是一个学习的过程。EdmundM.Clarke现在是美国卡内基梅隆大学(CMU)计算机科学系教授。E.AllenEmerson是在美国奥斯汀的德州大学计算机科学系教授。JosephSifakis是法国国家科学研究中心研究员,Verimag实验室的创立者。模型检验(2)(091231)程序正确性的形式验证依靠数学逻辑的使用。程序是一个很好定义了的、可能很复杂、直观上不好理解的行为。而数学逻辑能精确地描述这些行为。过去,人们倾向于正确性的形式证明。而模型检验回避了这种证明。在上世纪60年代,流行的是佛洛伊德-霍尔式的演绎验证。这种办法像手动证明一样,使用公理和推论规则,比较困难,而且要求人的独创性。一个很短的程序也许需要很长的一个证明。不搞程序正确性证明,可以使用时态逻辑,一种按时间描述逻辑值变化的形式化。如果一个程序可以用时态逻辑来指定,那它就可以用有限自动机来实现。模型检验就是去检验一个有限状态图是否是一个时态逻辑规范的一个模型。对于正在运行的并发程序,它们一般是非确定性的,像硬件电路、微处理器、操作系统、银行网络、通信协议、汽车电子及近代医学设备。时态逻辑所用的基本算子是F(有时),G(总是),X(下一次),U(直到)。现在叫线性时间逻辑(LTL)。另一种常用的逻辑是计算树逻辑(CTL)。它的基本时态是A(对所有以后的交易),E(对某些以后的交易),跟随着F,G,X,U之一。复合公式是线性时间逻辑子公式的嵌套和组合。例如AFp(以后,p终将成立,因此是必然的。)EFp(以后,p最后可能成立。)如图1所示。时态逻辑公式可以在给定的有限状态图上加以解释。所以又称为克里普克(kripke)结构。M包含一个状态集S,一个完全的二进制转换关系R⊆S×S,和一个状态标签L,其原子事实为真。用M,s0|=f表示“在结构M中,于状态s0,f为真。”或者简写为M|=f.例如,M,s0|=AFp当且仅当对在M中的所有通路x=s0,s1,s2,...我们有对任何i=0,P∈L(si).当我们写规范的时候,我们只写AFp,断言公式p是必然的。一个线性时间逻辑公式h意味着在整个结构皆为真,即Ah。在线性时间逻辑中,G¬(C1∧C2)表明进程C1和C2总是互相排斥的。而在计算树逻辑中则写成AG¬(C1∧C2)。AG(T1⇒AFC1)意味着只要进程1进入它的尝试区域T1,它总是进入它的关键段C1。AGEFstart表示系统总是可以重新启动的。这在线性时间逻辑中是无法表示的。而CTL*中的EGFsend则表明存在一个公平的行为,使得send条件可以重复出现。这些逻辑已经在工业界得到广泛应用,包括基于CTL的IBMSugar,基于LTL的IntelFor-Spec,和IEEE1850标准所用的PSL用了CTL*。还有命题演算,非常一般的TL。它允许时态正确性的不动点递归定义。例如EFp=p∨EX(EFp)。时态正确性的不动点特征在模型检验的算法和工具中都很有用。模型检验(3)(091231)时态逻辑用来描述正确的系统行为,模型检验提供实用的硬件和软件验证方法。模型验证可形式地描述如下:给定一个有限结构M,状态s,和一个时态逻辑公式,问M,s|=f?即问:在结构M中,于状态s0,f是否为真?或者说,给定M和f,计算这个集合{s:M,s|=f}。他们证明了这个问题的计算复杂性对公式和结构的大小是线性的。该算法是基于基本时态模型化的不动点原理。例如,如果f(Z)表示p∨AXZ。AFp=f(AFp)是f(Z)的不动点。因为AFp为真,当且仅当p为真,或者AXAFp为真。(意即以后p总会为真,当且仅当p现在就真,或者以后总会为真。)一般来说,可能有许多不动点,但这个是最小不动点,记为µZ=f(Z)。我们可以迭代地计算使得AFp为真的状态集。因为每一个公式都有一个使之为真的状态集。可以证明,单调递增序列false⊆f(false)⊆f2(false)⊆...⊆fk(false)=fk+1(false)揭示最小不动点,如果f(Z)是单调的。CTL模型验证是多项式复杂的,但LTL则是指数复杂的,不过可以接受。问题是时态逻辑公式的可表达性。就是说,什么样的特性可以用时态逻辑公式来表达?例如安全性(“无坏事发生”即G-bad),活性(“有些好事发生”,即Fgoal),及公平性(“有些事常发生”即GFtry)。我们需要用表达式表达所有正确性。如果这一点做不到,就无法使用模型检验。但实际上,时态逻辑公式能够做到这一点,而且接近自然语言。正因为这一点,我们需要LTL,CTL,和CTL*。另一个问题是简洁性,即表达是否简洁。例如CTL*公式E(Fp1∧Fp2)不是一个CTL公式,但它等价于EF(p1∧EFp2)∨EF(p2∧EFp1),这是一个CTL公式,虽然它比较长一些。另一个重要问题是有效性,即对于电路或逻辑,模型验证问题的复杂性及模型验证算法的性能。当然,可表达性、简洁性和有效性是有矛盾的,需要某些折中。一般要求M少于1,000,000个状态。对于状态特别多的机器,可以设法省略一些非本质的详情,以简化M。有人也提出用所谓符号模型检验来处理复杂的机器。这方面的研究还很多,有人甚至考虑无限状态系统。模型检验(4)(091231)模型检验的成功之处在于它用自动搜索代替手动证明来解决验证的问题。模型检验包括三部分:1。基于命题时态逻辑的规范语言,2。表示被验证系统的编码状态机的方法,3。验证算法,对状态空间的智能搜索以确定规范是真还是假。如果规范没有被实现,模型检验能够给出反例。这一条非常重要,因为它帮助我们debug。如图2所示。状态爆炸是模型检验中的一个大问题,因为现在的复杂系统,其状态数都是天文数字。n个相互异步的进程,如果每个进程有m个状态,其状态数为m的n次方(m^n)。近年来,正是在这方面有许多突破。有序的二进制判决图(OBDD)提供了处理大系统进行符号模型检验的可能性。例如某些具有10^20状态的实例进行了符号模型检验。软件进程之间往往是异步的,状态数就会指数级增加。两个事件称为是独立的,如果不论它们按什么顺序执行,其结果是相同的整体状态。用偏序简化方法可以部分地解决异步进程的状态爆炸问题。近年来,布尔可满足性问题(SAT)的进展,对模型检验提出了有界模型检验(BMC)对硬件设计验证特别有效。其主要想法如下。假如要检验形如Fp的性质,BMC要确定是否存在一个长度为k的反例,即是否存在一条长度为k的通路,结束于一个循环,其每一个状态都有¬p。这里所谓有界就是指这个k。有人对9510个锁存器和9499个输入的电路做了BMC。抽象映射是简化模型检验的另一种方法,如图4所示,把一堆状态简化为一个状态。原来系统称为具体系统,而简化了的系统称为抽象系统。抽象系统能够保持具体系统的许多性质,但也会丢失某些性质。已有许多结果揭示这一问题。状态爆炸的问题已经有了许多的研究,但是,并没有完全解决。这正是未来要解决的问题。模型检验(5)(100101)模型检验(modelchecking)自从1981年提出来以后,受到各种非议。至今28年过去了,才得到了学术界和工业界的广泛关注。这是很正常的。要求一个学术成果马上用于实际,很不现实。中国某些干部就这么急功近利。算法的设计验证包括三步:(1)需求规范;(2)建立可执行的系统模型;(3)开发可扩展的算法,一是去检验需求,二是当需求不能满足时进行诊断。需求规范可以用两种方式给定。一种是基于状态的需求,用转换系统指明系统的可观察行为;另一种是基于特性的需求,用说明性的方式。这些需求用一系列的时态逻辑公式表达。IEEE的PSL语言就用了这二者的组合。需求规范的无矛盾性和完全性仍然是一个问题。现在还缺乏某些外部需求的形式化,例如安全性(隐私),可重构性(不相互干扰的构造性),服务质量(抖动度)等。可执行的模型要求忠实性,即模型必须与被验证系统保持语义,而且必须是可检验的。这样,你验证的特性才能在实际系统中实现。为了避错和纠错,模型应该能从系统描述自动产生。对于硬件验证,此事从RTL描述出发,比较容易完成。而对于软件,可能只能在抽象级别上进行。扩展UML进行调度和资源管理无法提供严格的定时特性。而扩展硬件描述语言,像SystemC和TLM由于缺乏形式语义只能用于模拟。可扩展的验证方法对大系统不好做。一个解决办法是根据特定的语义范畴开发抽象技术,即在特定语义领域求解不动点方程。另一个解决办法是面对复杂性,用分而治之的途径。过去,特性被分成两部分:阶段-结论。现在,我们需要组合验证的理论,把验证组合起来,形成一个大的验证。计算机工程于其他自然科学一个巨大的不同就在于保证正确的验证的重要性。其他科学用建造理论来保证正确性和可预见性。我们需要建造复杂系统可靠模型的理论和方法。异构系统可能是同步的或异步的;不同的交互机制,如锁闭、监管、功能调用和消息传达;执行粒度不同,即硬件或软件。我们需要从基于自动机的组合中解放出来,考虑体系结构的组合,像协议、调度和总线。我们需要研究某些特定的特性类,例如无死锁、互操作。而不是去研究一般的安全特性。我们也需要研究特殊体系结构的验证技术。体系结构给定了部件间的交互机制。例如对环形或星形体系结构,对带抢先任务和固定优先级的实时系统,对时间触发的体系结构等。可以像测试定义可测试性一样,定义可验证性。总之,模型检验已经在硬件和软件设计验证中得到了应用,但是,还有许多问题有待研究。模型检验(结束语)(100101)学习完模型检验(modelchecking)三位创建者的文章以后,现在可以说几句结束语了。科学大家就是科学大家。他们就模型检验28年来的发展,对历史、研究动机、已有成就及今后发展做了高度的概括和总结,指明了方向。但是,真要想做这方面的研究,还需要就其中的一个问题,查阅文献,深入下去才行。当今,在计算机工程与科学领域,困扰我们的一个问题是复杂性。系统很复杂,计算很复杂。但是,真要定义什么叫复杂,倒是一个很困难的问题。计算复杂性有一成套的理论,基于图灵机可计算性,有所谓P问题、NP问题。但是,实际上,一个多项式复杂性的问题可能你算不了。例如解线性方程组是多项式复杂的,但是,13亿人建一个13亿阶的方程组,可能现在的超级计算机也算不了。反过来,NP难的问题,在IC设计与测试领域比比皆是。SAT就是一个典型的NP难问题。对于特定的NP问题,我们完全能够用启发式方法,得到很有效率的解。有些过去望而生畏的问题现在已经有了有效的解。例如,OBDD(有序二进制判决图),测试生成,模型检验等。本人上世纪提出的布尔过程,由于复杂性问题而得不到响应。但是,你想一想,我们现在IC设计与测试中碰到的判决问题、优化问题,哪一个是简单的。计算机发展到如此强大,不就是为了处理复杂问题的吗?所以人类的智慧一定会越来越善于处理复杂问题。我想,如果我们请一位博士生,读几篇模型检验的文章,然后写一篇综述,他一定会列出许多模型检验工具,说明它们有哪些功能。林林总总一大堆,内容似乎很丰富。三位大师的文章不是这样的。他们指出的是基础性的问题、前瞻性的问题。这对科学研究才是最有益的。商业工具只是根据基础研究成果,变成大众便于使用的工具。所以,工具一定是要落后于研究的。没有研究出方法来,就不会有工具出现。当然,并不是所有