system: [SYSTEM]

user: 5. 可编程逻辑器件软件工程技术研究 结合国内外相关现状及国内研制过程中出现的典型问题，为确保不同类型、不同研制单位、不同安全关键等级的可编程逻辑器件软件都能在质量上有保证，规范可编程逻辑器件软件工程技术要求非常必要。图3为一种基于工程过程、方法、工具环境及安全性要素四维模型的高安全要求领域可编程逻辑器件软件工程技术体系构成，其中将安全性要素作为可编程逻辑器件软件工程技术的关键要素提出并贯穿整个工程过程。 5.1. 可编程逻辑器件软件工程过程 可编程逻辑器件软件工程过程包括如图4，主要内容包括 [ 6 ]： 图3. 可编程逻辑器件软件工程体系 图4. 可编程逻辑器件软件工程过程 1) 系统需求分析(含可行性及风险分析)：针对器件可获得性、开发便利性、功耗、时钟频率、芯片资源、抗辐照方法、器件等级、封装方式、工作温度、存储温度、辐照总剂量等系统要求开展必要性与可行性分析；开展风险分析，确认风险项并制定对应的预防措施和应急响应，形成可行性及风险分析报告；明确关键等级，必要时为每个功能确定关键等级；明确功能、性能、接口、功耗、降额、工作条件等技术指标；明确外部接口的通讯协议、电气特性、时序特性等与可编程逻辑器件相关的软件/硬件接口；明确安全性和可靠性要求，如结构、算法、容错、冗余、抗状态翻转等；明确关键算法的算法和技术指标、语言和设计方法约束、资源和时序余量要求；明确固化、工作环境、实时性、可测试性要求；明确IP核使用要求；明确安全保密性、重用、进度、验收与交付、运行与维护、配置管理、质量保证等要求；明确测试级别、测试内容、测试充分性等测试要求。 2) 需求分析：定义功能、性能、接口、管脚分配及约束等需求；开展安全性和可靠性分析，确定安全性和可靠性需求，明确抗状态翻转等技术方法；开展算法原型仿真分析；确定开发环境、工具及版本；描述芯片型号、等级约束和封装形式；确定语言和设计方法约束；确定资源、时序等余量需求；确定固化、工作环境需求；确定实时性、可测试性需求；确定IP核使用需求；确定安全保密性、重用、进度、配置管理、质量保证、测试等需求；明确与软件相关的地址分配；定义实现系统需求产生的派生需求，对其单独标识并反馈至系统需求分析过程，评估派生需求对系统需求分析的影响。 3) 结构设计：确定可编程逻辑器件软件结构及单元划分，定义单元及单元间的关系，描述单元的功能、性能、接口，确保全部需求分配至相应单元；描述单元间的数据流和控制流；描述结构及单元的设计决策；通过仿真和分析验证结构设计是否满足要求；确定时钟、复位方案；根据安全性和可靠性需求，开展安全性、可靠性设计；完成算法由抽象层次到实现层次的转换，确定算法的输入、输出接口，描述算法的实现过程；开展验证方案设计；结构设计过程中产生的派生需求应反馈至需求分析过程并评估影响；重新评估可行性和风险。 4) 详细设计：对各单元进行详细说明，包含各单元地址分配、控制方式、接口、存储器空间、时序说明、性能指标、测试要求等内容；述各单元的设计原理和所采用的技术方法及过程；详细说明各单元在实现时采用的设计输入方法；列出厂商、版本等IP核属性；完善安全性、可靠性设计，并分析详细设计是否符合安全性与可靠性设计要求；完善验证方案设计；标识出未被使用的功能并评估其对安全性的影响；约束软件的设计、固化和操作；详细设计过程中产生的派生需求应反馈至结构设计过程或其它过程并评估影响。 5) 实现 编码：依据设计开展编码活动，形成源代码或原理图。 仿真测试环境设计与实现：编制仿真测试计划和仿真测试说明，并依据仿真测试说明设计仿真测试环境，编制仿真测试向量集。 功能仿真：对源代码或原理图开展功能仿真，执行测试用例。应通过统计语句、分支、状态机等覆盖率信息保证仿真测试的充分性。 综合与布局布线：在完成编码与功能仿真后开展综合与布局布线，完善设计说明。 网表验证：开展时序仿真、静态时序分析，必要时，应开展门级仿真和逻辑等效性检查。 分析和记录：在仿真测试报告中记录仿真测试及分析的结果。 修改和回归测试：根据仿真测试的结果对软件进行修改，开展回归测试并根据需要更新文档和相关产品。 编程下载：将程序固化在可编程逻辑器件芯片或配置芯片中。 6) 确认：在真实的目标板、系统或在需方批准的替代环境上开展确认测试。 7) 验收与交付：开展验收测试、评审，编写用户手册、研制总结报告、版本说明等。 8) 运行与维护：实施维护，以消除缺陷或满足需求变更，做好技术状态控制、配置管理、回归测试和评审等工作。 5.2. 可编程逻辑器件软件工程方法 为达到与可编程逻辑器件软件工程过程有效结合，并解决第3节中所述的典型问题，结合国内工程实践，提出了可编程逻辑器件软件开发技术规范、可编程逻辑器件软件测试方法、可编程逻辑软件安全性设计与验证方法和规范。 5.2.1. 可编程逻辑器件软件开发规范 可编程逻辑器件软件开发技术规范包括开发过程技术要求(见5.1节描述)、编码要求、安全性设计规范和文档编制规范。围绕相关要素，基于国际先进标准和工程实践相结合的方法，采取由点到面，层层推进的方式，建立了可编程逻辑器件软件开发技术体系(见图5)。 开发过程技术要求涵盖了8个开发活动的技术要求及相应成果文档编制规范。编码要求包括例化类、结构设计类、敏感列表类、声明定义类、命名类、运算类、循环控制类、分支控制类、时钟类、复位及初始化类、状态机类、综合/约束类、注释类、编码格式类共计77条规范(见表1)。 图5. 可编程逻辑器件软件开发技术体系 Table 1 PLD software coding guidelin 类型 详细要求 例化类 端口例化应采取名称映射的方式，避免位置映射 端口例化时不应进行逻辑运算操作 …… …… 敏感列表类 应保证进程中的敏感列表完整、正确避免敏感信号多余或缺失 运算类 同一模块中的单向信号不应有多重驱动 综合/约束类 在用于综合的代码中避免使用不可综合的代码 …… …… 表1. 可编程逻辑器件软件编码要求 制定了研制任务书、需求规格说明、设计说明、研制总结报告、测试计划、测试说明、测试报告等文档编制规范 [ 6 ]。 5.2.2. 可编程逻辑器件软件测试规范 可编程逻辑器件软件测试规范体系包括测试过程、测试类型、测试方法(工具)三维要素(见图6)。测试过程包括测试需求及策划、测试设计与实现、测试执行和测试总结。测试类型包括文档审查、代码审查、功能测试、时序测试、安全性测试、恢复性测试、性能测试、接口测试、余量测试、强度测试、边界测试等。测试方法包括代码规则检查、代码审查、功能仿真测试、时序仿真测试、门级仿真测试、逻辑等效性检查、静态时序分析 [ 7 ]。测试方法与测试工具对应关系见图7所示。 图6. 可编程逻辑器件软件测试技术体系 图7. 可编程逻辑器件软件测试方法与工具 此外，提出了基于设计检查和门级仿真的状态机安全性及三模冗余有效性测试方法、基于覆盖率统计的可编程逻辑器件仿真测试方法、基于可重用仿真接口库的动态仿真验证方法，有效提高了FPGA软件的测试效率和质量。 5.2.3. 安全性设计与验证方法 可编程逻辑器件软件安全性工作贯穿于整个可编程逻辑器件软件开发全生命周期 [ 8 ]。 1) 系统要求阶段分析系统的结构、功能、性能需求、工作环境、实际的外部接口时序(考虑电路板信号延时等因素)等对可编程逻辑器件软件的设计需求，包括可编程逻辑器件软件实现的功能、接口、功耗要求、性能、降额要求、工作条件要求等。 2) 需求分析阶段分析系统特定的可编程逻辑器件软件安全性需求的开发与分析应依据系统安全性需求、环境需求、标准、项目专用规范、工具或者设施需求和接口需求，查找安全关键功能，确定安全性需求。 3) 设计阶段为了保证可编程逻辑器件产品的安全性，仅在软件上实现安全性设计或仅在硬件上实现安全性设计是不完全的，还应以软件和硬件相结合的方式开展安全性设计。 4) 实现与集成过程需要落实安全性设计要求，如跨时钟域信号同步处理、异步复位同步释放、寄存器初始化、无效状态处理有效性、设置状态机初始状态、无不可达分支或冗余代码、敏感列表完整正确、条件判断表达式中使用逻辑运算符、注释率、无不可综合对象、典型工况时序满足、最大工况时序满足、最小工况时序满足、逻辑等价性、编译芯片型号正确性、无建立/保持时间冲突、总线各个位线避免集中布线、资源使用率、三模后资源使用率、时序余量。 5) 测试与验证过程是提高可编程逻辑器件软件安全性的重要阶段，在此阶段需进行静态测试和动态测试，测试工作的质量会影响可编程逻辑器件投入使用后能否安全工作，因此“安全性测试充分性”和“安全性测试覆盖性”非常重要，测试是否充分、全面，关系到可编程逻辑器件软件安全性是否得到保证。测试与验证安全性要求如下：测试用例执行率、测试用例通过率、故障密度、故障排除、故障概率、安全性需求覆盖率、语句覆盖率、分支覆盖率。 6) 可编程逻辑器件交付与验收后，需要对软件进行更改时，应进行软件更改危险分析，并对更改后的软件进行回归测试：分析系统、分系统、接口、逻辑、规程和软件的设计更改以及程序更改以及程序更改对安全性的影响，以确保更改不会产生新的危险、不会影响已解决的危险、不会使现存的危险变的更加严重和不会对任何有关的(或接口的)设计或程序有不利的影响；对更改进行测试，以确保新的软件中不包含危险；确保将更改适当和正确地纳人了程序之中；评审和修改有关文档，以反映这些更改。 为了保证以上要求落实，提出了一种基于软件故障模式及影响分析(FMEA)、故障树分析(FTA)技术、软件安全性双向分析(BDA)技术、硬件–软件接口分析(HSIA)技术的可编程逻辑器软件故障模式分析方法 [ 8 ] (如图8所示)。 1) 可编程逻辑器件软件故障模式及影响分析FMEA技术 可编程逻辑器件故障模式及影响分析FMEA用于分析产品所有可能的故障模式及其可能产生的影响，并将每种故障模式对可编程逻辑器件影响的严重程度进行分类，从而发现设计中潜在的薄弱环节，提出可能采取的预防性措施，以消除或减少故障发生的可能性，保证可编程逻辑器件产品的安全性。这种技术从最低级的组件发出来揭露系统故障，是由“由下而上”的归纳分析方法，追踪来自最低层的问题。 2) 可编程逻辑器件软件故障树分析FTA技术 可编程逻辑器件软件故障树分析(FTA)用于检查和识别可引起危险的可编程逻辑器件软件故障及其原因，它采用自上而下的、演绎的方式找出可能导致顶端事件的状态或关键路径的最小组合。 图8. 一种可编程逻辑器件软件典型故障模式分析方法 FTA以不希望发生的作为可编程逻辑器件软件故障判据的一个事件(顶事件)作为分析目标，首先分析寻找所有能引起顶事件发生的直接原因，然后寻找引起上述每一个直接原因的所有直接原因。通过这样逐层向下推测所有可能的原因，直到无法再进一步分析的事件(或底事件)为止。从而形成故障树，故障树建成后，再定性分析各个底事件对顶事件发生影响的组合方式和传播途径，识别以顶事件为代表的各种可能的可编程逻辑器件故障模式，以及定量计算这些影响的轻重程度，计算出可编程逻辑器件软件故障概率和各个底事件的重要度次序。最后，根据分析结果，找出设计上的薄弱环节，并采取改进措施以提高产品的安全性。 3) 可编程逻辑器件软件安全性双向分析(BDA)技术 在可编程逻辑器件软件故障树分析(FTA)和可编程逻辑器件软件故障模式影响分析(FMEA)技术研究成果的基础上，借鉴基于软件故障树分析和软件故障模式影响分析相结合的双向分析技术方法(BDA)，将其应用在可编程逻辑器件软件双向分析中。 基于FMEA和FTA的双向分析法的基本思路是：首先采用FMEA对可编程逻辑器件软件设计进行分析，以确定异常输入或异常事件能否产生不安全的系统行为，即通过正向分析确定这些异常输入或异常事件可能导致不期望的结果(故障或失效)；然后采用FTA对这些不期望的结果(故障或失效)进行分析，以确定在系统设计下，这些不期望的结果不可能发生，即使发生了也能得到安全的控制，或者找出造成这些不期望结果的原因集合。 4) 硬件–软件接口分析(HSIA)技术 系统软硬件接口交互通讯的安全性对整个系统的安全性有着重要影响。在进行时应充分估计硬件–软件接口的各种可能故障，并采取相应的措施。 分析确定可编程逻辑器件软件典型的功能、典型应用接口、典型硬件环境，结合可编程逻辑器件设计，对可编程逻辑器件软件典型功能/典型接口/典型硬件环境进行故障模式及影响分析(FMEA)，形成FMEA表。 通过可编程逻辑器件软件故障模式及影响分析、故障树分析、安全性双向分析、硬件–软件接口分析技术开展安全性分析，形成系统设计、跨时钟域设计、复位设计、状态机设计等方面的安全性设计准则，如表2所示，用于指导安全性设计过程。 5.3. 可编程逻辑器件软件工程环境 可编程逻辑器件软件工程环境包括：软件开发环境、软件测试环境和管理环境 [ 9 ]。在整个软件寿命周期中，须使用受控的可编程逻辑器件软件正版开发工具，建立必要的测试环境和条件，并根据需要配置相关的软件管理工具，确保软件的开发、测试和管理有可靠的、适用的工具环境支持，可编程逻辑器件软件工程环境构成见图9。 Table 2 PLD software safety designing guideline 类型 详细要求 系统设计 可编程逻辑器件软件设计中，宜遵循面积和速度的平衡与互换原则 组合逻辑模块的输出信号不应直接或通过层次关系间接连接到同一模块的输入端口 跨时钟域设计 宜采用同步设计，避免使用异步设计 应避免组合逻辑信号跨时钟域传递 复位设计 异步复位建议采用同步释放的方式 同一复位信号应使用唯一的有效电平，保证系统模块同时复位 状态机设计 对状态机的无效状态应进行适当处理 避免出现状态机死锁 …… …… 表2. 可编程逻辑器件软件安全性设计准则 图9. 可编程逻辑器件软件工程环境构成 5.3.1. 可编程逻辑器件软件开发环境 全球提供可编程逻辑器件开发工具的厂家很多，大体分为两类：一类是专业软件公司研制的FPGA开发工具，独立于器件厂商；另一类是器件厂商为了开发本公司产品研制的FPGA开发工具，只能用来设计开发本公司的产品。目前，FPGA市场高度集中，主要厂商包括Xilinx， Intel， Microchip Technology Inc.和Lattice Semiconductor. Xilinx的开发工具包括ISE和Vivado， Intel的FPGA软件开发工具是Quartus II， Microsemi的FPGA软件开发工具是Libero，而Lattice也推出了Lattice Diamond， LatticeMico等若干设计和验证工具套件。 5.3.2. 可编程逻辑器件软件测试环境 可编程逻辑器件软件测试环境主要包括：软件测试过程控制及分析工具、编码规则检查工具、仿真测试工具、仿真接口模型、侦错分析工具、时序分析工具、跨时钟域测试工具、逻辑等效性检查工具、安全测试工具、半实物测试环境、板级验证工具、仿真验证平台等，包括： 1) 软件测评管理平台：主要功能包含软件测试过程控制及管理，文件管理，标准规范管理，人员信息管理，周例会管理，评审管理、新功能扩展等。 2) 半实物测试环境：通过搭建完整的自动化测试设备软件半实物测试环境，配合通用的软件动态测试工具例如用例生成、故障模式分析、故障注入、目标码验证、覆盖率分析、性能分析等工具。自动化测试设备软件的动态测试环境能够较真实地接近系统的实际运行环境，确保自动化测试设备软件测试的全面性、正确性、可靠性。同时在此基础上开展功能测试、性能测试、边界测试、强度测试、余量测试等，也更加有利于充分验证软件的需求。 3) 可编程逻辑器件仿真接口库：针对可编程逻辑器件仿真测试环境的共同需求，建立仿真测试环境和具体的接口模型库，使用该环境开展每个可编程逻辑器件测试环境的搭建工作，使仿真测试实现一定程度的自动化测试，提高测试效率。 5.3.3. 可编程逻辑器件软件管理环境 为保证设计开发的质量，需要建立FPGA软件管理的工程环境，提供可编程逻辑器件软件研制全生命周期的过程管理，支撑可编程逻辑器件软件系统需求分析、软件需求分析、设计、编码、测试和验证的设计开发平台，并完成编码规则检查、研制文档自动生成、测试数据自动生成等重要辅助功能。 可编程逻辑器件软件工程环境的配置在确定其主要目标和基本需求的基础上，把技术和管理、环境配置和工程需求、工具和方法、开发平台和目标平台、投入和产出等相关因素有机结合起来，全面考虑，以需求为牵引，以实用高效为准则，配置和完善软件工程环境。提高工具利用率，确保高技术高投入带来高效率高产出。