FS-A5 — 需求细化的「覆盖且不超出」:SG→FSR→TSR→HSI 每级的数学约束,以及 traceability 为何必须双向
本质与导读
专家养成 · 模块一(功能安全)· A 阶第 5 讲,也是 A 阶地基的收口。上一讲 FS-A4 把安全机制劈成检测 / 反应 / 容错三类,末了留了一个问题:这些 SM 是被谁、按什么规则「派活」的?它们的需求从安全目标一路 细化下来,每一级凭什么「既不漏也不超」?今天把这条细化链的数学约束钉死——为什么每一级细化本质是一次「翻译」、翻译有两类对称的致命错误(漏 / 超)、以及为什么只有双向 traceability 才能同时堵住这两类错。这一讲立住,FS-A1 那条「覆盖且不超出」的下行半链就从一句口号变成可机检的约束。
开篇:硬约束——细化是唯一的下行手段,而每一次细化都是一次会丢信息的翻译
回到 FS-A1 的根命题:「整车够不够安全」无法直接回答,只能逐级分解成能算的小命题。分解的每一步,工程上就叫需求细化(refinement)——把上一级一条抽象需求,换成下一级一组更具体的需求。整条下行链 器件要求,就是四五次连续的细化。
难点在于:细化不是机械展开,而是一次人工翻译。 上一级说「防止非预期扭矩」,下一级要把它翻成「监测扭矩偏差 + 超限进安全态 + 安全态定义」。翻译这个动作,天然会犯两类方向相反、却同样致命的错:
- 漏(under-specification):子需求集合没有完整盖住父需求的安全意图。父说三件事,子只实现两件——SG 有一部分从未被任何下级实现,Safety Case 在这一支悬空。
- 超(over-specification / gold-plating):子需求引入了父需求没有授权的内容。多出来的条款要么是无安全收益的镀金(白增失效面与成本),要么——更危险——是它本该有个父、但父那一级漏写了,即一个被掩盖的上游遗漏。
两类错都不是「扣分」,是逻辑断裂(FS-A1:断一环即 Safety Case 不成立)。所以功能安全对细化下了一条不讲情面的硬约束:每一级的需求集合,必须是上一级的一个「覆盖且不超出」的等价分解——既完整蕴含父需求(无漏),又每条都可回溯到父需求(无超)。 这条约束是双侧的,这正是为什么 traceability 必须双向:向下查覆盖、向上查授权,缺一个方向就只能堵住一类错。下面从第一性原理把这两侧推清楚。
中段一:第一性原理——细化的正确性 = 充分 ∧ 必要,两个方向各堵一类错
把细化形式化,约束就一目了然。设父需求是一个关于 item 行为的命题 (例如「扭矩偏差始终 」),细化是用一组子命题 替换 。这次替换正确,当且仅当:
左半边是覆盖:所有子需求合起来必须蕴含父需求——子全做到了,父就自动成立。这一项漏掉,就有 SG 的某个侧面没被下级兜住。右半边是不超出:去掉任意一条 ,蕴含就不再成立——意味着每一条子需求都对实现父需求有不可省的贡献,没有一条是冗余或镀金。
这个双侧定义直接解释了为什么 traceability 必须双向,而且把两个方向各对应到一类错:
- 前向追溯(父 子) 验的是覆盖:沿着每条父需求往下,问「它有没有至少一条子需求实现它」。某条父需求向下找不到子,就是漏。
- 后向追溯(子 父) 验的是不超出:沿着每条子需求往上,问「它是不是为了实现某条父需求才存在」。某条子需求向上找不到父(孤儿需求),就是超。
单向 traceability 只能堵一类错。只做前向,你能保证 SG 被盖住,却拦不住有人塞进一堆无授权的子需求(超);只做后向,你能保证没有孤儿,却查不出某条 SG 根本没人接(漏)。双向闭合才同时锁死充分与必要——这不是流程繁文,是「覆盖且不超出」这条双侧约束在数学上的直接要求。
中段二:四级细化各换一个维度——SG/FSR/TSR/HSI 不是同义反复
既然每一级都要「等价分解」,一个自然的疑问是:那四级岂不是在反复说同一件事?不是。关键的第一性洞察是:每一级细化都守恒同一个安全谓词,但各自补进一个全新的维度。 安全内容不增不减(否则就漏或超了),增加的是「实现技术」这一正交的信息。四级换的维度分别是:
SG(安全目标)——回答**「什么危害不能发生」**。它是危害级的、与技术无关的顶层意图,头上钉着 ASIL 字母、配着安全态与 FTTI。例:「驱动模式下防止单侧非预期驱动扭矩偏差 ,ASIL D,安全态 = 三相主动短路 ASC,FTTI 」。
FSR(功能安全需求)——补进**「系统该有什么安全行为」,仍不绑任何技术**。它把 SG 拆成几条功能行为:监测什么、何时反应、反应成什么。这一级第一次把「安全态」「FTTI」落成可分配的功能条款,但绝不提是哪个芯片、哪段代码。
TSR(技术安全需求)——补进**「用哪个安全机制、在哪个架构、什么时序」**。这里第一次绑定具体 SM(FS-A4 的检测 / 反应 / 容错某一类)、把 FTTI 拆成 落到采样率与 DC(FS-A3),并把需求分配到具体 ECU / 通道。
HSI(硬件-软件接口)——补进**「这条需求里哪部分归硬件、哪部分归软件,以及两者在边界上的契约」**。它把每条跨软硬的 TSR 切成硬件安全需求 + 软件安全需求,再钉死边界信号的电平 / 时序 / 故障默认态。
四级像四层透镜,每加一层只增「技术绑定」这一维,安全谓词始终守恒。这就是为什么细化既不是同义反复(每级真的多了信息),又不能改动安全内容(多出的信息必须正交于安全意图)。 一旦某级在「换维度」时顺手改了安全谓词本身——比如 TSR 把 FTTI 从 偷偷放宽到 ——那它对父就既不充分也不可回溯,覆盖与不超出同时破。
中段三:worked example——一条 SG 走完两级细化 + 矩阵机检
把上面的抽象走成一个具体例子,并演示「覆盖且不超出」如何变成一张可机检的矩阵。取上面那条 SG,先细化到 FSR:
- FSR-1:系统应持续监测实际输出扭矩与请求扭矩的偏差。(对应 SG 的「监测」侧面)
- FSR-2:当偏差超阈值并持续超过确认时间,系统应在 FTTI 内移除不可控扭矩、进入安全态。(对应「限时反应」侧面)
- FSR-3:安全态应为对车辆动力学无新增危害的状态(高速段三相主动短路 ASC)。(对应「安全态定义」侧面)
覆盖检查:SG 的安全意图可拆成三个不可省的要素——{察觉偏差、限时移除、安全态有定义}。三条 FSR 与三要素一一对应,合取后蕴含 SG,无漏。不超出检查:去掉任一条,SG 即破(无 FSR-1 则察觉不到、无 FSR-2 则不反应、无 FSR-3 则反应到一个新危害态),故每条必要,无冗余;也没有第四条 FSR 引入 SG 未授权的内容。
再把 FSR-2 细化到 TSR(只展开这一条):
- TSR-2a:用三相电流重构 + 转子位置估算实际扭矩,与请求比较;采样 、去抖 、目标 DC ;分配给 MCU 扭矩监控 SM(检测类)。
- TSR-2b:FTTI 拆为 (含去抖),留余量 (接 FS-A3 时间预算)。
- TSR-2c:由栅极驱动器导通三相下桥建立 ASC 作为反应动作(反应类 SM)。
把这层关系写成一张追溯矩阵 :行是父需求(FSR),列是子需求(TSR), 表示 TSR 细化 FSR。两条机检规则于是落地成纯结构判断:
空行 = 某条 FSR 没有任何 TSR 实现它 = 漏:Safety Case 在该支悬空。空列 = 某条 TSR 回溯不到任何 FSR = 超:它要么是无授权镀金(增失效面、白吃 FMEDA 失效率预算),要么是一个信号——其实该有条父需求但上游漏写了,得回头补 FSR 而非删 TSR。这正是 FS-A1 说的「翻车永远在接口」为何能被工具拦下:完整性不靠人更细心,靠矩阵无空行无空列这条可自动判定的不变式。
中段四:ASIL 沿链继承——孤儿需求为何连「该多严」都答不出
双向追溯还守着一个比覆盖更隐蔽的东西:ASIL 的合法性。ASIL 不是凭空贴在某条 TSR 上的,它沿细化链从 SG 继承下来——子需求默认继承父需求的 ASIL,除非走了一次经授权的 ASIL 分解(FS-B4 会讲 那套,且需独立性证明)。这条继承规则把「不超出」从一个集合问题升级成一个带标签的集合问题。
由此看一条孤儿子需求(空列)有多坏:它向上回溯不到父,于是它的 ASIL 没有来源。一条没有 ASIL 来源的安全需求,意味着没人能回答「它该做到多严、要不要 ASIL D 的开发严格度、FMEDA 里算不算它的诊断覆盖」——它在安全论证里是一段悬空标签,既不能安全地删(万一它真在兜某个 SG),也不能安全地留(它没有被授权的严格度依据)。所以后向追溯查的从来不只是「有没有父」,而是「ASIL 标签有没有合法的继承链」;这也是为什么 ASIL 分解必须在追溯矩阵上显式记一笔「此处 D 拆成两条 B」,否则下游两条 B(D) 看起来都「降级无据」,审核必挂。
反过来,前向追溯也不只查「父有没有子」,还查子是否把父的 ASIL 完整带下去:若 SG 是 D,而它的某条 FSR 被误标成 B 又没有合法分解,就等于在这一环偷偷降低了开发与验证严格度——覆盖看似在(有子需求),严格度却漏了。双向追溯于是是带 ASIL 标签的双侧闭合:前向查「覆盖 + 严格度不降」,后向查「无孤儿 + ASIL 有合法继承链」。 把 ASIL 这一维忘掉,矩阵无空行无空列也只是必要非充分。
落到工程结论:细化-机检的执行流程 + 三条准则
把四段拼成一套能直接执行的细化与审核流程。每跨一级(SG→FSR、FSR→TSR、TSR→HSI):
- 先认清这一级要补的维度:FSR 补功能行为、TSR 补 SM + 架构 + 时序、HSI 补软硬划分 + 接口契约;只增技术维,不动安全谓词。
- 写完即建追溯矩阵:父为行、子为列, 标细化关系。
- 机检无空行(覆盖):每条父需求至少一条子需求;空行 = 漏,补子需求。
- 机检无空列(不超出):每条子需求至少回溯到一条父;空列 = 超,删镀金或回补上游漏掉的父。
- 查 ASIL 继承链:每条子需求的 ASIL 必须从父合法继承,降级处必有显式授权的 ASIL 分解记录;否则标签悬空,审核挂。
- 守恒核验:抽查父谓词的每个量化点(阈值 / FTTI / 安全态)是否在子级被原样带下、没被悄悄放宽——放宽即覆盖与不超出同破。
带走三条准则:
- 细化是翻译,翻译有两类对称错。 漏(子没盖住父)与超(子越过父授权)都让 Safety Case 逻辑断裂;前者用前向追溯堵,后者用后向追溯堵。
- traceability 双向不是流程,是「覆盖且不超出」的数学要求。 前向 = 充分(无空行),后向 = 必要(无空列);单向只锁一半,必漏另一类错。
- 每级只增技术维,安全谓词守恒。 SG→FSR→TSR→HSI 各换一个维度(功能 / 机制时序 / 软硬接口),但 ASIL、阈值、FTTI、安全态必须原样传递;谁在「换维度」时改了安全内容,谁就同时破了覆盖与不超出。
承上启下:今天收口 A 阶——细化是…
承上启下:今天收口 A 阶——细化是下行链的唯一手段,其正确性 = 覆盖(充分)∧ 不超出(必要),落成追溯矩阵就是「无空行 ∧ 无空列 ∧ ASIL 继承合法」三条可机检的不变式,而双向 traceability 正是这条双侧约束的数学倒影。A 阶五讲到此立起了功能安全的完整骨架:分解-聚合链(A1)、风险量化(A2)、时间预算(A3)、SM 分类(A4)、需求细化(A5)。下一讲进入 B 阶 FS-B1,开始把上行链的第一类证据算到底——FMEDA 的数学全推导:SPFM / LFM / PMHF 怎么定义、失效率怎么自底向上分配、ASIL D 那几个阈值(、、)究竟从哪来。今天细化出的每条 TSR 的 DC,正是 FMEDA 那张表的输入。预热可读 FSR/TSR 写法深度。
延伸阅读
- FSR/TSR 写法深度 — 本讲细化链 FSR→TSR 一级的工程写法与可追溯模板
- HSI 文档写法深度 — TSR→HSI 那一级:软硬划分与接口契约怎么写死
- 硬件安全需求写法深度 · 软件安全需求写法深度 — HSI 切下来两侧需求的落地
- HARA 与 Part 3 概念 — 细化链的起点 SG 与 ASIL 从哪来
- 功能安全工程师指南(模块 hub)