第二章环境搭建

分析设计(Analyze)

analyze 命令读取并编译 HDL 源文件和属性文件:

# 分析 Verilog 文件
analyze -verilog rtl_file1.v rtl_file2.v

# 分析 VHDL 文件
analyze -vhdl rtl_file1.vhd rtl_file2.vhd

# 分析 SystemVerilog(含 SVA)
analyze -sv {rtl_file.sv}
analyze -sva {bindings.sva}

# 分析 PSL 属性
analyze -psl {properties.psl}

# 混合语言:Verilog + VHDL + SVA 可在同一项目中使用
analyze 只是分析 HDL 或属性文件的内容——按文档的说法,要到 elaborate 才会综合并读入网表。所以 analyze 必须在 elaborate 之前执行。
文档没有规定源文件的排列顺序;不过官方示例脚本的习惯是把顶层文件放在最后(例如 FPV_verilog_sva_example.tcl 依次列出 arbiter、port_select、bridge、egress、ingress,最后才是 top.v)。
真正由文档规定顺序的是库的搜索优先级:用 -lib 分析的文件被当作源描述文件,因此 -L 的优先级高于 -v-y——即便 -L 写在命令末尾也是如此。

细化设计(Elaborate)

elaborate 才是真正综合并读入网表的一步,同时为已经 analyze 过的文件提取验证任务

# 基本用法
elaborate -top top_module

# 带参数:参数名与参数值之间用空格分隔,该开关可重复多次
elaborate -top top_module -parameter WIDTH 32

# 清除 elaborate 结果
elaborate -clear

指定全局时钟

# 单时钟
clock clk

# 多时钟:分别声明即可
clock clk
clock clk2

# 声明派生(分频)时钟:clock <基准时钟> <派生时钟列表> [factor [phase]]
# factor = 基准时钟频率与派生时钟频率之比,phase = 相对相位
clock clk clk_div 2 1

时钟信号是同步设计的基础。JasperGold 使用时钟来确定采样边沿,所有断言都在时钟边沿评估。

指定全局复位

# 高有效复位
reset rst

# 低有效复位(使用 ~ 或 !)
reset ~rstN

# 复位分析默认运行到寄存器值不再变化、或达到 100 次迭代为止
# 用 -max_iterations 修改这个默认值
reset -expression ~rstN -max_iterations 50

复位信号定义了设计的初始状态。reset 指定的是一组引脚:工具复位设计时把它们置为有效,正式做形式验证时再解除。

证明参数设置

基本引擎设置

# 设置最大 trace 长度(时间边界)
set_max_trace_length 20

# 设置证明时间限制
set_prove_time_limit 60s

# 选择引擎模式
set_engine_mode {K I N}
# K:专门用于找有界证明,只搜索 trace,一般不会给出完整证明
# I:一次处理一个属性,从 COI 中迭代地引入逻辑,尽量减少证明所需的逻辑量
# N:顺序地证明属性,能给出完整证明,不像 B/J/K/L 那样局限于找 trace

高级引擎设置

# 限制每个属性上花费的时间
set_prove_per_property_time_limit 30s

# 设置每个引擎最多使用的线程数(默认 1)
set_engine_threads 5

# 换一组偏"找 bug"的引擎
set_engine_mode {B L}
# B:不并发处理属性,永远不会给出穷尽证明,只能给出反例或有界证明
# L:bug-hunting 引擎,在状态空间中做深度搜索,
#    用于找反例、或命中常规形式引擎难以到达的覆盖点
关于 set_engine_threads:它给每个引擎设定线程数上限,默认值是 1。把它设为大于 1 时,在 B、Ht、L 这几个引擎上、面对那些原本不收敛的属性时收益最明显——也就是处于 bug-hunting 模式的时候。代价是每个引擎都可能创建这么多线程,内存消耗会明显上升。

配置复用:把环境写成 Tcl 脚本

环境配置的复用方式是直接把命令写成 Tcl 脚本文件——官方示例工程本身就是这么组织的(见 example_jaspergold_apps/FPV/*.tcl)。写好之后用 include 命令读入并执行:

# 读取并执行一个 Tcl / JasperGold 命令脚本
include setup.tcl
include 的作用与 Tcl 内建的 source 完全一样,区别是 include 会把执行过的命令回显到 log 文件和 console(回显的命令前面带 %% 前缀),因此更容易调试脚本里的问题。

设计的保存与恢复

已分析(analyze)的结果可以保存下来供后续复用,避免每次重新编译:

# 保存 analyze 结果
analyze -save -dir <dir_name>

# 恢复 analyze 结果
analyze -restore -dir <dir_name>

界面截图

环境配置界面(第 58 页)
环境配置界面(第 60 页)

时钟复位建模原则

时钟选择原则

时钟声明告诉形式引擎设计的同步边界,直接影响状态空间的构建。以下是关键原则:

经验法则:elaborate 后第一件事就是打开 Clock Viewer 检查工具自动检测到的时钟域是否正确。

复位建模

复位建模决定了形式验证的初始状态:

黑盒策略

黑盒(Blackbox)将模块替换为接口完全自由的壳,是控制复杂度的重要手段:

新手常犯错误:为了让 prove 快速通过而过度黑盒化。黑盒掉关键控制逻辑会让验证结果毫无意义——形式引擎会"证明"一个被抽空了逻辑的设计满足属性。每个黑盒都应该有明确理由。

来源文档

  • jaspergold_apps_userguide.pdf Ch.3
  • jaspergold_command_reference.pdf(analyze / elaborate / clock / reset / include / blackbox_assistant 各命令的完整语法)
  • jaspergold_engine_selection.pdf(引擎 B / I / K / L / N 的说明)
  • example_jaspergold_apps/FPV/