AM62L PBIST内存自测试:寄存器配置与工程实践指南 1. 项目概述深入AM62L的PBIST内存自测试机制在嵌入式系统尤其是汽车电子和工业控制这类对可靠性要求极高的领域内存的稳定性直接决定了整个系统的生死。想象一下一辆行驶中的汽车其ADAS系统的某个SRAM单元因为制造缺陷突然“失忆”或者一个工业机器人控制器因为Cache错误而执行了错误指令后果不堪设想。因此在芯片设计和系统集成阶段对内存进行彻底、高效的测试不是“加分项”而是“必选项”。传统的软件内存测试如March算法虽然灵活但存在两个致命短板一是测试速度慢占用大量CPU资源影响系统实时性二是无法覆盖所有物理缺陷特别是与特定内存电路时序相关的故障。这时就需要PBISTProcessor Built-In Self-Test处理器内置自测试这种硬件级方案登场了。PBIST的本质是在芯片内部集成一个专为测试内存而设计的小型“测试引擎”。这个引擎独立于主CPU能够以接近内存物理极限的速度执行一系列复杂的、预先固化在ROM中的测试算法直接对内存阵列进行“体检”。德州仪器TI的AM62L Sitara™处理器作为面向边缘AI和工业应用的高集成度SoC其内部集成了多个计算集群和丰富的内存资源。为了确保这些内存的可靠性TI为其配备了功能强大的K3架构PBIST模块。我们拿到的这份技术参考手册TRM片段正是打开这个“测试引擎”控制面板的钥匙——它详细列出了COMPUTE_CLUSTER0中PBIST模块的所有配置寄存器。这些寄存器名字长得吓人像COMPUTE_CLUSTER_PBIST_0_K3_PBIST_4C28P_4BIT_WRAP_CA0但拆解开来无非是[模块位置]_[模块名]_[实例名]_[寄存器功能]的格式。作为底层开发或验证工程师我们的任务就是理解每个寄存器比特位的含义并像拼图一样将它们组合起来配置出一个完整的、有针对性的内存测试场景。这不仅仅是照着手册填数值更需要理解背后的测试哲学我们想测什么故障模型怎么测算法序列如何知道测的结果错误捕获本文将结合我多年在嵌入式硬件验证和芯片测试领域的经验为你深入解读这些寄存器并提供一套从原理到实操的完整配置指南。2. PBIST核心原理与AM62L实现架构拆解在直接啃寄存器手册之前我们必须先建立对PBIST工作原理和AM62L中具体实现的整体认知。如果把PBIST模块看作一个独立的“测试机器人”那么它的工作流程可以概括为加载测试程序算法- 配置测试环境内存参数- 启动测试 - 收集并报告结果。2.1 PBIST测试的核心思想与常见算法PBIST测试的目标是发现内存的物理缺陷这些缺陷通常表现为几种固定的故障模型固定型故障Stuck-At Fault某个存储单元永远读为0或1。转换故障Transition Fault单元无法从0翻转到1或从1翻转到0。耦合故障Coupling Fault对一个单元的操作读/写意外改变了另一个单元的值。地址译码故障Address Decoder Fault访问地址A时却访问到了地址B或者多个单元被同时访问。为了检测这些故障业界发展出了多种测试算法如March C-、March LR等。这些算法本质上是一系列对内存地址空间进行遍历March的操作序列每个操作可以是写0w0、写1w1、读0r0、读1r1。例如一个简单的March算法序列可能是{↕(w0); ↑(r0, w1); ↑(r1, w0); ↓(r0, w1); ↓(r1, w0); ↕(r0)}。这里的箭头表示地址递增或递减顺序。在PBIST中这些算法被预先编译并固化在芯片内部的ROM中。我们的工作不是重新发明算法而是通过配置寄存器告诉PBIST引擎请执行ROM中的第X号算法测试从地址A到地址B的内存数据背景模式是什么循环多少次等。2.2 AM62L K3 PBIST模块架构浅析从寄存器命名COMPUTE_CLUSTER_PBIST_0_K3_PBIST_4C28P_4BIT_WRAP我们可以解读出大量信息COMPUTE_CLUSTER_PBIST_0指明这是“计算集群0”中的PBIST控制器。AM62L可能有多个这样的集群每个都有独立的PBIST实例。K3_PBIST表明这是TI K3系列处理器架构下的PBIST IP核其寄存器布局和功能是统一的。4C28P_4BIT_WRAP这是关键它描述了此PBIST实例所连接的内存包装器Memory Wrapper的类型。4C28P很可能表示一种特定的内存编译器生成的内存实例如4端口28位深或其他含义4BIT则暗示了内存的数据位宽或测试端口位宽。这个后缀至关重要因为它决定了RAMT等寄存器中某些配置字段的有效值范围。不同位宽或类型的内存包装器其配置参数如延迟、数据宽度会不同。这个PBIST模块通过一个称为“Wrapper”的接口与真正的物理内存SRAM连接。Wrapper负责将PBIST引擎产生的测试向量地址、数据、控制信号适配到具体内存实例的接口上。因此我们的寄存器配置是面向这个Wrapper的而非直接面向裸内存。2.3 寄存器地图概览与功能分组手册中列出了超过20个寄存器我们可以按功能将其分为以下几组这有助于我们系统性地理解而不是孤立地看待每一个算法序列控制寄存器CA0-CA3常量地址CL0-CL3常量循环计数I0-I3常量增量。这组寄存器用于定义那些在测试序列中保持不变的参数是构成复杂March算法的基石。内存参数配置寄存器RAMTRAM配置。这是最重要的寄存器之一用于告诉PBIST被测内存的实际结构如数据位宽、组选择、读写延迟等。配置错误将导致测试无法正确进行或结果无效。测试控制与状态寄存器DLR数据记录器配置STR程序控制OVER覆盖控制。这组寄存器控制测试模式如GO/NO-GO、MISR、启动/停止测试、以及是否使用ROM中的默认算法。错误捕获与诊断寄存器FSRF失败状态标志FSRC失败计数FSRA失败地址FSRDL0/1失败数据。当测试检测到错误时PBIST会暂停并将错误详情记录在这些寄存器中供软件读取分析。这是调试和定位缺陷的关键。高级与杂项配置寄存器SCR地址加扰CSR片选FDLY失败延迟CMS时钟多路选择PACT/PID等。用于更精细的控制如地址映射、多内存片选、控制错误报告时机等。理解了这套架构我们再去看每个寄存器的细节就会明白它们在整个测试流程中扮演的角色而不是面对一堆冰冷的比特位感到茫然。3. 关键寄存器功能详解与配置策略接下来我们深入几个最核心、最需要关注的寄存器解释其每个字段的含义并给出基于常见实践和工程经验的配置建议与避坑指南。3.1 RAMT寄存器定义被测内存的“身份证”RAMT寄存器是PBIST能否正常工作的基石。它描述了被测内存包装器的物理特性。配置不匹配就像用USB-C的充电协议去给Lightning接口的手机充电必然失败。字段详解RGS (RAM Group Select)位[31:24]。选择要测试的RAM组。在具有多个内存组或bank的系统中用于选择目标。需查阅具体内存包装器文档来确定有效值。通常0表示第一个组。RDS (Return Data Select)位[23:16]。返回数据选择。用于配置测试响应比较器的数据来源。对于标准测试通常设置为0从内存读取数据返回。某些诊断模式可能会使用其他值。DWR (Data Width Register)位[15:8]。数据宽度寄存器。这必须与4C28P_4BIT_WRAP中的“4BIT”相匹配。对于4位宽的内存通常需要配置为对应的模式值。这是一个极易出错的点。手册可能不会直接写明“4BIT对应DWR0x03”这需要从内存编译器或系统集成文档中查找映射表。假设映射关系为0x01-32位0x02-16位0x03-8位0x04-4位。那么对于4位内存DWR应配置为0x04。PLS (Pipeline Latency Select)位[5:2]。流水线延迟选择。内存Wrapper可能内部有流水线寄存器。这个值定义了从发出读命令到数据有效所需的周期数。必须与内存的实际时序特性严格一致。通常由后端设计或内存IP提供商给出例如0表示无流水线1表示1个周期延迟。RLS (RAM Latency Select)位[1:0]。RAM延迟选择。指内存阵列本身的访问延迟例如从地址有效到数据输出的时间。同样需要根据内存数据手册配置。配置心得在项目初期一定要从硬件设计团队或IP供应商那里获取准确的RAMT配置参数表。最稳妥的方法是在一个已知良好的系统如TI的SDK示例或仿真环境中先读出这些寄存器的默认值作为参考。切勿凭猜测填写错误的DWR或延迟配置会导致测试向量与内存接口完全失配要么测试无法启动要么产生海量假错误。3.2 DLR寄存器控制测试的“行为模式”DLR寄存器控制着PBIST的测试模式和数据处理方式。它像一个总开关决定了测试是“只报通过/失败”还是“记录所有错误详情”。关键字段详解DLR1_GNG (GO/NO-GO testing mode)位[9]复位值1h。这是最常用的模式。置1时PBIST工作在“Go/No-Go”模式。一旦检测到任何错误立即停止测试并将FSRF失败标志置位。它不会记录具体的错误地址和数据FSRA和FSRDLx可能无效或不全。适用于生产线上快速筛选坏片。DLR1_MISR位[8]。MISR测试模式。MISR是多输入签名寄存器用于ROM测试或对输出数据进行压缩签名比较而不是逐位比较。通常用于测试嵌入式ROM或特定结构的内存。DLR0_TCK (TCK Gated mode)位[3]复位值1h。TCK门控模式。通常保持为1这意味着测试时钟TCK可能受门控控制有助于功耗管理。在功能测试时一般无需改动。DLR0_DCM (Distributed Compare mode)位[0]。分布式比较模式。如果使能可能在内存Wrapper内部进行比较而不是在PBIST核心。这取决于具体实现。通常保持默认值0除非有特殊需求。实操要点对于功能验证和系统调试我们往往需要详细的错误信息来定位问题。这时应该禁用GO/NO-GO模式将DLR1_GNG位写0并确保系统处于能记录完整错误信息的模式虽然手册未明确说明但通常GNG0时错误详情会被捕获。而对于产线终检或开机自检为了追求速度则启用GNG模式。切换模式时注意可能需要配合STR寄存器进行PBIST软复位。3.3 STR寄存器测试执行的“启停按钮”STR寄存器是控制测试流程的核心功能直观但操作有顺序要求。字段详解START位[0]。写1启动PBIST测试序列。这是一个脉冲信号通常的写法是置1后需要轮询状态或等待中断而不是一直保持为1。STOP位[2]。写1停止当前测试。可用于在测试运行中手动中止。RES位[1]。恢复。在测试因错误暂停后写1可恢复测试如果算法支持。STEP位[3]。单步模式。用于仿真调试每写一次1PBIST执行一个测试操作。CHK位[4]。检查MISR模式。与DLR1_MISR配合使用。标准的测试启动流程伪代码逻辑// 1. 配置所有参数寄存器 (CAx, CLx, Ix, RAMT, DLR等) configure_pbist_registers(); // 2. 可选如果需要覆盖ROM默认算法配置OVER寄存器 write_reg(PBIST_OVER, CUSTOM_ALGO_OVERRIDE); // 3. 启动测试 write_reg(PBIST_STR, START_BIT); // 4. 等待测试完成轮询状态或等待中断 while (!(read_reg(PBIST_FSRF) TEST_DONE_BIT)) { // 超时处理 if (timeout) { // 处理超时可能硬件挂死需要复位PBIST模块 handle_timeout(); break; } } // 5. 检查结果 if (read_reg(PBIST_FSRF) FAIL_BIT) { // 测试失败 error_address read_reg(PBIST_FSRA); error_data read_reg(PBIST_FSRDL0); // ... 处理错误信息 } else { // 测试通过 }避坑指南在写START位之前务必确保所有配置寄存器已稳定写入。有些SoC的寄存器写入需要几个时钟周期才能同步到不同时钟域。一个良好的实践是在关键配置如RAMT写入后执行一次该寄存器的回读验证确保写入成功。此外启动测试后一定要加超时判断。如果内存接口配置错误PBIST引擎可能会挂起不会主动设置完成标志。3.4 CA/CL/I寄存器组构筑测试算法的“积木”CA0-CA3,CL0-CL3,I0-I3这12个寄存器是定义复杂测试模式的核心。它们通常成组使用为ROM中的算法提供运行时参数。CAx (Constant Address)常量地址寄存器。用于提供算法中的基地址或特定地址值。例如某些算法需要从一个固定地址开始读写这个地址就由CAx指定。CLx (Constant Loop Count)常量循环计数寄存器。用于控制某个测试模式的循环次数。增加循环次数可以施加更严格的时间压力或进行老化测试。Ix (Constant Increment)常量增量寄存器。用于定义地址或数据的步进值。在March类算法中地址通常是顺序或倒序变化的这个步进值通常为1就由Ix寄存器控制。它们如何工作PBIST ROM中的算法是一系列微指令。这些微指令可以是“从地址(CA0)开始以增量(I0)为步长写模式(XX)到内存共执行(CL0)次”。通过组合不同的CA/CL/I寄存器一个固定的算法微码可以参数化地测试不同的地址范围、使用不同的数据背景和循环强度。配置示例假设我们想用算法#5假设是一个March C-变种测试从0x8000_0000到0x8000_FFFF的一段64KB内存使用全0和全1交替的数据背景循环2次。我们需要先确认算法#5所需的参数模板这需要TI的PBIST算法文档通常不公开但SDK或驱动库会封装好。假设模板要求CA0 起始地址I0 地址增量4字节对齐则为4CL0 循环次数。那么配置可能是CA0 0x8000_0000I0 4CL0 2。数据背景通常由算法内部定义或通过其他寄存器如RINFO配置这里不展开。经验之谈在缺乏详细算法文档的情况下最安全的方法是使用芯片厂商提供的软件库或驱动程序来配置PBIST例如TI的SDK中可能包含PBIST_config()之类的函数。这些库函数已经封装了针对不同内存类型和算法的正确寄存器配置序列。直接操作这些底层寄存器是高级调试和定制化需求时才需要进行的。4. 完整配置流程与实操案例解析理论说得再多不如一次实际的配置跑通来得实在。下面我将以一个假设性的场景勾勒出在AM62L上为计算集群的L1 Cache SRAM配置并执行PBIST的完整流程。4.1 场景设定与准备工作目标在AM62L芯片上电初始化阶段对COMPUTE_CLUSTER0中的一块关键SRAM假设为L1 Data Cache执行一次快速上电自检POST以确保内存基本功能正常。约束测试时间需控制在几毫秒内测试强度为中等需能检测固定型故障和转换故障。准备工作获取基地址从TRM或系统内存地图中找到COMPUTE_CLUSTER0_PBIST_0模块的基地址。根据手册片段中的实例表其物理地址为0x0033 0130h这是CA0寄存器的地址。因此PBIST模块的基地址很可能是0x0033 0000h或0x0033 0100h需要根据偏移量推算。假设我们确定基地址为PBIST_BASE 0x0033_0100。获取内存参数联系硬件团队或查阅IP文档获取目标SRAM Wrapper (4C28P_4BIT_WRAP) 的关键参数数据宽度确定RAMT.DWR、流水线延迟RAMT.PLS、RAM延迟RAMT.RLS。假设我们得到DWR 0x04(4位)PLS 0x1(1级流水)RLS 0x0(无额外延迟)。选择测试算法查阅TI相关应用笔记或驱动库选择一个适用于SRAM且速度较快的March类算法。假设我们选择ROM中的算法索引ALGO_SELECT 0x01。4.2 逐步配置流程与代码示意以下是一个高度简化的C语言风格伪代码流程展示了寄存器配置的顺序和逻辑。在实际开发中应使用TI提供的硬件抽象层HAL或寄存器访问宏。// 定义寄存器偏移量 (基于手册片段) #define PBIST_OFFSET_RAMT 0x060 #define PBIST_OFFSET_DLR 0x064 #define PBIST_OFFSET_STR 0x06C #define PBIST_OFFSET_OVER 0x088 #define PBIST_OFFSET_FSRF 0x090 // ... 其他寄存器偏移量 #define PBIST_BASE (0x00330100UL) // 1. 禁用PBIST覆盖使用ROM默认算法和内存信息 // OVER寄存器复位后ALGO1, RINFO1即使用ROM信息。我们通常先保持默认。 write_reg(PBIST_BASE PBIST_OFFSET_OVER, 0x9); // 保持复位值确保使用ROM配置 // 2. 配置RAMT寄存器 - 最关键的一步 uint32_t ramt_config 0; ramt_config | (0x00 24); // RGS 0选择默认组 ramt_config | (0x00 16); // RDS 0标准返回数据选择 ramt_config | (0x04 8); // DWR 0x04对应4位数据宽度 (根据实际调整!) ramt_config | (0x01 2); // PLS 0x11周期流水线延迟 (根据实际调整!) ramt_config | (0x00 0); // RLS 0x0无RAM延迟 (根据实际调整!) write_reg(PBIST_BASE PBIST_OFFSET_RAMT, ramt_config); // 3. 配置DLR寄存器 - 选择详细错误记录模式 uint32_t dlr_config 0x208; // 复位值 dlr_config ~(1 9); // 清除DLR1_GNG位(bit9)禁用GO/NO-GO模式以便记录详细错误 // DLR1_MISR, DLR0_TCK等位保持复位值 write_reg(PBIST_BASE PBIST_OFFSET_DLR, dlr_config); // 4. 配置算法参数寄存器 (CA/CL/I) // 此处高度依赖具体算法。假设算法0x01使用CA0作为起始地址I0为步进CL0为循环次数。 // 我们要测试从0x0到0x1000的地址范围假设单次遍历步进为4字对齐。 write_reg(PBIST_BASE 0x130, 0x00000000); // CA0 起始地址 0 write_reg(PBIST_BASE 0x150, 0x00000004); // I0 地址增量 4 write_reg(PBIST_BASE 0x140, 0x00000001); // CL0 循环次数 1 // 注意CA1-CA3, CL1-CL3, I1-I3根据算法可能需要配置这里假设为0。 // 5. 可选配置ALGO寄存器选择算法掩码如果OVER.ALGO0则使用此寄存器选择算法 // write_reg(PBIST_BASE 0x1C4, (ALGO_SELECT 0)); // 示例实际掩码格式需查证 // 6. 清除可能存在的旧错误状态 write_reg(PBIST_BASE PBIST_OFFSET_FSRF, 0x0); // 7. 启动测试 write_reg(PBIST_BASE PBIST_OFFSET_STR, 0x01); // 写START位为1 // 8. 等待测试完成 uint32_t timeout 1000000; // 超时计数器 while (timeout--) { uint32_t fsrf read_reg(PBIST_BASE PBIST_OFFSET_FSRF); // 假设测试完成时FSRF的某一位如bit 0 FRSF0会发生变化 // 注意需要根据手册确认具体的完成/状态标志位这里仅为示例逻辑 if ((fsrf 0x01) ! 0) { // 假设FRSF0置1表示有状态更新完成或失败 break; } } if (timeout 0) { // PBIST测试超时硬件可能异常 printf(PBIST test timeout!\\n); return ERROR_TIMEOUT; } // 9. 检查测试结果 uint32_t status read_reg(PBIST_BASE PBIST_OFFSET_FSRF); if (status 0x01) { // 再次检查FRSF0假设其为失败标志位 printf(PBIST FAILED!\\n); uint32_t fail_addr read_reg(PBIST_BASE 0x1A0); // FSRA0 uint32_t fail_data read_reg(PBIST_BASE 0x1A8); // FSRDL0 printf( Failure Address: 0x%08lX\\n, fail_addr); printf( Failure Data: 0x%08lX\\n, fail_data); // 还可以读取FSRC失败计数等 return ERROR_MEMORY_TEST; } else { printf(PBIST PASSED.\\n); return SUCCESS; }4.3 关键操作与验证要点配置顺序通常的顺序是静态配置OVER,RAMT,DLR - 动态参数CAx,CLx,Ix - 清除状态 - 启动测试。确保在启动前所有配置已就绪。时钟与电源PBIST模块和被测内存必须在测试前已上电并时钟稳定。AM62L的时钟和电源管理比较复杂需要确保相关电源域和时钟已使能。这通常由系统初始化代码如Bootloader完成。内存隔离在执行PBIST测试时必须确保没有其他主设备如CPU、DMA访问被测内存否则会导致数据冲突和测试失败。这需要通过系统配置寄存器或内存防火墙暂时禁止CPU对该内存区域的访问。结果验证测试通过后建议将内存内容恢复如果需要。某些破坏性测试算法会覆盖内存原有数据。对于Cache可能需要在测试后执行无效化操作。5. 典型问题排查与调试技巧实录即使按照手册配置在实际操作中依然会遇到各种问题。下面分享几个我遇到过的典型场景和排查思路。5.1 问题一PBIST启动后无响应超时退出现象写入STR.START后轮询状态寄存器永远没有变化最终超时。排查思路检查时钟和电源这是最常见的原因。确认PBIST模块所在电源域已开启PACT寄存器可能与此相关并且模块时钟已使能。可以尝试读写一个简单的只读寄存器如PID看是否能成功以验证总线访问是否正常。检查内存隔离如果CPU或其他主设备正在访问被测内存PBIST可能无法获得总线所有权而挂起。检查系统互联如NavSS中对该内存区域的访问权限设置。检查RAMT配置错误的DWR、PLS、RLS配置会导致PBIST与内存Wrapper通信协议错误引擎可能卡死在等待响应状态。仔细核对4C28P_4BIT_WRAP对应的确切参数。检查复位状态确保在配置前PBIST模块已处于复位释放状态。有些平台需要操作一个全局的复位控制寄存器。5.2 问题二测试报告大量错误但内存实际功能正常现象PBIST快速失败FSRC计数很大FSRA地址看起来随机但用CPU读写该内存区域却完全正常。排查思路数据宽度DWR不匹配这是头号嫌犯。如果内存实际是32位但DWR配置为4位PBIST会以4位为单位去读写32位内存地址和数据的对应关系完全错乱导致大量“假错误”。反复确认DWR值。地址映射或加扰SCR寄存器用于地址加扰。如果使能了不正确的加扰模式PBIST产生的地址序列与实际内存物理地址的映射关系会发生错乱。尝试将SCR寄存器设置为复位值0xFEDCBA9876542F40h或全0禁用加扰。片选CSR错误如果内存有多个片选信号CSR寄存器配置错误可能导致访问了错误的内存块。确认片选配置。时序参数PLS,RLS不匹配延迟设置过小PBIST在数据稳定前就读取会读到错误数据设置过大则影响测试但可能不报错。需要根据时序报告精确配置。5.3 问题三GO/NO-GO模式通过但详细模式发现零星错误现象生产测试通过但在实验室详细诊断模式下偶尔在特定地址发现单个位错误。排查思路间歇性故障可能是由于电源噪声、温度或交叉耦合干扰引起的软错误。尝试在不同电压、温度下复现。如果错误是随机的可能与系统稳定性有关。测试算法覆盖度GO/NO-GO模式可能使用较简单的算法。详细模式可能运行了更复杂、更严格的算法如测试耦合故障的算法从而发现了隐藏更深的缺陷。分析FSRA和FSRDL看错误数据是否有规律如总是某个数据位出错这有助于判断故障类型。内存修复机制干扰一些高端内存带有ECC或冗余修复单元。PBIST测试可能绕过了这些机制直接测试裸内存单元从而发现了已被ECC纠正或冗余行替换的缺陷。需要确认测试模式是否屏蔽了修复逻辑。5.4 调试工具箱与实用技巧寄存器回读验证每次写入关键寄存器后特别是RAMT立即回读确认写入值是否正确。防止因为总线写入未完成或时钟域同步问题导致的配置错误。使用仿真器或JTAG在硅前验证阶段利用仿真模型运行PBIST测试可以单步跟踪寄存器配置和测试流程直观理解每个操作。在板级调试时通过JTAG连接可以手动读写所有PBIST寄存器进行交互式调试。利用芯片的ROM代码TI的Bootloader或安全固件可能已经包含了PBIST测试例程。反汇编或参考这些代码是学习正确配置流程的绝佳途径。分层测试不要一开始就测试整个大内存。先配置PBIST测试一个很小的、确定好的内存区域比如就几个地址。如果小测试能过再逐步扩大范围。这有助于隔离问题。文档交叉验证除了TRM务必查阅芯片的勘误表和应用笔记。有时寄存器的默认值或行为在特定芯片版本上会有变动这些信息只在勘误表中体现。深入理解并熟练配置AM62L的PBIST寄存器是进行高质量硬件验证和构建高可靠性嵌入式系统的关键技能。这个过程需要耐心、细致的文档阅读和扎实的调试功底。希望这篇结合了寄存器手册解读和实战经验的指南能帮助你在下次面对内存测试挑战时更加游刃有余。记住所有复杂的配置最终都是为了确保当产品交付到客户手中时其核心的存储系统坚如磐石。