3. 功能安全开发流程:V模型开发流程、需求管理、安全案例编写、验证与确认

功能安全开发,说白了就是一套“怎么证明你的系统不会乱来”的方法论。我见过太多团队,代码写得飞起,一到审查就抓瞎。为什么?因为流程没走对。

这一章,咱们就聊聊V模型、需求管理、安全案例和验证确认。这些都是审查老师必查的点。你按我说的做,至少能省下一半的整改时间。

3.1 V模型开发流程:不是画个V就完事了

V模型大家都见过。左边是设计,右边是验证,中间是实现。但很多人只画了个V,内容全是空的。这不行。

我个人习惯,把V模型拆成四个阶段:

  • 概念阶段:定义系统边界、危害分析(HARA)、安全目标。
  • 系统阶段:系统级设计、功能安全概念、技术安全概念。
  • 硬件/软件阶段:详细设计、单元实现、集成测试。
  • 验证确认阶段:系统集成测试、安全确认、生产发布。

你想想看,审查老师看V模型,其实是在看你的“追溯性”。左边每个需求,右边有没有对应的测试?中间有没有对应的实现?一条线拉不通,直接扣分。

核心要点:V模型不是文档堆砌,而是“需求-设计-实现-测试”的闭环。每个节点都要有明确的输入和输出。

下面这张图,是我自己项目里常用的V模型框架。你可以直接拿去用。

功能安全V模型开发流程 概念阶段 HARA / 安全目标 系统阶段 功能安全概念 硬件/软件阶段 详细设计 / 实现 安全确认 整车级测试 系统集成测试 软硬件集成 单元测试 代码级验证 编码与实现 💡 每个左侧设计节点,必须对应右侧一个验证节点。这叫“双向追溯”。 审查时,老师会随机抽一条需求,让你现场拉通整条V链。

我的经验:V模型最容易被忽视的是“回溯”。很多团队只做了正向设计,忘了反向验证。我建议你在每个阶段结束时,做一次“V模型健康度检查”,看看左右两边是否对齐。

3.2 需求管理:别让需求“飞”了

需求管理是功能安全的基石。没有清晰的需求,后面全是空中楼阁。我在项目中遇到过最典型的问题:需求写得太模糊。

比如,“系统应能检测到故障”。这种需求,审查老师看了直接摇头。什么叫“检测到”?检测时间是多少?故障类型是什么?输出是什么?

好的需求,必须满足SMART原则:

  • S(Specific):具体,不能含糊。
  • M(Measurable):可测量,有量化指标。
  • A(Achievable):可实现,别写天方夜谭。
  • R(Relevant):相关,跟安全目标挂钩。
  • T(Traceable):可追溯,能关联到测试用例。

我建议你使用需求管理工具(比如DOORS、Jama、Polarion)。别用Excel,Excel在审查时会被质疑版本控制问题。

需求类型 示例(错误) 示例(正确)
安全目标 系统应安全 当车速>30km/h时,制动系统应在200ms内响应
功能需求 检测到故障后报警 当ASIL C故障发生时,仪表盘应在100ms内显示红色警告图标
技术需求 使用安全机制 采用双核锁步(DCLS)机制,故障覆盖率≥99%

注意:需求不能有歧义。我曾经见过一个需求写“系统应尽快响应”,结果开发说1秒,测试说100毫秒,审查时吵了半小时。最后被开了不符合项。

3.3 安全案例编写:你的“辩护词”

安全案例,说白了就是你写给审查老师的“辩护词”。你要证明:我的系统是安全的,所有风险都已被控制。

安全案例的结构,我推荐使用GSN(目标结构表示法)。它用图形化的方式,把安全目标、证据、论证串起来。审查老师一看就懂。

一个完整的安全案例,至少包含:

  1. 安全目标:来自HARA,是最高层级的“安全承诺”。
  2. 安全论证:解释为什么你认为安全目标被满足了。
  3. 安全证据:测试报告、代码审查记录、FMEDA报告等。
  4. 假设与约束:你的论证基于哪些前提条件。

举个例子:

安全目标:防止非预期加速导致碰撞
├── 论证1:加速踏板信号处理是安全的
│   ├── 证据1:加速踏板传感器冗余设计(双路PWM)
│   ├── 证据2:信号合理性检查测试通过(1000个测试用例)
│   └── 证据3:故障注入测试覆盖所有ASIL C故障模式
├── 论证2:ECU软件逻辑是安全的
│   ├── 证据1:代码静态分析(MISRA C:2012,0违规)
│   ├── 证据2:单元测试覆盖率100%(MC/DC)
│   └── 证据3:集成测试通过(HIL测试,200个场景)
└── 假设:驾驶员始终有最终控制权(可通过制动超控)

我的习惯:安全案例不是一次性写完的。我建议你从项目一开始就建立“安全案例骨架”,随着开发进展不断填充证据。这样到最后审查时,你手里已经有完整的材料了。

3.4 验证与确认:别等到最后才测试

验证(Verification)和确认(Validation)是两个概念。很多人混着用,但审查老师分得很清。

  • 验证:我们做对了产品吗?(检查是否符合需求)
  • 确认:我们做对了产品吗?(检查是否满足用户期望)

验证是“过程正确”,确认是“结果正确”。

在V模型里,验证对应左侧的每个阶段,确认对应右侧的最终测试。我建议你按这个节奏来:

阶段 验证活动 确认活动
概念阶段 HARA评审、安全目标评审 —
系统阶段 系统设计评审、FMEA 系统级仿真测试
硬件/软件阶段 代码审查、单元测试 HIL测试、实车测试
集成阶段 集成测试、回归测试 整车级安全确认

这里有个坑,我踩过。有一次,我们团队把所有测试都堆在项目最后两个月做。结果发现一个安全机制有bug,但已经来不及改了。最后只能申请偏差,审查时被狠狠批了一顿。

避坑指南:我曾经因为测试计划写得太笼统,被审查老师要求重写。具体来说,每个测试用例必须写明:测试目的、测试环境、测试步骤、预期结果、通过标准。缺一不可。

验证与确认的另一个关键点是“覆盖率”。不只是代码覆盖率,还有需求覆盖率、故障覆盖率。我建议你建立一个“覆盖率矩阵”,把每个需求、每个故障模式都映射到对应的测试用例上。

举个例子:

需求覆盖率矩阵(片段)
| 需求ID | 需求描述 | 测试用例ID | 测试结果 | 状态 |
|--------|----------|------------|----------|------|
| REQ-001 | 制动响应时间≤200ms | TC-001 ~ TC-010 | 全部通过 | ✅ |
| REQ-002 | 故障检测时间≤100ms | TC-011 ~ TC-020 | 1个失败 | ❌ |
| REQ-003 | 冗余切换无中断 | TC-021 ~ TC-025 | 全部通过 | ✅ |

这个矩阵,审查老师一定会看。你提前准备好,他问什么你都能当场调出来。

总结一下:功能安全开发流程,核心就是“说你所做,做你所说”。V模型是骨架,需求管理是血肉,安全案例是辩护词,验证确认是证据。四者缺一不可。