RTL 代码实现 Skill
任务
逐子模块实现 RTL 代码:数据通路 → 控制逻辑/FSM → CBB 集成 → 接口逻辑。
输入
microarch_doc: 微架构文档port_list: 端口列表(来自 module_structure)submodule_list: 子模块列表cbb_docs: CBB 文档coding_style: 编码规范
执行步骤(每个子模块)
- 数据通路:从微架构 §5.1 逐阶段编码
- 控制逻辑 + FSM:从微架构 §5.3 两段式状态机
- CBB 集成:从 RAG 检索结果实例化,标注
// CBB Ref - 接口逻辑:valid/ready 握手、背压、异常处理
- 保存到
{module}_work/ds/rtl/{submodule}.v
模板化 always 块骨架
编码时直接复用以下模板,减少 LLM 推理开销,提升代码一致性。
{...}为占位符。
复位模板(异步复位同步释放)
// Ref: Arch-Sec-{X.Y} — {信号功能描述}
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
{signal}_r <= {reset_value};
end else begin
{signal}_r <= {signal}_nxt;
end
end
FSM 两段式模板
// FSM 段1:时序逻辑存状态
// Ref: Arch-Sec-{X.Y} — {状态机功能描述}
always @(posedge clk or negedge rst_n) begin
if (!rst_n) state_cur <= S_IDLE;
else state_cur <= state_nxt;
end
// FSM 段2:组合逻辑算次态
always @(*) begin
state_nxt = S_IDLE; // 默认值(防 latch)
case (state_cur)
S_IDLE: if ({condition}) state_nxt = S_WORK;
S_WORK: state_nxt = {done} ? S_IDLE : S_WORK;
default: state_nxt = S_IDLE; // 非法状态回收
endcase
end
握手模板(Valid-Ready)
// Valid-Ready 握手模板
// Ref: Arch-Sec-{X.Y} — {接口功能描述}
always @(posedge clk or negedge rst_n) begin
if (!rst_n) valid_r <= 1'b0;
else if (valid_r && ready) valid_r <= next_valid; // 握手后更新
else if (!valid_r) valid_r <= next_valid; // 无数据时可更新
end
assign ready = !downstream_backpressure; // ready 仅依赖下游
组合逻辑模板(防 latch)
always @(*) begin
// 默认值(必须)
{output1} = {default1};
{output2} = {default2};
case ({selector})
{VAL_A}: begin
{output1} = {value_a1};
{output2} = {value_a2};
end
{VAL_B}: begin
{output1} = {value_b1};
end
default: ; // case default(必须)
endcase
end
架构冻结铁律
ABSOLUTELY NO ARCHITECTURE MODIFICATION IN RTL
- 严格按微架构文档实现
- 疑问暂停标记
[ARCH-QUESTION] - 仅文档明显笔误时允许偏差,标注
[ARCH-DEVIATION] - 代码标注架构章节号:
// Ref: Arch-Sec-4.2.1
编码铁律(L0 核心 6 条)
- 时序逻辑:
always @(posedge clk or negedge rst_n)+<= - 组合逻辑:
always @(*)必须赋默认值,case 有 default,if 有 else - FSM:用
localparam定义状态,禁止define,两段式 - 握手:
valid不能依赖ready的组合逻辑 - always 块:≤ 100 行,生成信号 < 5 个,语义不相近拆分
- 禁止:casex/casez、task、门控时钟、位置关联实例化、单字母名
CBB 集成规则
- 功能属于 CBB 范畴必须使用标准 CBB,禁止自研
- 实例化注释标注
// CBB Ref: {文档名} - 无文档标记
[CBB-MISSING]
输出
rtl_files: 所有子模块 RTL 文件路径列表
Gate
每个子模块 RTL 编译无语法错误。
Metrics
执行完成后记录到 {work_dir}/ds/report/metrics/rtl_impl.json:
{"stage_id": "rtl_impl", "duration_ms": 0, "iteration_count": 1}
使用示例
示例 1:
- 用户:「根据 data_adpt 微架构实现 input_if_mod 子模块 RTL」
- 行为:读取微架构 §5.1 数据通路逐阶段编码,§5.3 实现两段式 FSM,集成 CBB 并标注
// CBB Ref,实现 valid/ready 握手逻辑,保存到work/data_adpt_work/ds/rtl/input_if_mod.v
示例 2:
- 用户:「帮我补全 buf_mgr 的 FIFO 子模块代码」
- 行为:从微架构 §5.5 读取 FIFO 配置,按编码规范实现多 1 位指针法满/空判断,异步复位同步释放,组合逻辑赋默认值,保存到对应
.v文件
异常处理
| 场景 | 触发条件 | 处理动作 |
|---|---|---|
| 微架构章节缺失 | §5.1/§5.3 无详细设计 | 暂停,标注 [ARCH-QUESTION],等待用户补充 |
| CBB 文档缺失 | RAG 检索无结果 | 标注 [CBB-MISSING],提示用户确认是否自研 |
| 架构疑问 | 微架构描述模糊或矛盾 | 暂停标记 [ARCH-QUESTION],不擅自修改架构 |
| 编码规范冲突 | 微架构要求与编码规范矛盾 | 标注 [ARCH-DEVIATION],以微架构为准 |
检查点
检查前:
- 确认微架构文档已读取且 §5 各子章节完整
- 确认端口列表(来自 module_structure)已就绪
- 确认 CBB 文档已检索
检查后:
- 确认每个子模块 RTL 文件已保存到
{module}_work/ds/rtl/ - 确认代码遵循编码铁律(时序
<=、组合默认值、FSM 两段式等) - 确认所有 CBB 实例化有
// CBB Ref注释 - 确认 metrics 已写入
{work_dir}/ds/report/metrics/rtl_impl.json