关于 dse-loop
dse-loop 是用于计算机体系结构和 EDA 任务的自主设计空间探索技能。它循环运行程序、分析可机器读取的目标指标并记录结果,直到达到目标或停止条件。
主要功能
- 01迭代搜索参数
- 02推断缺失的参数范围
- 03跟踪约束与指标
- 04记录运行并保存状态
- 05生成最终报告
适用场景
- 01调整仿真中的缓存和流水线设置
- 02搜索满足面积与时序要求的综合设置
- 03比较 RTL 参数与吞吐量目标
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ wanshuiyin/ auto-claude-code-research-in-sleep --skill dse-loop安装后在 Claude Code 中输入/dse-loop确认已加载。
详细介绍
DSE Loop:自主设计空间探索
🔁 不要用
/loop/CronCreate包装此技能。 它会在内部循环,直到达成目标或超时。与会给出判定结果的审查/审计技能不同,它的停止条件是可由机器检查的客观指标(Type-A),因此在同一模型中自行终止是安全的——不应包装它的原因是调度器重复执行,而非判定边界。参见shared-references/external-cadence.md。
自主探索设计空间:运行 → 分析 → 选择下一组参数 → 重复,直到达成目标或超时。适用于计算机体系结构和 EDA 问题。
上下文:$ARGUMENTS
安全规则 — 请先阅读
绝不要执行以下操作:
- 执行任何
sudo操作 - 执行
rm -rf、rm -r或任何递归删除操作 - 删除本次会话中由你创建之外的任何文件
- 未先读取现有源文件就覆盖它们
- 执行
git push、git reset --hard或任何破坏性 git 操作 - 终止你未启动的进程
如果某个步骤需要执行以上任何操作,请停止并向用户报告。
常量(可通过 $ARGUMENTS 覆盖)
| 常量 | 默认值 | 描述 |
|---|---|---|
TIMEOUT | 2h | 总墙钟时间预算。达到后停止探索。 |
MAX_ITERATIONS | 50 | 评估设计点数量的硬上限。 |
PATIENCE | 10 | 如果连续这么多次迭代都没有改进,则提前停止。 |
OBJECTIVE | minimize | 对目标指标执行 minimize 或 maximize。 |
内联覆盖:/dse-loop "task desc — timeout: 4h, max_iterations: 100, patience: 15"
典型用例
| 问题 | 程序 | 参数 | 目标 |
|---|---|---|---|
| 微体系结构 DSE | gem5 仿真 | 缓存大小、相联度、流水线宽度、ROB 大小、分支预测器 | 最大化 IPC 或最小化面积×延迟 |
| 综合调优 | yosys/DC 脚本 | 优化流程、目标频率、努力程度 | 在满足时序约束的前提下最小化面积 |
| RTL 参数化 | verilator 仿真 | 数据宽度、FIFO 深度、流水级数、缓冲区大小 | 以最小面积满足吞吐量目标 |
| 编译器标志 | gcc/llvm 构建 + 基准测试 | -O 级别、循环展开因子、向量化、调度 | 最小化运行时间或代码大小 |
| 布局布线 | openroad/innovus | 利用率、宽高比、布线层配置 | 最小化线长 / 时序 |
| 形式化验证 | abc/sby | 界限深度、引擎、每项属性的超时时间 | 在时间预算内最大化覆盖率 |
| 存储子系统 | cacti / ramulator | Bank 数量、行缓冲策略、调度 | 优化带宽/能耗 |
工作流
阶段 0:解析任务并完成设置
-
解析 $ARGUMENTS,提取:
- 程序:要运行的内容(命令、脚本或 Makefile 目标)
- 参数空间:要调整的参数及其范围/选项(可能不完整——见步骤 2)
- 目标指标:要优化的指标(以及如何从输出中提取)
- 约束:不得违反的硬性限制(例如,时序必须收敛)
- 超时时间:墙钟时间预算
- 成功标准:结果达到什么程度时可以提前停止?
-
推断缺失的参数范围——如果用户提供了参数名称,但未提供范围/选项,探索前必须先推断:
a. 阅读源代码——在代码库中搜索参数名称:
- 查找 argparse/click 定义、配置文件、Makefile 变量、模块参数、
#define、parameter(SystemVerilog)、localparam等。 - 提取默认值、类型以及暗示有效取值的注释
b. 运用领域知识设置合理范围:
参数类型 推断策略 缓存/内存大小 2 的幂,通常为 1KB–16MB 相联度 2 的幂:1、2、4、8、16 流水线宽度/发射宽度 小整数:1、2、4、8 缓冲区/队列/FIFO 深度 2 的幂:4、8、16、32、64 时钟周期/频率 根据工艺节点;尝试默认值的 ±50% 有界深度(BMC/形式化验证) 几何序列:5、10、20、50、100 超时值 几何序列:10s、30s、60s、120s、300s 布尔/枚举标志 枚举源代码中找到的所有选项 连续值(学习率、阈值) 对数尺度扫描:取 5 个点,覆盖默认值上下 2 个数量级 整数计数(线程、核心) 线性取值:从 1 到硬件最大值 c. 从保守范围开始——每个参数先尝试 3–5 个值。如果最优结果位于边界,再扩展范围。
d. 记录推断出的范围——将推断出的参数空间写入
dse_results/inferred_params.md,供用户审阅:# 推断的参数空间 | 参数 | 来源 | 默认值 | 推断范围 | 推理依据 | |-----------|--------|---------|---------------|-----------| | CACHE_SIZE | config.py:42 | 32768 | [8192, 16384, 32768, 65536, 131072] | 2 的幂,默认值的 ±2 倍 | | ASSOC | config.py:43 | 4 | [1, 2, 4, 8] | 标准相联度 | | BMC_DEPTH | run_bmc.py:15 | 10 | [5, 10, 20, 50] | 几何序列,常见的 BMC 深度 |e. 扩展边界——搜索过程中,如果最优结果位于某个范围的最小值或最大值,则自动沿该方向扩展一步(并记录扩展情况)。
- 查找 argparse/click 定义、配置文件、Makefile 变量、模块参数、
-
阅读项目,了解:
- 如何运行程序
- 结果输出位置(标准输出、日志文件、报告)
- 如何从输出中解析目标指标
- 当前/基准配置(如有)
-
创建工作目录:在项目根目录下创建
dse_results/dse_results/dse_log.csv— 每个设计点占一行dse_results/DSE_REPORT.md— 最终报告dse_results/DSE_STATE.json— 用于恢复的状态dse_results/inferred_params.md— 推断出的参数空间(若未提供范围)dse_results/configs/— 每次运行的配置文件dse_results/outputs/— 每次运行的原始输出
-
编写参数提取脚本(
dse_results/parse_result.py或类似文件),该脚本接收某次运行的输出,并以数字形式返回目标指标。先在基准运行上测试。 -
运行基准(迭代 0):使用默认/当前参数运行程序。记录基准指标。这就是需要超越的结果。
阶段 1:初步探索
目标:快速摸排参数空间,了解哪些参数最重要。
策略:使用拉丁超立方采样或对关键参数进行结构化扫描。
- 选取 5–10 个覆盖参数范围的多样化设计点
- 运行这些设计点(若彼此独立,可并行运行;可通过后台进程运行,也可按顺序运行)
- 将所有结果记录到
dse_log.csv中:iteration,param1,param2,...,metric,constraint_met,timestamp,notes 0,default,default,...,baseline_val,yes,2026-03-13T10:00:00,baseline 1,val1a,val2a,...,result1,yes,2026-03-13T10:05:00,initial sweep ... - 分析:哪些参数对目标的影响最大?
- 将搜索范围缩小到最敏感的参数
阶段 2:定向搜索
目标:通过有依据的选择,逐步逼近最优值。
策略:灵活调整 — 选择适合问题的方法:
- 参数较少(≤3):在阶段 1 得出的最佳区域附近进行细粒度网格搜索
- 参数较多(>3):使用坐标下降法 — 每次优化一个参数,其他参数保持当前最佳值
- 二元/分类参数:枚举有希望的组合
- 连续参数:在最佳邻近点之间进行二分搜索或黄金分割搜索
- 多目标:跟踪 Pareto 前沿,沿前沿进行探索
每次迭代:
-
根据当前结果选择下一个设计点:
- 查看趋势:哪个方向能改善指标?
- 避免重复运行已评估过的配置
- 平衡探索(未测试区域)与利用(当前最佳点附近)
-
修改参数:编辑配置文件、命令行参数或源代码中的常量
-
运行程序:执行程序并捕获输出
-
解析结果:提取目标指标并检查约束
-
记录到
dse_log.csv:追加新行 -
检查停止条件:
- 是否已超时?→ 停止
- 是否已达到最大迭代次数?→ 停止
- 是否已耗尽耐心值(连续 N 次迭代没有改进)?→ 停止
- 是否已达到成功标准(指标是否“足够好”)?→ 停止
- 是否检测到约束违反模式?→ 调整搜索边界
-
更新
DSE_STATE.json:{ "iteration": 15, "status": "in_progress", "best_metric": 1.23, "best_params": {"cache_size": 32768, "assoc": 4, "pipeline_width": 2}, "total_iterations": 15, "start_time": "2026-03-13T10:00:00", "timeout": "2h", "patience_counter": 3 } -
决定下一步 → 返回步骤 1
阶段 3:优化(如有时间)
如果搜索已收敛且仍有剩余时间:
- 局部扰动:从最佳点出发,尝试对每个参数进行 ±1 步的调整
- 敏感度分析:哪些参数可以放宽而不影响指标?
- 约束边界:如果某项约束即将成为限制条件,探索接近可行域边界的点
阶段 4:报告
编写 dse_results/DSE_REPORT.md:
# Design Space Exploration Report
**Task**: [description]
**Date**: [start] → [end]
**Total iterations**: N
**Wall-clock time**: X hours Y minutes
## Objective
- **Metric**: [what was optimized]
- **Direction**: minimize / maximize
- **Baseline**: [value]
- **Best found**: [value] ([improvement]% better than baseline)
## Best Configuration
| Parameter | Baseline | Best |
|-----------|----------|------|
| param1 | default | best_val |
| param2 | default | best_val |
| ... | ... | ... |
## Search Trajectory
| Iteration | param1 | param2 | ... | Metric | Notes |
|-----------|--------|--------|-----|--------|-------|
| 0 (baseline) | ... | ... | ... | ... | baseline |
| 1 | ... | ... | ... | ... | initial sweep |
| ... | ... | ... | ... | ... | ... |
| N (best) | ... | ... | ... | ... | ★ best |
## Parameter Sensitivity
- **param1**: [high/medium/low impact] — [brief explanation]
- **param2**: [high/medium/low impact] — [brief explanation]
## Pareto Frontier (if multi-objective)
[Table or description of non-dominated points]
## Stopping Reason
[timeout / max_iterations / patience / success_criteria_met]
## Recommendations
- [actionable insights from the exploration]
- [which parameters matter most]
- [suggested follow-up explorations]
如果 matplotlib 可用,还要生成汇总图:
- 收敛曲线(指标与迭代次数)
- 参数敏感度柱状图
- Pareto 前沿散点图(如果是多目标)
状态恢复
如果上下文窗口在运行过程中被压缩,循环会根据 DSE_STATE.json + dse_log.csv 恢复:
- 读取
DSE_STATE.json,获取当前迭代次数、最佳参数和耐心计数器 - 读取
dse_log.csv,获取完整历史记录 - 从下一次迭代继续
关键规则
- 自主工作——不要在每次迭代时都征求用户许可
- 每次运行都必须记录——包括运行失败、违反约束和出错的情况。日志是事实依据。
- 绝不重复运行完全相同的配置——每次运行前检查
dse_log.csv - 遵守超时限制——开始新一轮迭代前检查已用时间。如果下一次运行很可能超时,就停止并报告。
- 以编程方式解析指标——编写解析脚本,不要凭目测查看日志
- 保留原始输出——将每次运行的完整输出保存到
dse_results/outputs/iter_N/ - 违反约束不算改进——违反约束的设计点绝不能算作“最佳”,无论指标如何
- 如果运行崩溃,记录错误,跳过该点,然后继续下一个
- 如果相同的崩溃在不同配置下重复发生 3 次,那么问题很可能出在运行框架代码本身——丢弃并根据规范重新干净地实现运行/解析脚本(同伴改为另一个补丁;只删除脚本,绝不删除
dse_log.csv/dse_results/;参见shared-references/external-cadence.md§ 让失败的尝试重新开始,而不只是打补丁)。恢复扫描前,重新验证指标的可比性:使用新解析器重新解析dse_results/outputs/iter_N/中某个已完成迭代的原始输出,并确认解析结果与dse_log.csv中对应的行一致;如果不一致,要么修复解析器,要么重新解析并标记所有受影响的行——绝不能在同一日志中混用两种解析语义。如果干净重写后仍以相同方式崩溃,就停止并报告——此时需要质疑的是规范或环境,而这正是需要人工介入的地方
调用示例
# Minimal — just name the parameters, let the agent figure out ranges
/dse-loop "Run gem5 mcf benchmark. Tune: L1D_SIZE, L2_SIZE, ROB_ENTRIES. Objective: maximize IPC. Timeout: 3h"
# Partial — some ranges given, some not
/dse-loop "Run make synth. Tune: CLOCK_PERIOD [5ns, 4ns, 3ns, 2ns], FLATTEN, ABC_SCRIPT. Objective: minimize area at timing closure. Timeout: 1h"
# Fully specified — explicit ranges for everything
/dse-loop "Simulate processor with FIFO_DEPTH [4,8,16,32], ISSUE_WIDTH [1,2,4], PREFETCH [on,off]. Run: make sim. Objective: max throughput/area. Timeout: 2h"
# Real-world: PDAG-SFA formal verification tuning
/dse-loop "Run python run_bmc.py. Tune: BMC_DEPTH, ENGINE, TIMEOUT_PER_PROP. Objective: maximize properties proved. Timeout: 2h"