精华内容
下载资源
问答
  • 形式方法

    2018-03-17 15:29:06
    形式方法:通过数学逻辑来表述一个软件开发,最终还可以通过验证证明软件开发的可行性。
  • 软件形式方法视频教程,非常好,付费购买某视频网站。软件形式方法是指建立在严格数学基础上的软件开发方法。...形式方法使软件开发人员可以应用严格的数学符号来说明、开发和验证基于计算机的系统。
  • 芯片开发功能验证形式方法.pdf
  • 关于形式验证方法学的论文,来自优秀硕博士论文库
  • 嵌入式实时系统对时间约束性、安全性和可靠性具有非常高的要求,但是传统的建模和形式验证方法难以满足对系统的实时性和安全性的模拟和验证需求。通过对有色Petri网的时间属性进行扩展,提出了实时有色Petri网模型...
  • 针对有限域乘法器设计正确性的问题进行研究,阐述了有限域乘法器在高阶逻辑定理证明器HOL4中进行形式化建模和验证的过程。通过分析电路的结构特性和时序特性,提出了结合层次化和基于周期的形式化建模方法,构建4位...
  • 采用模型驱动的FPGA设计方法是目前较为安全可靠的一种方法.但是,基于模型驱动的FPGA设计需要证明FPGA设计模型和生成Verilog/VHDL代码的一致性;...进而,应用信号灯控制电路系统作为验证实例,对验证方法做了检验和说明.
  • 针对目前没有直接对事件图模型进行形式化验证的方法,提出了一种基于行为时态逻辑(temporal logic of action,TLA)的事件图模型形式验证方法。该方法利用TLA语言能够同时表达模型行为与逻辑规则的特点及其与事件...
  • Web服务组合验证是确保组合服务正常执行的...利用模糊推理Petri网算法进行可信度验证、计算服务组合的可信度及可达性,对于Web服务组合是一种可以推理的形式验证方法。实验结果表明这种方法是一种很好的验证方法
  • 软件开发的形式方法

    热门讨论 2012-02-06 22:37:32
    内容涵盖了SE2004中关于"软件的形式方法"的知识点,主要包括:有限状态机、Statecharts、Petri网、通信顺序进程、通信系统演算、一阶逻辑、程序正确性证明、时态逻辑、模型检验、Z、VDM、Larch等。形式方法是...
  • 根据验证对象(模型),验证性质(逻辑),验证方法来分,目前的model checking可分为如下几种: 1 基于LTS的功能性验证 2 基于离散概率模型,如Markov链的性能可靠性等验证 (Probabilistic Model Checking) 3 基于连续...

    根据验证对象(模型),验证性质(逻辑),验证方法来分,目前的model checking可分为如下几种:

    1 基于LTS的功能性验证

    2 基于离散概率模型,如Markov链的性能可靠性等验证 (Probabilistic Model Checking)

    3 基于连续时间Markov链的验证 (Stochastic Model Checking)

    4 基于不确定模型如Markov决策过程,交互式Markov链的性能可靠性验证

    5 基于假设检验的统计模型检测方法 (Statistical Model Checking)

    展开全文
  • 本文在已有基于携带证明代码思想的基础上改进提出一种安全性验证方法。该方法结合形式化验证平台coq,运用形式化逻辑描述电路代码和安全性假设,构造证明过程并采用系统的证明检查器验证证明过程。通过在DES电路代码...
  • 采用形式方法对系统的安全性进行分析与验证,是构造可靠安全软件系统的一个重要途径。当前的形式化安全分析方法,面临着系统的形式化建模难的问题。以铁路车站联锁系统中基本进路建立为例,提出基于场景分析的系统...
  • 软件形式方法9-12,购买于某视频网站。软件形式方法是指建立在严格数学基础上的软件开发方法形式方法模型的主要活动是...形式方法使软件开发人员可以应用严格的数学符号来说明、开发和验证基于计算机的系统。
  • 软件形式方法概述

    2019-04-16 19:08:43
    软件形式方法概述
                   

           友情提示:本文理论性和专业性较强,如果木有接触过该领域,读起来可能会有一点点吃力,吐舌头!本文是Sunny结合多份资料综合整理而成,有点凌乱,见谅!

     

           软件形式化方法(Formal Method)在软件开发中一直都受到多方面的争议。持肯定态度的拥护者认为形式化方法会引起软件开发的革命微笑,另一些持否定态度者则怀疑甚至反对将数学引入软件开发过程中难过

           形式化开发方法的一些争议或缺陷主要体现在:

           (1) 形式化方法中所包含的数学理论,限制了大多数程序设计人员的学习和使用;

           (2) 认为采用形式化方法会延误项目开发周期、增加开发费用

           (3) 许多流行的形式化方法对于较小规模的项目是有效的,但却很难应用于一些大型系统

           (4) 形式化方法不能确保开发出完全正确的软件;

           (5) 缺乏对软件生命周期内各个阶段提供全面支持的形式化方法;

           等。

     

          从广义上讲,形式化方法是借助数学的方法来解决软件工程领域的问题,主要包括建立精确的数学模型以及对模型的分析活动。狭义的讲,形式化方法是运用形式化语言,进行形式化的规格描述、模型推理和验证的方法。就形式化建模而言,形式化表示必须包含一组定义其语法语义的形式化规则。这些规则可用于分析给定的表达式是否符合语法规定,或证明该表达式具有某种性质。

     

           难过关于形式化方法:悲观者的角度难过

           形式化方法是为数学家准备的

           形式化方法仅供从事形式化研究的人使用

           从事形式化研究的人仅使用形式化方法

           形式化方法的运用将延缓软件开发进度

           形式化方法的运用将提高软件开发成本

           形式化方法仅应用于开发安全要求极高的系统

           形式化方法仅被用于无关紧要的系统,且缺少工具支持

     

           微笑关于形式化方法:乐观者的角度微笑      

           运用形式化方法将开发出完美的软件

           形式化方法可以替换传统的软件工程方法

     

          形式化方法的出发点是数学逻辑方法,其目的是开发可靠的软件产品。从软件开发来讲,形式化方法目前并非软件开发的主流。从软件发展看,早期的软件是用于数值计算,程序语言侧重于函数和算法的描述,后来数据库的应用和数据结构逐渐变得重要。现在的软件更为复杂,因此,对象、组件、接口、通讯、开放等成为非常重要的概念。从软件工程方法来讲,有一套描述这些概念的办法,比如说用图形、表格、逻辑、自然语言等,交叉使用以描述一个系统的各个方面。因此换一个角度来考虑,我们也可以以目前常用的软件开发方法为出发点,研究怎样将这些方法形式化,使软件系统的描述精确化,以减少可能的误解所带来的问题;或以目前常用的软件开发过程为出发点,研究怎样在软件开发过程中增加一些形式化方法的应用,以提高软件的可靠性。

     

           形式化方法可以分为形式化描述和建立在形式化描述基础之上的形式化开发。形式化的描述就是用形式化的语言(具有严格的语法语义定义的语言)做描述。形式化的软件开发,就是用形式化的语言来描述软件需求和特征,并且通过推理验证来保证最终的软件产品是否满足这些需求和具备这些特征。这样的验证当然得建立在严格的语法语义的基础之上的。在实际应用中,这是不容易做到的。形式化方法研究的目的就是希望能够提供更好的理论、方法和工具,扩大形式化方法的应用范围和使用价值。

     

           形式化方法的意义在于它能帮助发现其它方法不容易发现的系统描述的不一致、不明确或不完整,有助于增加软件开发人员对系统的理解,因此形式化方法是提高软件系统,特别是Safety-Critical系统的安全性与可靠性的重要手段。最早的形式化方法是逻辑与逻辑推理,它的目标是使推理机械化。从广义上讲,这一目标受到许多挫折,比如说逻辑系统的不完备性(incompleteness)、逻辑系统的不可判定性(undecidability)、自动推理的难处理性(intractability)。但是在一些实际应用上,逻辑方法和自动推理还是起着非常大的作用。

     

           形式化方法在软件开发中能够起到的作用是多方面的。首先是对软件需求的描述,软件需求的描述是软件开发的基础。比如说一般非形式化的描述很可能导致描述的不明确和不一致,如果描述的不明确和不一致将导致设计、编程的错误,将来的修改所要付出的代价就非常大了,如果导致的错误没有被发现,则影响程序的可靠和使用。形式化方法则要求描述的明确性,而描述的不一致性也就相对易于发现。其次是对软件设计的描述。软件设计的描述和软件需求的描述一样重要,形式化方法的优点对于软件需求的描述同样适用于软件设计的描述,另外由于有了软件需求的形式化描述,我们可以检验软件的设计是否满足软件的要求。对于编程来讲,我们可以考虑自动代码生成。对于一些简单的系统,形式化的描述有可能直接转换成可执行程序,这就简化了软件开发过程,节约了资源和减少了出错的可能性。另外,形式化方法可以用于程序的验证,以保证程序的正确性。对于测试来讲,形式化方法可用于测试用例的自动生成,这可以节约许多时间和在一定程度上保证测试用例的覆盖率。

     

     

           形式化方法原则上就是用数学与逻辑的方法描述和验证软件。从描述上讲,一方面是系统或程序的描述,另一方面是性质的描述。这些可以用一种或多种语言来描述。这些语言包括命题逻辑,一阶逻辑,高阶逻辑,代数,状态机,并发状态机,自动机,计算树逻辑,线性时序逻辑,进程代数, π-演算, μ-演算,特殊的程序语言,以及程序语言的子集等。从验证来讲,主要有两类方法,一类是以逻辑推理为基础,另一类则以穷尽搜索为基础。逻辑推理有 natural deduction, sequent calculus, resolution 以及Hoare-logic 等方法,穷尽搜索方法统称为模型检测。这类方法与系统或程序以及系统性质的表示有很大的关系,比如说符号模型检测,其基本原理是用命题逻辑公式表示状态转换关系,用不动点算法计算状态的可达性以及这些状态是否满足某些性质。

     

           形式化方法的应用在电路设计和协议设计上都取得了很大的成绩,但是对于软件来讲还有很多没有解决的问题。软件的描述要比电路和协议复杂,一个软件描述所包含的状态空间通常来讲可以是无限的,因此验证的难度很大。逻辑推理的不足之处在于推理的难度,对于稍微复杂的系统,自动化的推理就难以胜任。人为的推理有很大的缺点,除了费时费力外,比如说一个定理推不出来,并不能说明这个定理不成立,很可能是推理方法和策略应用不当。模型检测的好处在于它有全自动化的检测过程,并且如果一个性质不满足,它能给出这个性质不满足的理由,我们即可据此对我们的系统描述进行改进。模型检测的困难首先是它所能检测的是有限状态模型。这样对于一般软件来讲,需要有一个从任意状态到有限状态的建模过程,并且这样的一个模型的状态空间会面临组合爆炸的问题。

     

           形式验证一般被称为形式化验证方法,是相对于传统的验证(模拟、仿真和测试)而言的。形式化验证方法的主要思路就是使用数学的公式、定理和系统来验证一个系统的正确性等。目前的形式化验证方法可以用于验证硬件系统、软件系统和其他系统,而且形式化验证的技术目前也已经发展到不但可以验证系统的功能正确性(有没有错误),而且可以验证系统的性能指标(功耗、散热、延迟等等)。形式化验证方法主要可以分为三种:定理证明、模型检测和等价性验证。定理证明的基本原理是选定一个数学逻辑体系,并用其中的公式来描述(如软、硬件)系统和系统性质刻画,然后在一定的数学逻辑(如hol逻辑)体系中依据此体系的公理、定理、推导规则和系统描述公式,看看能不能推导出系统的性质刻画公式,如果可以的话验证成功。模型检测的原理比较简单但是非常实用,它将(如软、硬件)系统建模成有限状态系统(一般成为keripke结构),系统的性质刻画用时序逻辑公式表示(CTL,LTL等),而后在此模型上来验证性质刻画的正确性,模型检测于定理证明相比是有很大优势的,他可以全自动地验证,不需要人工干预,而定理证明则在一些关键推导路径中需要数学家控制。还有一种是等价性验证,等价性验证其实是一种半形式话的技术,同前两种验证正确性的技术不同,它验证的是设计的一致性,即不同设计阶段的设计是否功能相同,这种技术中一般采用符号的方法和增量的方法,而且由于这种方法和硬件电路紧密结合,所以电路验证的一些传统方法也大量应用于此中方法中来,比如ATPG技术等。如大家使用的Synopsys的Formality本质上就是一个等价性验证器。形式化验证是非常有用的,只是国内作这一行的人太少。大家可以看看Synopsys和Cadence两家公司,它们都是从形式化验证起家的,然后转到目前流行的将设计和验证统一在一起,即“设计验证”领域。

        

     
      

           软件形式化方法研究内容:
        形式化语言(形式化描述、形式规约):怎样描述软件系统及其行为模式;更好地刻画软件系统的性质,比如说,通讯、分布、开放、移动;各种语言的应用、比较,语言与语言之间的转换;开发相应的软件工具。

        形式化验证(形式验证):怎样验证软件系统符合给定的行为模式;更有效地验证软件系统的性质,比如说,自动化、速度快、内存需求少;各种方法的应用、比较;开发相应的软件工具。

     

        具体来说,软件形式化方法包括以下几个主要研究方向:

        (1) 基础概念:复合、抽象、重用模型、数学理论组合、数据结构及算法。需要对如何复合方法、复合规格、复合模型、复合理论、复合证明等进一步的理解;需要开发出将整体特性分解为易于验证的局部特性的有效方法;实际系统在规格和验证之前都要进行某种程度上的抽象,需要研究出评判抽象层次合理与否的方法;重用不仅可以提高开发效率,而且可以提高软件的可靠性,应当研究可重用模型和理论;许多安全关键反应式系统是数字和模拟混合的,需要连续和离散两个范畴内数学基础支撑的混杂系统理论和技术支撑;大规模、复杂软件中搜索空间是巨大的,需要研究出新的数据结构和算法。

        (2) 形式化方法与面向对象方法的结合:这已经成为软件工程领域的一个研究热点,例如:Statecharts、Petri网、Z语言、VDM等,以及与面向对象方法结合产生的Objectcharts、面向对象Petri网、Object-Z、Z++、VDM++等。这方面的研究体现在两个方面:利用面向对象结构来提高形式符号的表达能力;使用形式化方法来分析面向对象的语义或提高这些标记符号的表达对象概念的能力。形式化方法和其他传统软件开发方法相结合以达到取长补短的目的,也是值得研究的课题。

        (3) 工具开发:具有良好用户界面、易于学习和操作简单的形式化方法支撑工具,对于形式化方法的推广应用是大有裨益的。追求通用的完善的形式化方法及其支撑工具是不现实的,侧重于如下某一个或几个方面准则的特色方法和工具是未来研究的重点。这些准则包括:一旦开始使用之后尽早得到明显的效益;效益随着开发者的了解深入和熟练而增加;单一规格可以在软件开发生命周期的多个阶段取得效益;能和其他通用编程语言或方法交互使用;工具应当像编译器那样易于使用、输出,也易于阅读;概念和工具应当易于入门和学习掌握;软件特性分析有所侧重;支持渐进软件开发,允许部分规格和验证。此外,特定问题域的形式化方法及其工具研究也是非常重要的。


    【作者:刘伟   http://blog.csdn.net/lovelion

               
    展开全文
  • 针对SOC验证的需要,研究了形式验证方法,重点分析了二元决策图(BDD)的等效性检查技术,设计了FSM等效性检查的程序,以及算法级描述控制流程到BDD转换方法;研究了利用计算树逻辑进行的模型检查技术,给出了CTL...
  • java开发的cms系统源码在软件工程中使用形式验证方法的公司列表 如果您在列表中看到不再存在的公司,或者不再使用正式方法,请发送带有解释的拉取请求。 如果您目前正在或知道一家使用正式方法但不在列表中的公司,...
  • 本文实例讲述了C#验证给定字符串形式日期是否合法的方法。分享给大家供大家参考。具体分析如下: 这段C#代码用于验证日期的有效性,对于用户输入的不规则日期也作了简单处理,比如用户输入了“今天”,则代码会认为...
  • 智能合约的形式验证方法 APT
  • 关于最佳的验证方法,最近总能在各种文章中看到。这里希望以一些新的视角来看待这些问题。所以根据一些EDA公司代表对相关问题的回答,总结出本文。   受邀回答问题的代表有:Steve Bailey,Mentor Graphics公司...

    本文转自:http://www.eetop.cn/blog/html/28/1561828-513396.html

    关于最佳的验证方法,最近总能在各种文章中看到。这里希望以一些新的视角来看待这些问题。所以根据一些EDA公司代表对相关问题的回答,总结出本文。

     

    受邀回答问题的代表有:Steve Bailey,Mentor Graphics公司新兴技术总监;Dave Kelf,OneSpin解决方案营销副总裁;Frank Schirrmeister ,Cadence高级产品管理总监;Seena Shankar,Silvaco的技术营销经理;Vigyan Singhal,Oski技术总裁兼首席执行官 ;Lauro Rizzatti,验证顾问。

     

    最好用的验证技术

    对于验证技术讨论,大都集中在模拟(硬件加速)和仿真之间,但是同时,形式验证也不应该被忽略 。但是以下内容并不包括基于FPGA的验证,因为除了价格因素,它跟仿真实际是一样的。那么,到底哪种验证技术是最好的呢?各种验证技术都在广泛应用,各种验证技术都有其优势,显然武断地回答这个问题并不合适。

    正如Lauro Rizzatti所说的那样,这得取决于要进行验证的设计的特点。他说:“虽然我是偏爱仿真的,但是当设计并不太复杂时,模拟和形式验证还是应该优先考虑。对设计debug时,模拟要优于仿真太多了。因为模拟交互性强、灵活多变,支持时序分析。然而,在现在的IC设计中,设计复杂性的增长是大势所趋,这个复杂性不光是说有更多的晶体管和门电路,还意指会有更多更复杂的嵌入式软件的代码。面对这种趋势,模拟和形式验证都显得有些无能为力,然后仿真就成为了首选。”

    Vigyan Singhal写道:“形式验证和仿真都越来越流行。模块级的bug(其实大多数bug都是模块级的)使用形式验证debug效益最高,系统级的bug最好还是通过仿真来debug吧。许多时候,我们在设计流程中常出现的问题是,形式验证的使用还是不够早啊!”

    Seena Shankar的观点是:“模拟中,RTL和测试平台都是完全可视的,在开发周期的早期阶段,更容易修复错误并重新模拟验证。但是我们也会被可运行周期限制住,对于1亿门的设计,进行只有几个功能操作的基本测试可能需要长达12小时才能完成。虽然仿真花费更长的初始设置时间,但是数以百万计的操作可以在几分钟内运行完成,这是极其有利的一面。不过,对于与仿真,debug是非常困难、很费时间的。形式化验证需要不同方面的专业知识,虽然只对验证小的模块有用,但是通过假设和约束,形式验证可以发现一些角落处的bug。”

    Steve Bailey得出的结论是:“似乎现在模拟的使用越来越少了,但是这都是相对的。验证周期也在大幅增长。即使硬件加速和形式验证是整个验证流程中主要的部分,但是模拟验证的周期相比自身也还是在增长。形式验证已经成为验证中非常重要的一环,基于形式验证的全面性,形式验证更偏向于应用于一些验证花费可能比较高的验证任务(一般都是比较难比较有挑战性的任务)。”

    所以呢,就我看来,如果我可以决定的话,我会在设计周期尽可能早的时候使用形式验证工具制定一个可执行的规范,确保预期产品的所有功能特性都能被覆盖到。我同意模拟和仿真之间的选择取决于被验证模块的大小,而且我也觉得软硬件协同仿真常需要使用仿真加速设备。

     

    不同技术的联合使用

    每一种技术都在特定的条件下,都有其独特的价值。那么不同的技术之间可以很容易联合使用吗?

    Frank Schirrmeister提供了一个很详尽的回答,并附了一张图显示一些不同验证方法的联合使用。

    部分示例:

    1. 结合了RTL模拟和仿真的仿真加速。这种方法不仅具有模拟测试平台的表达力,而且跟仿真可综合DUT一样,有较高的验证效率。
    2. 仿真和基于FPGA原型的验证可以共用一个共同的前端,比如在在Cadence系统开发套件中,允许更快的采用多结构编译。
    3. 对于断言,X传播等,形式验证和模拟验证结合的很好,当断言可以被综合,并且映射到仿真上时,形式验证技术甚至与基于硬件的执行相关。

     

    Vigyan Singhal指出:“对于不同技术联合使用,数据库的交互性和较差的testbenche是局限之所在,目前还没有统一的能够融合形式验证、模拟和仿真结果的覆盖率数据库标准。”

    Dave Kelf总结说:“这里真正的问题是如何把需求和设计规范描述为机器可识别的内容模式,使用这些信息来生成验证计划,将它们转化测试结构,并提取可以与验证计划比对的覆盖率信息。这种自顶向下的封闭环境常被认为是理想的,但我们至今还没有在产业上将其实现,如何创建机器可识别的规范这个基本问题一直在限制我们。”

     

    可移植的激励

    Accellera 已经成立了一个学习小组,用于开发可移植的激励方法。这个小组十分活跃,并且已经在这一方向去的一定进展。但由于该小组并未发布其成果信息,所以就不太好提出任何具体问题,但是我认为提出在这一方向进行研究的决断是非常重要的。

     Frank Schirrmeister 评论说:“在顶层,可移植激励的工程里,允许设计者创建测试案例来验证SoC,其中包括低功耗的方案和高速缓存一致性的项目。测试案例作为可以在任何设计的处理器上执行的软件例程,激励变得可以在不同的动态引擎、具体的模拟、仿真和FPGA原型间移植。这带来的一个优势是,回归测试可以在较快的引擎中使用,并产生较少的bug,并且遇到bug的时候能很快的检查传问题之所在。”

    Dave Kelf也对这项工作持积极态度:“可移植的激励对于抽象UVM测试结构的关键部分是非常有帮助的,使得他们可以被用于模拟和仿真。这是个值得努力的方向,但目前也还是只停留在表层。还需要引入断言,并且考虑这些激励该如何从高级规范派生得到。”

     

    SystemVerilog

    SystemVerilog被认为是最好的SoC验证语言。然而,许多受访者表示SystemVerilog是有一些局限性的。

    Seena Shankar回答说:“SystemVerilog是用于系统验证的最好语言吗?SystemVerilog封装了从软件和硬件范例等用于验证的最佳特征。它是一个非常容易遵循的标准,但是就性能来说,可能不是最佳的。”

    Dave Kelf也说:“最名不副实的语言就是SystemVerilog了,这种语言并不是为系统验证设计的,它的名字中带了system只是当初为了和SystemC进行竞争,这显然很荒谬。现在,当然也可以在系统级验证使用SystemVerilog,但很显然,C衍生语言还是更为有效。”

     Frank Schirrmeister评论指出:“SystemVerilog和UVM之类技术在IP和子系统级别上很好用,但似乎当扩展到完整的系统级芯片(SoC)的验证时,就显得有些乏力了。这就是可移植的激励项目的由来,它可以把UVM可用的部分延展到SoC级别,允许从IP到SoC级别的垂直复用。这种方法克服了UVM在SoC级验证比较乏力的问题。

     

    结论

    设计工程师和验证工程师仍然在等待来自EDA工具商的帮助。他们在应对越来越复杂的设计的时候,不得不面对不同的方法学以及不完善的验证语言。设计师必须谨慎,以确保他们写的东西是可验证的,同时验证工程师不仅需要理解设计的需求和架构,还要熟悉设计者使用的语言的特点,从而描述结构和产品的预期功能。我认为,要改善这种情况的一个方法是,对于一个新的设计,EDA公司和系统设计公司都要考虑到这将是一个集成了软件、硬件、机械和物理特性的产品,最终,能够使开发和验证能选择的最合适的、可共存的、提供一致结果的工具。

    展开全文
  • 形式验证调研报告

    千次阅读 2018-10-17 14:56:24
    形式化验证调研报告 王立敏 中国科学院信息工程研究所 第五实验室 北京 中国100093 ...形式化方法作为一种静态验证方法,正好可以解决这些问题。本文主要梳理了当前形式化方法检测的常见方法,并且列出他们的优...
    形式化验证调研报告
    王立敏
    中国科学院信息工程研究所 第五实验室 北京 中国100093

    摘要2018年初,Spectre和Meltdown漏洞的发现,使得芯片安全备受重视。然而传统的基于仿真的芯片验证方法由于测试样例覆盖不完全,验证过程耗时巨大,逐渐适应不了日益复杂的芯片了。形式化方法作为一种静态验证方法,正好可以解决这些问题。本文主要梳理了当前形式化方法检测的常见方法,并且列出他们的优缺点,以及前人对这些缺点的改良方法。

    关键词
    芯片安全,形式化验证,二元决策图,时序逻辑,Petri网,定理证明,等效性检验,模型检验

    Formal Verification Investigation Report
    Wang Liming 1
    Institute of Information Engineering, Chinese Academy of Sciences, Beijing 100093, China

    Abstract At the beginning of 2018, the discovery of Spectre and Meltdown attacks made chip security receive much more concerns. However, due to the serious drawbacks in the simulation-based methods in tradition such as the test cases did not cover all of the inputs and the time consuming of the simulation, this method became inappropriate to validate the chips that became more and more complicated. Formal Methods is a static verification method, which would solve these problems that the simulation-based methods bright. This report would list their advantages and disadvantages, as well as the previous methods that attempt to solve these problems.

    Key words Chip security, Formal verification, Binary Decision Diagrams,Temporal logic, Petri net, Theorem Proving, Equivalence Checking, Model checking

    1 引言

            近些年来,芯片的性能和规模不断提升,集成电路的设计也越来越复杂,使得引入错误和问题的可能性日益增加。但是传统的基于仿真的集成电路验证方法的覆盖率难以达到100%。而形式化方法作为一种静态测试的方法,通过数学的推理证明,理论上可以实现绝对安全,找出难以发现的错误,因此广受研究人员的关注。

    基于仿真的集成电路验证

            目前应用最广泛的依然是基于仿真的验证方法。这种验证方法通常需要一个测试基准,通常同时对待验证的电路和测试基准施加相同的激励,然后通过对比他们的输出来判断电路是否正确。这些输入向量可以事先生成,然后在测试期间从数据库读入,也可以边测试边生成。

            基于仿真的验证只能证明电路在指定的输入向量下输出正确,若要证明电路的正确性,输入向量必须覆盖电路的所有输入组合。但是现在集成电路十分复杂,要实现这一点是十分困难的。令人遗憾的是,许多不安全的因素或者错误都是出现在测试向量难以覆盖的地方[1]。而且这种验证方式主要用于发现逻辑漏洞,而并不能检查出芯片中的安全漏洞。

    基于形式化方法的验证

            基于形式化方法的验证是通过数理逻辑推理的一种方法。一般分为形式等效性检验(Equivalence
    Checking),定理证明(Theorem Proving)以及模型检查(Model
    Checking),如图1所示。

    图1 形式化方法的分类

    图1 形式化方法的分类

            形式等效性检验一般用于检测两个电路设计逻辑相等,电路设计一般使用硬件描述语言(Verilog或者VHDL)进行描述,然后综合成门级电路,接着再进行一系列的优化。这里的每一个步骤都会导致电路设计的改变,因此检查每一步操作前后的电路设计是否逻辑等效是有必要的。有些时候优化操作需要人为干预,因此也需要使用等效性检验来确保这些操作没有引入错误。除此之外,设计完成的芯片也需要与对应的黄金模型进行对比,以确保集成电路设计的正确性。

            定理证明方法是一种将模型抽象为逻辑公式,然后使用自动的逻辑推理技术来验证电路是否正确的技术。但是定理证明方法在使用时需要专业人士事先制定大量的定理和推理策略。因此它在自动化推理方面能力较差,不适用大规模的系统。

            模型检验是一种基于状态迁移系统的自动验证技术。它最早是由Edmund M.
    Clarke和他的研究生E.A. Emerson以及A.P.Sistla提出来的[2]。使用这种方法首先需要提出一系列规格属性,这些属性表示对电路的安全需求,系统只要满足这些属性,就能确保安全。然后建立一个电路系统的模型,即可通过模型检测方法自动地检测模型是否满足这些规格属性。模型检验一般用于电路和协议的验证。

    总结

            基于仿真的集成电路验证需要输入向量,而形式化验证并不需要。前者是先生成输入向量,再验证输出向量,而后者的考虑方向则相反,要先指明什么样的输出是符合要求的,再利用形式化方法去证明它。由于基于仿真的集成电路验证存在覆盖率不能达到100%,以及仿真时间过长等问题,而形式化证明则正好能解决这些问题。因此形式化验证开始被研究人员广泛关注。

    模型的建立

            要使用形式化方法,需要先为电路建立模型,这些模型通常用一些图的数据结构或者公式来表示。形式化模型建立完成后,即可使用形式化算法对其进行检验。

    二元决策图
    2.1.1 二元决策图概述

            二元决策图(Binary Decision Diagrams,BDD)可以很好地表示一个布尔函数。所谓布尔函数,即定义域和值域都是布尔值的函数,布尔函数在电路设计和密码学方面有广泛的应用。由于电路的输入和输出都是二进制值,这意味着电路可以表示成一个布尔函数,因此使用BDD结构来表示电路是十分合适的。

    2.1.2一个例子

    表1 f(x1,x2,x3)的真值表

    x1x2x3f(x1,x2,x3)
    0000
    0010
    0100
    0111
    1001
    1010
    1100
    1111

            假设有一个电路,电路的功能如公式(1)所示。
    (1) f ( x 1 , x 2 , x 3 ) = x 1 x 2 + x 1 x 2 ‾ x 3 ‾ f(x1,x2,x3)=x1x2+x1\overline{x2}\overline{x3} \tag{1} f(x1,x2,x3)=x1x2+x1x2x3(1)

            其真值表如表1所示。于是可得出该电路的BDD图,如图2,x1,x2,x3为变量,实线表示变量赋值为1,虚线表示变量赋值为0。

            由表1真值表可得,当x1,x2,x3分别赋值为0时,f(x1,x2,x3)的值也为0。则如图2在BDD图中沿着x1,x2,x3,0之间的虚线最终也会到达0的地方。如图中所示这样变量有序的BDD图也可以称作有序二元决策图(Ordered Binary Decision Diagrams ,OBDD)图。

            可以发现,当x1赋值为0,x2也赋值为0时,无论x3赋何值,最终结果也是0,因此可以将BDD再做精简。如图3中简化后的BDD所示,可以将这条路径中的x3节点删除,直接将x2用虚线连接至0处,这个过程可称为BDD的简化,而最终的简化结果则称为简化的有序二元决策图(Reduced
    Ordered Binary Decision Diagrams,ROBDD)。

    图2 f(x1,x2,x3)的BDD图

    图2 f(x1,x2,x3)的BDD图

    图3 f(x1,x2,x3)的简化BDD图

    图3 f(x1,x2,x3)的简化BDD图
    2.1.3基于二元决策图的电路表示

            对于组合逻辑电路而言,可以直接使用上述方法生成BDD结构。但是对于时序逻辑电路而言,则需要根据其特点生成有限自动机(Finite State Machine,FSM),再使用BDD来表示FSM的状态变迁过程,在形式等效验证和符号模型检验中常采用这一方法来表示电路。

            BDD本身不能减少状态空间,随着变量数的增加,状态空间数依然呈指数级上涨,但是它也有许多优点,比如表达形式简洁,并且配合图算法可实现快速的操作,用于表示电路十分合适。

    时序逻辑

            时序逻辑是逻辑领域中一个重要的组成部分,它在形式化验证中有十分重要的应用

    表2 时序逻辑的操作

    符号操作解释
    θUψUntil若θUψ在路径上为真,则θ一直保持真直到ψ为真
    θRψRelease若ψ为真,直到θ为真(或者θ永远不为真)则θRψ在路径上为真,
    Next若Xθ在路径上为真,则下一个时刻θ为真
    Future若Fθ在路径上为真,则θ最终一定为真
    Globally若Gθ在路径上为真,则任何时刻,θ都为真
    All表示对于任意路径
    Exists表示存在这样的路径

            可以使用如表2所示的符号来描述硬件系统的行为,例如我们要表示“信号A一直不变,直到上升沿才翻转”这一操作,则我们令p为“信号A不变”,q为“时钟到达上升沿”,则该操作可表示为当满足pUq使信号A翻转。

            比较常用的时序逻辑是线性时序逻辑(Linear temporal logic,LTL)以及计算树逻辑(Computation tree logic,CTL)。线性时序逻辑是个线性结构,每一个时刻都只对应一个后继,计算树逻辑则是一个树状的分支结构。LTL可用于重点对象的分析,并且它可以使用公平的概念,但是对于一些可返回到初始状态的复杂系统,LTL则无法表示。CTL则相反,它无法使用公平的概念,但是却可以表达一些较为复杂的系统[3]。LTL和CTL各有自己的优势,E. A. Emerson 和 Joseph Y. Halpern 在 1986年提出了CTL*,统一了LTL和CTL。在传统的模型检验中,通常采用时序逻辑来描述电路。

    Petri网

            Petri网是一种重要的数学工具,Petri网对系统的并发性,异步性和不确定性具有很强的描述能力,一般主要是使用Petri网的可达图[4]。

    Petri网通常为四元组N= <P,T,F,M0>

    P:库所(Place)的有限集

    T:迁移(Transition)的有限集

    F:F ⊆ (P x T) ∪ (T x P),表示边的集合。∪前后分别表示输入函数集以及输出函数集。

    M0:P->N,表示初始状态集

    库所(Place)表示系统的状态。一般用圈圈表示。

    迁移(Transition)则表示资源的消耗使用,一般用黑色矩形表示。

            连接库所与变迁的有向弧表示输入输出函数。用令牌Token表示库所中的资源数量,一般用●表示。

            资源会沿着有向弧流动,当资源足够时,便会触发某些操作的执行来使用和消耗资源。即令牌会不断沿着迁移流动,令牌在迁移之前积聚叫做迁移的使能(enabled),令牌积累到足够数量之后便能通过迁移,这一过程也叫迁移的激发(fire)。

            图4表示一个互斥系统的Petri网,双方发出进入临界区的请求,当其中一方进入临界区时,另一方只能等待。图中的小黑点表示Token,最中间的库所t表示哪一方可优先访问临界区,当Idle中的Token传递到Wait时,t中个Token也会流到可优先进入临界区的那一方,于是便可以激发迁移Access,当经过Free之后,Token又将回到Idle和t中。

    图4 互斥模型的Petri网

    图4 互斥模型的Petri网

    1.形式化方法

    形式等效验证(Equivalence Checking)

            假设我们有Spec1和Spec2两个模型。若需要验证综合优化前后两个模型是否逻辑相等,则Spec1和Spec2可分别表示综合优化前后的设计。若需要验证设计的正确性,Spec1通常为黄金模型,Spec2则为我们的设计。Spec1和Spec2通常使用相同的数据结构,例如BDD,再根据具体的需求使用诸如布尔SAT求解程序(求解可满足性问题)之类的算法来进行等效性检验。

            虽然等效检验的检测效果不错,在工业上也得到了应用,但是在使用过程中依然需要高层次的专业人员去制定等效检验框架[5]。而且在复杂的电路中,等效性检验也存在状态空间数呈指数级增长的问题。虽然学术界提出了各种优化的方法,比如将复杂的等效检验切割成小的可比较集合进行处理[6],或者利用算法优化减少空间消耗[7],但是状态空间爆炸问题依然没有很好地解决。

    定理证明(Theorem Proving)

            定理证明方法十分严格,跟数理逻辑结合十分紧密。一般使用高阶逻辑(Higher-Order
    Logic,HOL) 系统来进行证明。

            要验证一个大的系统,通常采用目标制导的方式。将系统用HOL表示出来之后,再分为若干个子命题分别证明。定理证明方法对硬件模块的验证一般会用到抽象技术和层次化验证技术

            在证明之前需要对系统进行建模,Mike Gordon在论文[8]中提出可以直接利用HOL来为硬件建模。一个器件模块只有输入输出,这些输入输出可以用HOL中的谓词和函数表示,而模块之间的连接可用合取表示。

            抽象技术主要用于将系统的详细信息掩盖掉,只考虑需要关注的性质,这样可以方便算法的处理。根据关注对象的不同,可以分为不同的抽象。例如结构抽象掩盖了内部结构信息而只描述了设备的规范,而行为抽象则只对模块的部分行为进行定义,数据抽象则是通过一个映射,将现实中的数据抽象为一个较小的抽象数据集,比如布尔真值。

            层次化验证技术是将大的模型划分为小的模型,构建成一个树状结构,每一个子节点都是父节点的细化。下一层的正确性可以证明上一层的正确性,因此自下而上地证明可以确保根节点的模型的正确性。

            定理证明方法在工业上也有一定的使用,但是定理证明方法需要对系统用严格语义的数学符号进行描述和推理,因此对用户而言十分复杂。而且并没有办法确保事先人为制定的规则和定理的正确性,因此最终的正确性也值得怀疑,即前提若有错误,则最终的验证结果就不一定正确。

    模型检验(Model Checking)

            模型检验是目前最为流行的形式化检测方法。但是它依然存在状态空间爆炸的问题,模型检测方法的发展几乎都是为了解决状态空间爆炸问题以及不同系统的适用性问题展开的。

            状态空间爆炸问题一直制约着模型检验方法的发展,为此科研人员一直寻找合适的方法来解决这一问题,例如符号模型检验,偏序规约技术,以及近些年来十分热门的SAT技术。

    3.2.1符号模型检验

            符号模型检验的提出是解决状态空间爆炸问题的一个里程碑,它采用OBDD来描述电路。这使得模型检验可检查的系统规模大大增加,可以超过1020个状态。

            McMillan最先将OBDD引入模型检验技术[9],提出了符号模型检验,最初时符号模型检验只是基于CTL公式的。该方法将CTL公式转化成OBDD图,并在OBDD上搜索状态空间。之后Clarke等人又提出了基于LTL的符号模型[10]。

            符号模型检验中,存在许多优化方法,最常见的两种方法是偏序规约技术[11]和抽象模型[12]。

            由于系统中可能存在两个并行的模块,而这些并行模块的运行组合有许多种,其中的一部分运行组合实际上是重复的。因此若能将并行的模块的运行次序固定下来,在验证过程中就可以减少许多重复的路径。

            抽象技术多用于需要数据处理的系统,符号模型检验的数据处理能力较弱,若是需要表达复杂的数据结构,则验证的复杂性会十分的高。因此可以将精确的数据值和抽象的数据集合做个映射,产生一个较小的抽象数据集,以此来简化符号模型检验的状态空间。

    3.2.1 SAT技术

            基于BDD的符号模型检验虽然使得可检验的系统规模增加了许多,但是状态空间爆炸问题并没有彻底解决,在BDD中,状态空间依然是指数级增长的。BDD可通过简化生成ROBDD来减少状态空间,但是可优化的余地依然比较少。随着SAT技术的发展,它也被引入到模型检验领域[13]。

            SAT是NP完全的方法,因此它也是指数爆炸型的,为此Clarke等人提出了限界模型检验[14]。模型检验是通过对整个系统建模,并证明我们的模型是否满足我们定义的属性规格。而限界模型检验,则通过广度搜索的方法,从长度为1的路径开始搜索,搜索的路径长度逐渐递增,若能在长度为K的路径中搜索到不符合属性规格的路径,则停止搜索并报告这一反例。

            虽然限界模型检验搜索到反例后即可停止这一机制使得其遍历的状态大大减少,但是它只检查了整个状态空间的一个子集,只能证明在限界中的那部分状态符合属性规格,而无法证明整个状态空间符合属性规格。

            为了解决这一完整性问题,目前学术界较为流行的做法是逼近所求的解,即迭代地计算可达状态的不动点,来验证这整个模型是否最终满足规约。

            Yakir Vizel等人于2015年整理了各种适用于SAT的优秀的算法,这些算法包括冲突驱动从句学习(Conflict-Driven
    Clause Learning),随机局部搜索(Stochastic Local Search)[15]。

            SAT技术在经过EDA社区与科研人员的相互促进之下,在过去十年中取得了很大的进步。虽然SAT在工业界也得到了应用,但是它依然无法很好地解决模型检验的状态空间爆炸问题和限界模型检验的完整性问题,此外并行SAT技术也是一个十分有前景的方向。

            而为了解决不同系统的适应性问题,如第2部分所述,研究人员提出了许多不同的建模方式。传统的模型检验方法一般采用时序逻辑来描述电路。

    4 讨论

            传统的基于仿真的验证方式虽然存在有覆盖不完全,耗时间等问题。而形式化验证则正好可以解决这些问题,然而这并不意味着形式化方法可以完全替代传统的仿真验证。形式化方法依然存在许多的局限性,目前最好的办法是将传统的仿真验证与形式化验证结合起来。

            虽然在工业界和学术界的共同促进之下,形式化验证技术有了长足的进步。但依然存在不少进步的空间。模型验证是目前自动化水平最优的,很少需要手动干预,但是状态空间爆炸的问题依然令人十分困扰。为了提高形式化验证的速度,研究人员依然在尝试攻克检测技术的并行化的问题,这也是目前较为火的一个方向。此外为了能够使用到工业界,形式化验证必然还是需要提高检测技术的自动化水平,例如门级信息流的方法[16]利用关键信息只能从低安全级流向高安全级这一特性,简化了形式化方法建模的流程,使其可以自动生成模型。此外,纵观整个形式化验证方法的发展历程,可以发现许多形式化验证的突破,都是因为将一些已经存在的理论成果移植应用到工程中去,因此我们也可以从这一方面去考虑如何改进形式化验证的方法。

            形式化方法是个十分有前景而又十分重要的研究方向,不仅可以用于检测出难以发现的逻辑错误,也可以检查电路中隐藏的硬件木马,甚至发现较为隐秘安全漏洞。因此上述的一些形式化方法的局限依然值得我们在日后重点研究。

    参考文献

    [1] LAM W K. Hardware Design Verification: Simulation and Formal Method-Based
    Approaches (Prentice Hall Modern Semiconductor Design Series)[M]. Upper Saddle
    River, NJ, USA: Prentice Hall PTR, 2005.

    [2] CLARKE E M, EMERSON E A. Design and synthesis of synchronization skeletons
    using branching time temporal logic[J]. : 20.

    [3] 张瑞雪, 郝春梅, 王旭. 计算机形式验证方法研究综述[J]. 中国电子商务, 2011(5):
    69–69.

    [4] 蒋屹新, 林闯, 邢栩嘉. 基于线性时态逻辑的Petri网模型检测[J]. 系统仿真学报,
    2003, 15(z1): 6–10.

    [5] KREIKER J, TARLECKI A, VARDI M Y等. Modeling, Analysis, and Verification -
    The Formal Methods Manifesto 2010 (Dagstuhl Perspectives Workshop 10482)[J].
    HERBSTRITT M. 2011.

    [6] KUEHLMANN A, KROHM F. Equivalence Checking Using Cuts and Heaps[J]. : 6.

    [7] PARUTHI V, KUEHLMANN A. Equivalence checking combining a structural
    SAT-solver, BDDs, and simulation[C]//IEEE Comput. Soc, 2000: 459–464.

    [8] HAN J, STONE G. The implementation and verification of a conditional sum
    adder[J]. 1988.

    [9] MCMILLAN K L. Symbolic checking,An approachto the state explosion
    problem[J]. : 212.

    [10] CLARKE E, GRUMBERG O, HAMAGUCHI K. Another look at LTL model
    checking[C]//International Conference on Computer Aided Verification. Springer,
    1994: 415–427.

    [11] PELED D. All from one, one for all: on model checking using
    representatives[G]//COURCOUBETIS C. Computer Aided Verification. Berlin,
    Heidelberg: Springer Berlin Heidelberg, 1993, 697: 409–423.

    [12] CLARKE E M, GRUMBERG O, LONG D E. Model checking and abstraction[J]. ACM
    transactions on Programming Languages and Systems (TOPLAS), 1994, 16(5):
    1512–1542.

    [13] 王瑞. 基于SAT的符号化模型检验技术研究[D]. 国防科学技术大学, 2014.

    [14] CLARKE E, BIERE A, RAIMI R等. Bounded Model Checking Using Satisfiability
    Solving[J]. : 20.

    [15] VIZEL Y, WEISSENBACHER G, MALIK S. Boolean Satisfiability Solvers and Their
    Applications in Model Checking[J]. Proceedings of the IEEE, 2015, 103(11):
    2021–2035.

    [16] HU W, MAO B, OBERG J等. Detecting Hardware Trojans with Gate-Level
    Information-Flow Tracking[J]. Computer, 2016, 49(8): 44–52.

    Blog:形式化验证调研报告

    展开全文
  • 什么是形式方法

    2020-10-21 19:43:02
    形式方法英文的名称是formalmethods。在逻辑科学中是指分析、研究思维形式结构的方法。它把各种具有不同内容的思维形式(主要是命题和推理)加以比较,找出其中各个部分相互联结的方式,如命题中包含概念彼此间的联结,...
  • 基于梯形逻辑的联锁系统形式验证方法
  • 电信设备-一种基于形式验证的同步数据流程序的可信排序方法.zip
  • 提出了一种基于PVS语言的数据库形式化安全策略模型建模和分析方法,该方法较以往模型能够更加贴近实际数据库,应用范围更广,安全属性描述更加完整,描述的模型具有灵活的可扩展性,并且保证了建模与验证的效率。...
  • 1.1 程序验证方法的范围 程序安全性验证的技术如下: 横轴-Cost 程序验证的代价/要求(对程序员的要求、时间、经验等等) 纵轴-Confidence 可信度 (1)Ad-hoc Testing(随机测试) 随机测试是没有书面测试...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 565,208
精华内容 226,083
关键字:

形式证明方法