第四章HAL HDL 静态分析
概述
HDL 静态分析是 Xcelium 模拟器集成的 HDL 代码静态检查工具,提供丰富的规则集检查 RTL 代码质量、可综合性、时钟域交叉、编码风格等问题。
HAL 在设计流程中的位置
HAL 应用于多种验证流程:
- 独立运行:直接对 RTL 进行静态检查
- 编译集成:在 Xcelium 编译时自动运行
- Superlint 集成:作为 Superlint 的前端
HAL Features
- Strong Rule-set:数百条内置检查规则
- Detailed Message:每条违规有详细描述,方便调试
- Rule Customization:可定制规则的严重级别和参数
- Extensive Language Support:可直接分析 Verilog、SystemC、e 源文件,也可分析 elaborate 之后的 Verilog、VHDL 或混合语言设计
- Report Generation:多种格式报告
- GUI for Message Analysis:图形化消息分析界面
- Schematic View for Structural Checks:结构检查的原理图视图
- GUI for Rule Customization:图形化规则定制界面
常用术语
- Rules File(hal.def):定义规则配置的文件
- Message Identifier:每条规则的唯一标识(如
NOLABL、DESULN) - Message Parameter:规则消息中的参数化信息
内置检查类别
| 类别 | 说明 |
|---|---|
| Advance DFT | 在基本 DFT 检查之外提供进阶可测性分析。关键特点是即使 design_info 文件里没有指定任何 test mode 信号也能做 RTL 可测性检查——它会自动识别测试电路和时钟门控,据此完成时钟与复位的可控性检查,并检查时钟/复位生成结构的可测性。启用 Advance DFT 后,DFT 类别中重叠的检查不再报告 |
| Clock Domain Crossing Checks | 检查跨时钟域信号是否有正确同步。异步时钟域间同步失败会违反触发器的建立/保持要求并导致亚稳态(既非 0 也非 1 的不稳定状态)。HAL 报告未经正确同步的跨域信号,并给出跳转到 HDL 代码中违规信号的链接。该分析为纯静态,不需要仿真 |
| Netlist Checks | 分析门级网表,报告与扫描链相关的问题——这些问题在 RTL 级无法发现,因为扫描链是综合阶段插入的。由于输入是真实网表,报告的是实际问题而非潜在问题。检查项包括:所有状态元件是否可扫描并串联成扫描链、扫描链是否超过指定长度(长度由 hal.def 中的参数指定)、同一扫描链中的触发器是否共用扫描时钟。需要额外提供仿真模型、综合后网表的仿真 snapshot 和综合库 |
| SystemVerilog Checks | 指 HAL 对 SystemVerilog 语言构造的支持范围(如 unsized literals、literals 中的时间单位等),按构造分类列出,而非一组 SystemVerilog 专用规则 |
| e Checks | 对 e 文件做静态分析,检查语法与语义错误、常见编程错误(变量/方法/操作符用法)、编码风格问题(行长、文件扩展名、命名规范)、不利于覆盖率驱动验证方法学的环境特征、可能影响运行性能和内存占用的写法,以及是否违反 UVM e 规范。对 e 文件运行 HAL 时,报告的是 ALL_E 类别中的检查 |
| ALL_BEHAVIORAL | 针对 VHDL 的类别:警告那些不应出现在设计行为描述中的特定 VHDL 构造,同时包含一些指导编写良好行为描述的检查。它只有一个子类别 BEH_CODING_VHDL,含 BEHINI、DESULN、ENTDCL、FENAME、MAXPRT、MLITNU、NOLABL、PDFPKG、SUBPNM、SUBTNM、SYNCSL、UNITNM、USRATN、WNBFLK 等规则。本类别的检查受参数 BEH_ARCHNM 定义的 architecture 名影响 |
在 hal.def 中,顶层类别是 ALL,其下含 ALL_BEHAVIORAL、ALL_RTL、ALL_NETLIST、ALL_TOOL、ALL_SYSTEMC、ALL_E 六个子类别。另有独立的 JRDRS.def 文件,其顶层类别 JRDRS 含子类别 JRDS_VERILOG。
Rules File (hal.def)
规则的启用/禁用在规则文件 hal.def 中完成。批处理模式下直接用文本编辑,在类别定义内部给检查加 on/off 参数:
category <category_name>
{
<check_name> {on | off} <short_message>
}
例如要禁用 RMM 类别中的 CBYNAM 规则:
category RMM "All checks complying to Reuse Methodology Manual" default_on
{
CBYNAM {off} // "Port connections should be made by name rather than position"
....
}
也可以在文件末尾用 params 语句达到同样效果:
params CBYNAM {off}
易错点:要启用某条检查,它所属的父类别必须是
default_on。例如 category RTL_NAMING_VERILOG 是 default_off,即使在其中把 MODLNM 设为 on,该检查也不会被启用。如果一条检查同时属于多个类别,只要其中至少一个父类别是 default_on 就能启用。详细的 BNF 语法和每条规则的说明参见 HAL Reference Manual。
HAL 静态分析界面
HAL 静态分析方法论
HDL analysis (HAL) 的定位
HAL 是 Cadence Xcelium 的 HDL 静态分析技术(HAL = HDL analysis),由一组预定义规则组成,用来检查 Verilog、VHDL、Mixed、SystemC 和 e 文件。它帮你在仿真之前就发现编码错误和不良的 RTL 设计风格。不同于 FPV(证明属性),HAL 做的是结构化分析:
- 代码质量检查(未连接的端口、未驱动的信号、冗余逻辑)
- 可综合性检查(不可综合的构造)
- 时钟/复位完整性检查
- 设计复杂度分析
- 规则自定义(项目特定的编码规范)
什么时候用 HAL
- RTL 代码 review 阶段:在跑形式验证之前用 HAL 快速发现明显问题
- 代码提交 gate:作为 CI 流程的第一道关卡
- IP 交付前检查:交付 IP 前确认代码质量
HAL vs Superlint:HAL 侧重结构化、代码质量检查(不需要 prove,纯静态分析);Superlint 结合形式引擎证明 bug 可达。先用 HAL 清掉明显问题,再用 Superlint 找深层 bug。
来源文档
hal_userguide.pdfhal_reference.pdfexample_jaspergold_apps/RTLD/