从验证角度看UPF

fengbh 发布于 1 天前 23 次阅读


从验证角度看UPF

从验证角度看UPF

序言

Unified Power Format (UPF)全称统一功耗格式,是专门用于描述电路电源功耗意图的一种语言标准。使用UPF命令,可以指定芯片的供电网络、电源开关、iso、retain和电源管理的其他方面。

UPF验证流程

有两种常用的低功耗仿真 Flow:

  • 一种是传统的 UPF-prime Flow​,该 Flow 需要设计人员在不同阶段提供 3 个不同的 UPF;
  • 另一种是 Synopsys 推荐的 Golden UPF Flow​,该 Flow 只需要在最开始提供一个能够在前仿和门仿中复用的 Golden UPF。

两种 Flow 流程图如下图所示。

ea360b3493e00f7cc40779a9fab1fa02

上图UPF仿真分三个阶段:

  1. RTL+UPF​。 RTL 为综合前 RTL, 没有插入 Low Power Cell 和 PG Pin。
  2. netlist+UPF​。使用 DC 逻辑综合后的门级网表,已经插入了部分 Low Power Cell,但未插入 PG 和 Power Switch。
  3. netlist+UPF​ 及 PG Netlist​。采用物理实现后的门级网表+UPF。 或用带PG Pin的网表,已经包含了整个供电网络。

在NB2416、NB2413、NB2426系列项目中,使用的是右边的Golden UPF Flow​。前仿真是RTL+UPF​,后仿真使用带PG Pin的网表直接仿真。

具体验证流程如下:

  1. 架构人员确定整个芯片的电源规划,输出电源管理文档和UPF框图,描述整个芯片的功耗设计意图。
  2. 前端设计人员编写各个模块级和系统级的upf。
  3. 验证人员拿到前端的upf后需要在其基础上进行一定修改,修改后得到前仿真使用的upf。修改不改变原有的UPF意图。
  4. 搭建UPF仿真环境,修改TB,指定编译选项。
  5. 编写UPF验证case, 根据验证点写case。
  6. 收集覆盖率。

第一步:修改UPF文件

修改UPF只是为了满足验证的需要,并不改变原有的设计意图。修改的原因有三个:

  • 修改部分语法:DC支持的UPF语法和VCS支持的不一样,修改是为了使VCS能正常解析UPF。

  • 设置一些仿真属性。

    • 使用load_upf​载入其他模块的UPF。

      新思交流时提到,load_upf​ 建议使用绝对路径。实际测试发现不同版本对相对路径的解释不同。

      load_upf -scope U0_zcou_top /xxx/xxx/de_feint.upf
      
    • 设置 initial 块的 SNPS_reinit​。默认情况下 initial 块只执行一次,为确保initial 块在下电后重新上电时能重新执行,需设置此选项。示例如下:

      set_design_attributes -attribute {SNPS_reinit TRUE} -models {model1 model2 model3} -transitive TRUE
      # 设置 -transitive TRUE 后,其他模块相关属性默认为 FALSE。
      
    • 对 ROM 等不受 UPF 掉电影响的模块设置 UPF_dont_touch​,确保其 Always On。

      set_design_attributes -attributes {UPF_dont_touch TRUE} -models {model1 model2 model3}
      
  • 通配符展开:设计编写的UPF在指定电源域中使用了模块通配符,VCS解析通配符会花费大量的时间。将通配符展开可以显著加速。

    展开前

    connect_supply_net SS.power -ports */*/*/*/*/*/*/*_sram*/VDD
    

    展开后

    load_upf /xx/xx/vpe_sram.upf
    

    vpe_sram.upf​的具体内容:

    connect_supply_net SS.power -ports /具体的路径/VDD
    

注意:UPF中的Hierarchy 用 /​ 而非 .

第二步:搭建UPF仿真环境

修改TB

在 TB 中开关电源,给指定端口供电。示例如下:

import UPF::*;
initial beign
  supply_on("VDD", 0.72); 
  supply_on("VSS", 0);
end

添加UPF编译选项

  • 指定 UPF 路径:-upf <upf_file>

  • 指定 Power Top

    • 通过 vcs 编译选项 -power_top <top_module_name>​ 指定;
    • 或在 UPF 中通过 set_design_top <tb/dut>​ 指定 Power Top。
  • 指定相关 vcs 编译选项,-power=<opt1>+<opt2>+…​。

    • -power=attributes_on+cov_pst+cov_iso+cov_psw​,开启相关覆盖率收集
  • UPF相关的log和报告在编译目录下mvsim_native_reports​文件夹内。

第三步:编写UPF case

验证点1:检查电源域划分和UPF意图是否一致

原因
  • 首先需要检查设计写的UPF和设计意图是否一致
  • 其次因验证对UPF进行了修改(特别是通配符展开),需要确保验证使用的UPF和设计意图一致。
实现
  • 方法一:人工检查。在verdi波形中人工check每个电源域。

    缺点:麻烦、费力只适合TRY-RUN阶段。

  • 方法二:脚本检查。

    • 由DC生成gold的sram列表。
    • 从编译过程中生成的编译后upf文件中提取各个电源域的sram列表。

    二者比较,确保所有的sram都加入了PD_SRAM域。

    • 缺点:需要DC配合,设计改动时需要DC及时更新sram列表,增加了维护工作量。
    • 只能生成所有的sram列表,无法满足需求生成指定类型的sram列表。如带有repair功能的sram列表和不带repair功能的列表。
  • 方法三:脚本检查

    • 使用脚本自动生成sram列表。

    其他和方法二相同。

    • 缺点:gold也由验证生成。
    • 优点:可以生成带有指定端口、寄存器、线网的模块列表。减少了交互,提升了效率。

验证点2:iso检查信号钳位

原因

需确保所有需要钳位的端口都正确插入了ISO。信号钳位值也都是正确的。

检查项:

  • 模块掉电期间,掉电域输出X态。
  • ISO大部分钳位到0,部分输出端口钳位到1,还有部分输出端口(scan、bist等)不钳位。
实现

特定模块特定端口的iso状态是已知的,使用简单的if​判断即可实现。实现上遇到的困难主要是:

  • 不同模块钳位检查的端口不一样
  • 模块类型多,模块输出端口多,要写的检查代码太多。

最后也是使用脚本批量生成的。这样如果RTL有更新,也可以使用脚本较快的生成相关的检查代码。

验证点3:控制信号连接性检查

原因

确保寄存器的控制信号正确连接到各个SRAM的控制端。主要是:

  • pwr_en --> sram的SD端口,sram的FISO端口

检查项有:

  • 上电时:

    • SRAM的SD端低电平
    • SRAM的FISO端高电平
  • 下电时:

    • SRAM的SD端高电平
    • SRAM的FISO端低电平
实现

单个端口的检查代码,使用简单的if​判断即可实现。遇到的困难和iso检查信号钳位时也基本相同。

最后也是用脚本批量生成。

验证点4:sram的repair信号掉电保持

原因

确保sram的shift_reg放在了always_on域,repair信号掉电后能保持。

检查流程:

  • 掉电前:给sram的shift寄存器写一个随机值。
  • 掉电后重新上电:检查sram的shift寄存器的值是否是写入的随机值。
实现

实践中发现shift寄存器的不同bit位有不同含义不能简单随机,经测试可随机低8bit(和库单元相关,其他项目不适用)。

同样也是用脚本批量生成相关检查代码。

验证点5:掉电和上电流程

原因

确保芯片重新上电后能正常工作。

检查流程:

  • 部分掉电,随机掉电阵列。
  • 适用未掉电的核跑网络。
  • 全部上电,再跑网络。

同样可以检查各个电源域之间的隔离情况,确保掉电域不会影响上电域的工作。

验证点6:其他电源控制功能

和项目相关,具体问题具体分析。

脚本生成检查代码的几种方法

UPF相关的检查项特点是检查项多,但单个检查项简单。适合适用脚本批量生成。在项目中前后使用过几种方法:

  • 方法1:使用verilog-perl​模块,解析RTL代码,结合一些参数生成UVM检查代码。

    • 缺点:不支持generate​语法,前仿真需要额外处理。后仿真可以直接用。
    • 优点:perl脚本调库实现,性能较好。
  • 方法2:使用slang​工具,解析RTL代码生成语法树json文件。然后使python解析json,结合一些参数生成UVM检查代码。

    • 缺点:

      • 太消耗内存,前仿还行,后仿根本跑不动。
      • 生成的json文件体积大,python解析时间长。
      • 需要额外编写规则,解析语法树json文件。
    • 优点:支持解析generate​,对SV特性支持较好。

  • 方法3:使用VPI​,编写C程序,调用VPI​接口。基于VCS解析RTL代码。对语言特性支持最好。

    • 缺点:

      • 不能单独使用,需要结合VCS以及ucli命令行使用。
      • 使用C编写,难度较高。
    • 优点:

      • 速度极快:在NB2426(10亿门)中也是秒出结果。
      • 和VCS能保持一致性,保证解析内容和实际仿真结果符合。

其他

verdi查看UPF

适用verdi可以直观的查看电源框图(verdi可自动生成),模块power domain,插入的iso单元,信号钳位等相关信息。经项目实际操作以及和新思沟通,推荐适用-dbdir​的方式打开verdi,这样能较好的保证和vcs仿真的一致性。若用verdi吃file list的方式打开,UPF相关往往不能正常显示(power domain图标显示错误、模块和电源域对不上、钳位端口显示错误等)。

新思推荐使用-dbdir​的方式打开verdi。新版本verdi也仅支持这种方式。

编译时添加参数-kdb​,会在编译目录下生成一个simv.daidir​目录。使用命令行verdi -dbdir /XX/XX/simv.daidir​即可打开。

实例:verdi -dbdir vcsworks/case_comp_upf/simv.daidir

查看UPF相关覆盖率

因电源域较多,UPF相关的覆盖率也较多,直接使用网页查看显示不全。可生成文本格式的覆盖率报告查看或使用其他软件查看(如verdi等)。

减少后门路径使用

UPF的检查代码中大量使用了后门路径,当设计规模较大时(10亿门),大量的后门路径会消耗大量的内存(1.5TB)。应尽量减少UPF检查代码中后门路径的数量。如:NB2426系统级仿真中,只检查ZG340/ZG30S的端口。其子模块不再单独检查。

此作者没有提供个人介绍。
最后更新于 2025-05-22