大数跨境

RTL 阶段结构风险专题合集:从缺陷门禁到 PPA 代理指标

RTL 阶段结构风险专题合集:从缺陷门禁到 PPA 代理指标 ai算法芯片与系统
2026-11-02
2
导读:这是一套 RTL 阶段结构风险快速诊断方法:用工艺无关的秒级报告提前暴露 latch、存储退化、长组合链、状态机、高扇出、MUX 和 DFF 膨胀,指导代码修改,减少后端返工。

 

📑 目录

  1. 1. 专题定位:结构风险全景与共同主线
  2. 2. Latch 与组合缺陷:门禁级结构健康
  3. 3. 长组合链:深度根因与流水判断
  4. 4. 存储推断失败:数组退化的诊断与模板
  5. 5. 状态机编码:FSM 对 PPA 的影响
  6. 6. 高扇出:全局信号的 RTL 侧治理
  7. 7. MUX:深度、扇出、面积与布线的四重放大器
  8. 8. DFF 膨胀:状态位预算与退化诊断
  9. 9. 多专题联动:信号到动作的统一映射
  10. 10. 总结:结构风险前移的五条主线

一、专题定位:结构风险全景与共同主线

🎯 RTL 阶段的结构风险,功能仿真看不出来,但后端要付出巨大代价。本合集聚焦 七类高频结构风险,它们共同满足四个条件:

  • • ⚡ 可快速观测:秒级结构报告即可暴露。
  • • 🎯 可定位根因:直接指向具体 RTL 写法。
  • • 🔧 可 RTL 侧修复:不需要等后端约束调优。
  • • 📉 跨工艺方向性可信:结构级“A 比 B 健康”通常不随工艺反转。

💡 共同主线:先过 缺陷门禁(latch/多驱/悬空/组合环),再看 PPA 代理指标(深度、存储、状态机、扇出、MUX、DFF),按“快环→校准环→映射环”分层使用,不同层级回答不同问题。


二、Latch 与组合缺陷:门禁级结构健康

🩺 这是 第一道防线,也是唯一适合做成 硬门禁 的一类。latch 不为 0、多驱不解决、组合环不消除,不要进入下一阶段。

2.1 🚨 隐含 latch:不完整分支


   
   
   
   
    
   
   
   
   // ❌ 坏:else 缺失,推断 latch
always
 @(*) begin
    if
 (en)
        q = d;
end
  • • 组合 always 块中 if 没有 else,未覆盖分支会推断出 $_DLATCH_。
  • • 综合后 stat 出现 latch 相关 cell,目标数量应为 0。
  • • 修复方式是补全 else 或给 q 赋默认值。

   
   
   
   
    
   
   
   
   // ✅ 好:补全 else,纯组合
always
 @(*) begin
    q = 1'b0;
    if
 (en)
        q = d;
end
  • • 默认赋值放块首,所有分支都有明确驱动。
  • • 综合后无 latch,check -assert 通过。

2.2 🔁 多驱动:同一 wire 多处赋值


   
   
   
   
    
   
   
   
   // ❌ 坏:同一 wire 两处 assign,多驱
assign
 data_out = a;
assign
 data_out = b;
  • • 多个 assign 驱动同一 wire,综合后多驱冲突。
  • • check -assert 直接失败,Verilator lint 报 MULTIDRIVEN。
  • • 修复方式是合并为单一驱动源,或用 MUX 显式选择。

   
   
   
   
    
   
   
   
   // ✅ 好:单一驱动源
assign
 data_out = sel ? a : b;
  • • 同一 wire 只有一个驱动表达式。
  • • 选择逻辑显式写成 MUX,避免隐式冲突。

2.3 ♻️ 组合反馈环路


   
   
   
   
    
   
   
   
   // ❌ 坏:组合环
assign
 a = b & c;
assign
 b = a | d;
  • • a 依赖 b,b 又依赖 a,形成组合环。
  • • check -assert 抓 combinational loop,仿真可能震荡。
  • • 修复方式是在环中插寄存器,或重构依赖方向。

   
   
   
   
    
   
   
   
   // ✅ 好:插寄存器打断环
always
 @(posedge clk) begin
    a_reg <= b & c;
end

assign
 b = a_reg | d;
  • • 用寄存器隔离反馈路径,环被打断。
  • • 组合逻辑变成前馈,时序可分析。

🎯 一句话:缺陷门禁不需要趋势,只需要“零容忍”。


三、长组合链:深度根因与流水判断

⏱️ 长组合链是 时序风险的第一代理指标。ltp -noff 报的是 拓扑深度,不是绝对 ns,但它直接指向结构根因。

3.1 📏 深度阈值与判断

经验阈值只作相对参考:

  • • 🟢 ≤ 8 级:健康。
  • • 🟡 8~15 级:盯一下,看关键路径落在哪个操作。
  • • 🔴 15 级以上:大概率要流水或重构。

⚠️ 不同模块阈值不同。控制逻辑 12 级可能已经很深,数据通路加法树 10 级可能正常。真正有价值的是 纵向对比。

3.2 ➕ 宽加法链:深度随位宽增长


   
   
   
   
    
   
   
   
   // ❌ 坏:32 位加法 + 32 位加法 + 32 位加法串联
wire
 [31:0] s1 = a + b;
wire
 [31:0] s2 = s1 + c;
wire
 [31:0] s3 = s2 + d;
assign
 out = s3;
  • • 三级 32 位加法串联,深度约 3 倍单级进位传播。
  • • ltp -noff 深度明显高于单加法器。
  • • 修复方式是改加法树或插流水。

   
   
   
   
    
   
   
   
   // ✅ 好:两级加法树,深度减半
wire
 [31:0] s1 = a + b;
wire
 [31:0] s2 = c + d;
assign
 out = s1 + s2;
  • • 并行两两相加,再加一级,深度约为原串联的一半。
  • • 面积略增,但 ltp 深度明显下降。

3.3 ⚖️ 宽比较器:长链比较


   
   
   
   
    
   
   
   
   // ❌ 坏:32 位大于比较在关键路径
assign
 hit = (a > b) && (c > d) && (e > f);
  • • 三个 32 位比较器串联,深度叠加。
  • • 修复方式是预计算或分段比较。

   
   
   
   
    
   
   
   
   // ✅ 好:比较结果打拍,切断组合链
always
 @(posedge clk) begin
    gt_ab <= (a > b);
    gt_cd <= (c > d);
    gt_ef <= (e > f);
end

assign
 hit = gt_ab && gt_cd && gt_ef;
  • • 比较结果各自打一拍,组合链只剩一级 AND。
  • • 代价是 latency 增加一拍。

3.4 🎛️ 优先级译码:串行链


   
   
   
   
    
   
   
   
   // ❌ 坏:串行优先级链,深度随输入数增长
always
 @(*) begin
    out = 4'b0000;
    if
 (req[0]) out = 4'b0001;
    else
 if (req[1]) out = 4'b0010;
    else
 if (req[2]) out = 4'b0100;
    else
 if (req[3]) out = 4'b1000;
end
  • • 串行 if-else 形成优先级链,深度随输入数线性增长。
  • • 修复方式是改并行 one-hot 或预译码。

   
   
   
   
    
   
   
   
   // ✅ 好:并行 one-hot 选择
wire
 [3:0] grant = req & ~(req - 1);  // 最低位优先
assign
 out = grant;
  • • 用位运算并行求最低位优先,深度固定。
  • • 输入数增大时深度不线性增长。

🎯 判断原则:先看 深度是否超过阈值,再看 根因是哪类操作,最后决定 拆结构还是插流水。


四、存储推断失败:数组退化的诊断与模板

💾 这是 最隐蔽、最严重 的面积风险。一个 1024×32 的数组,推成 RAM 是一块存储;退化成 flop 阵列就是 三万多个触发器。

4.1 ❌ 坏:组合块异步写数组


   
   
   
   
    
   
   
   
   // ❌ 坏:组合 always 里异步写,无法推断 memory
reg
 [31:0] mem [0:1023];
always
 @(*) begin
    if
 (we)
        mem[addr] = din;
end

assign
 dout = mem[addr];
  • • 组合 always 块异步写数组,工具无法推断为 memory。
  • • memory bits 为 0,stat -width 出现 1024 位大信号。
  • • 修复方式是改同步读写模板。

4.2 ✅ 好:标准同步 RAM 模板


   
   
   
   
    
   
   
   
   // ✅ 好:读写口都在同步时钟块,标准 RAM 推断
reg
 [31:0] mem [0:1023];
always
 @(posedge clk) begin
    if
 (we)
        mem[addr_w] <= din;
    dout <= mem[addr_r];
end
  • • 写口和读口都放 always @(posedge clk),符合 RAM 推断模板。
  • • Number of memories 大于 0,memory bits 匹配预期。
  • • 索引用简单寄存器地址,避免动态混合索引。

4.3 ❌ 坏:复位干扰存储阵列


   
   
   
   
    
   
   
   
   // ❌ 坏:整个数组带复位,阻止 memory 推断
always
 @(posedge clk or negedge rst_n) begin
    if
 (!rst_n) begin
        for
 (i = 0; i < 1024; i = i + 1)
            mem[i] <= 0;
    end
 else if (we) begin
        mem[addr] <= din;
    end

end
  • • 数组整体复位,工具无法推断为 RAM,只能退化成 flop。
  • • 修复方式是复位只作用于输出寄存器,不作用于存储阵列。

   
   
   
   
    
   
   
   
   // ✅ 好:复位只作用于输出,不作用于阵列
always
 @(posedge clk or negedge rst_n) begin
    if
 (!rst_n)
        dout <= 0;
    else

        dout <= mem[addr_r];
end

always
 @(posedge clk) begin
    if
 (we)
        mem[addr_w] <= din;
end
  • • 存储阵列无复位,输出寄存器带复位。
  • • memory bits 匹配预期,DFF 数量不爆炸。

🎯 一句话:大数组先看 memory bits,再看 DFF 分布。memory bits 为 0 而 DFF 爆炸,优先改模板,不是加流水。


五、状态机编码:FSM 对 PPA 的影响

🏷️ 状态机是 DFF 的天然来源,但 编码方式直接影响 DFF 数量、译码深度和面积。没有绝对好坏,要结合拓扑深度和结构统计看趋势。

5.1 📊 编码方式对比

以 16 状态为例:

  • • Binary 编码:DFF 数量 4 位,译码逻辑较深。
  • • One-hot 编码:DFF 数量 16 位,译码逻辑浅。
  • • Gray 编码:DFF 数量 4 位,适合低功耗顺序跳转。

5.2 ❌ 坏:大状态机 one-hot 过度


   
   
   
   
    
   
   
   
   // ❌ 坏:64 状态 one-hot,64 个 DFF
localparam
 [63:0] S0 = 64'h0000_0000_0000_0001;
localparam
 [63:0] S1 = 64'h0000_0000_0000_0002;
// ... 64 个状态

reg
 [63:0] state, next_state;
  • • 64 状态 one-hot 占 64 个 DFF,binary 只需 6 个。
  • • stat 显示 DFF 数量远超状态数预算。
  • • 修复方式是让工具自动选择或手动紧凑编码。

   
   
   
   
    
   
   
   
   // ✅ 好:紧凑编码,工具自动选择
localparam
 [5:0] S0 = 6'd0;
localparam
 [5:0] S1 = 6'd1;
// ... 64 个状态

reg
 [5:0] state, next_state;
  • • 6 位编码覆盖 64 状态,DFF 数量降到 6。
  • • 译码逻辑变深,但 ltp 可接受时优先省 DFF。

5.3 🏷️ 让工具自动选择编码


   
   
   
   
    
   
   
   
   fsm -encoding auto
  • • 工具根据状态数和转移复杂度自动选择编码。
  • • 避免手动 one-hot 过度或 binary 译码过深。
  • • 配合 fsm_info 看状态数和编码方式是否符合预期。

5.4 💀 清理死状态


   
   
   
   
    
   
   
   
   // ❌ 坏:状态转移不完整,死状态未处理
always
 @(*) begin
    case
 (state)
        S0: next_state = S1;
        S1: next_state = S0;
        // 其他状态未覆盖

    endcase

end
  • • 未覆盖状态保留在综合结果中,浪费 DFF 和译码逻辑。
  • • 修复方式是补全 default,或明确不可达状态处理。

   
   
   
   
    
   
   
   
   // ✅ 好:补全 default,死状态归位
always
 @(*) begin
    case
 (state)
        S0: next_state = S1;
        S1: next_state = S0;
        default
: next_state = S0;
    endcase

end
  • • default 覆盖所有未显式处理的状态。
  • • 工具可优化不可达状态,减少 DFF 和译码。

🎯 判断原则:状态数 × 编码方式 = DFF 预算。先看预算是否匹配,再看译码深度是否可接受。


六、高扇出:全局信号的 RTL 侧治理

🌐 高扇出 的本质不是“fanout 数字大”,而是 单点驱动大量负载,导致负载电容、transition、buffer 树、拥塞和功耗失控。

6.1 🔁 全局复位:单线驱动全设计


   
   
   
   
    
   
   
   
   // ❌ 坏:所有寄存器共用一根 rst_n
always
 @(posedge clk or negedge rst_n) begin
    if
 (!rst_n) begin
        reg_a <= 0;
        reg_b <= 0;
        // ... 数千个寄存器

    end

end
  • • rst_n 驱动全设计寄存器,扇出等于寄存器总数。
  • • 后端需要插入巨大的复位缓冲树。
  • • 修复方式是局部同步复位或显式复制。

   
   
   
   
    
   
   
   
   // ✅ 好:顶层复制复位,每份驱动一个区域
genvar
 i;
generate

    for
 (i = 0; i < 8; i = i + 1) begin : g_rst
        assign
 rst_local[i] = rst_n;
    end

endgenerate
  • • 复位信号复制多份,每份驱动一个模块或区域。
  • • 单点扇出下降,后端 buffer 树压力减小。
  • • 复制本身不改变功能,只改变驱动拓扑。

6.2 🚪 全局使能:单线驱动数千寄存器


   
   
   
   
    
   
   
   
   // ❌ 坏:全局 en 驱动所有寄存器使能端
always
 @(posedge clk) begin
    if
 (en) begin
        reg_a <= d_a;
        reg_b <= d_b;
        // ... 数千个寄存器

    end

end
  • • en 扇出等于寄存器数量,综合后插入使能缓冲树。
  • • 修复方式是时钟门控或区域复制。

   
   
   
   
    
   
   
   
   // ✅ 好:按区域复制使能
wire
 en_a = en;
wire
 en_b = en;
always
 @(posedge clk) begin
    if
 (en_a) reg_a <= d_a;
    if
 (en_b) reg_b <= d_b;
end
  • • 使能信号按区域复制,每份驱动一组寄存器。
  • • 单点扇出下降,后端使能缓冲树压力减小。

6.3 🧱 模块边界寄存器化


   
   
   
   
    
   
   
   
   // ❌ 坏:模块输入直接用于组合逻辑,长扇出链
assign
 out = in_sig & mask;
  • • in_sig 从顶层长线驱动,扇出累积。
  • • 修复方式是模块边界先打一拍。

   
   
   
   
    
   
   
   
   // ✅ 好:模块输入先打一拍
always
 @(posedge clk) begin
    in_sig_reg <= in_sig;
end

assign
 out = in_sig_reg & mask;
  • • 模块边界寄存器化,打断长扇出链。
  • • 代价是 latency 增加一拍,但扇出局部化。

6.4 🔍 检测方式与边界

  • • 📊 综合后看 buffer/inverter 占比:占比异常升高,排查高扇出。
  • • 📄 导出网表统计负载:脚本统计每个 net 的负载连接数。
  • • 🏷️ 命名审查:对已知全局信号重点排查。

⚠️ stat 和 ltp不直接报 fanout。select -count 可做粗略连接数统计,但 不要当成精确 fanout 工具。


七、MUX:深度、扇出、面积与布线的四重放大器

🌳 MUX 之所以对后端影响巨大,是因为它同时击中 四个要害:组合深度、扇出、面积、布线拥塞。

7.1 📏 四重放大机制

  • • 📏 深度放大器:N 选 1 约 log₂(N) 级,位宽把深度复制。
  • • 🌐 扇出黑洞:sel 驱动所有位宽,512 位时扇出可达 512。
  • • 📐 面积吞噬者:32 位 8 选 1 约 224 个 MUX2X1。
  • • 🧱 布线拥塞源:输入线汇聚到输出点,局部布线资源耗尽。

7.2 ❌ 坏:先算结果再选,MUX 位宽大


   
   
   
   
    
   
   
   
   // ❌ 坏:两个 32 位运算都算完,再用 32 位 MUX 选
assign
 out = sel ? (a + b) : (a - b);
  • • 两个 32 位运算都实例化,MUX 位宽 32。
  • • 面积和扇出都大,关键路径经过宽 MUX。
  • • 修复方式是先选操作数再运算。

   
   
   
   
    
   
   
   
   // ✅ 好:先选操作数,MUX 位宽 1
wire
 [31:0] op = sel ? b : (~b + 1);
assign
 out = a + op;
  • • MUX 只选操作数,位宽从 32 降到 1。
  • • 面积和扇出大幅下降,组合深度不变。
  • • 加法器仍然一个,不需要两份。

7.3 🧱 坏:大位宽 MUX 堆在组合路径


   
   
   
   
    
   
   
   
   // ❌ 坏:512 位 8 选 1 MUX 堆在组合路径
assign
 out = sel[0] ? vec0 :
             sel[1] ? vec1 :
             sel[2] ? vec2 : ...;
  • • 512 位宽 MUX 树,深度和扇出都被位宽复制。
  • • ltp 深度集中在这条 MUX 链上。
  • • 修复方式是流水线拆开或改结构。

   
   
   
   
    
   
   
   
   // ✅ 好:MUX 前后插寄存器,拆成两段
always
 @(posedge clk) begin
    vec0_reg <= vec0;
    vec1_reg <= vec1;
    sel_reg  <= sel;
end

assign
 out = sel_reg[0] ? vec0_reg :
             sel_reg[1] ? vec1_reg : ...;
  • • MUX 前后各插一级寄存器,组合深度拆成两段。
  • • 吞吐量不变,latency 增加一拍。
  • • 只在关键路径确实需要时使用。

7.4 🎯 互斥输入:用 OR 树代替大 MUX


   
   
   
   
    
   
   
   
   // ❌ 坏:互斥输入仍用大 MUX
assign
 out = sel[0] ? vec0 :
             sel[1] ? vec1 :
             sel[2] ? vec2 : ...;
  • • 输入互斥时,大 MUX 仍然按选择树实现。
  • • 深度和面积都不必要地大。
  • • 修复方式是用优先级编码 + OR 树。

   
   
   
   
    
   
   
   
   // ✅ 好:互斥输入用 OR 树
wire
 [7:0] grant;
priority_encoder u_pe (.req(req), .grant(grant));
assign
 out = |(grant & vec);
  • • 互斥条件下用 OR 树,深度和面积都下降。
  • • 优先级编码器只处理 1 位选择,扇出小。
  • • 适合中断、仲裁等互斥场景。

7.5 🔍 三步定位

  • • 📊 stat:$_MUX_ 占比 超过 20% 要警惕。
  • • 📏 ltp -noff -threshold 10:看 MUX 是否在关键路径中段。
  • • 🖼️ show -format svg:看是否形成 MUX 级联树。

🎯 一句话:MUX 同时放大深度、扇出、面积和拥塞。大位宽 MUX 优先“选择计算”、流水线拆开、互斥输入用 OR 树。


八、DFF 膨胀:状态位预算与退化诊断

🔢 大量 DFF 的根源是 RTL 中隐式或显式创建了过多需要“记忆”的状态位。但 DFF 多不一定是错 —— 要区分 预期并行度/流水级 和 意外退化。

8.1 🗂️ 手工寄存器堆:应改数组模板


   
   
   
   
    
   
   
   
   // ❌ 坏:64 个 32 位寄存器手工展开,2048 个 DFF
reg
 [31:0] reg0, reg1, reg2, ..., reg63;
always
 @(posedge clk) begin
    case
 (addr)
        6'd0
: reg0 <= din;
        6'd1
: reg1 <= din;
        // ... 64 个分支

    endcase

end
  • • 64×32 手工展开,2048 个 DFF,无法推断为 register file。
  • • stat -width 显示大量 32 位寄存器分散。
  • • 修复方式是改用数组 + 标准读写模板。

   
   
   
   
    
   
   
   
   // ✅ 好:数组 + 标准读写模板
reg
 [31:0] regfile [0:63];
always
 @(posedge clk) begin
    if
 (we)
        regfile[addr_w] <= din;
    dout <= regfile[addr_r];
end
  • • 数组 + 同步读写模板,工具可推断为 register file 或 memory。
  • • DFF 数量可能大幅下降,面积优化。
  • • 索引用简单地址,避免动态混合。

8.2 📏 过度流水线:非必要打拍


   
   
   
   
    
   
   
   
   // ❌ 坏:32 位加法 5 级流水,160 个 DFF
always
 @(posedge clk) begin
    pipe0 <= a + b;
    pipe1 <= pipe0;
    pipe2 <= pipe1;
    pipe3 <= pipe2;
    pipe4 <= pipe3;
end
  • • 一个加法器用了 5×32 = 160 个 DFF。
  • • 如果时序只需 2 级,多出的 3 级是浪费。
  • • 修复方式是精简到必要级数。

   
   
   
   
    
   
   
   
   // ✅ 好:只保留必要流水级
always
 @(posedge clk) begin
    pipe0 <= a + b;
    pipe1 <= pipe0;
end
  • • 只保留时序真正需要的级数。
  • • DFF 从 160 降到 64,面积和功耗下降。
  • • 用 ltp 确认剩余深度仍满足时序预算。

8.3 🌐 宽同步器阵列:每位 2~3 级 DFF


   
   
   
   
    
   
   
   
   // ❌ 坏:256 位跨时钟域,每位 2 级同步,512 个 DFF
reg
 [255:0] sync1, sync2;
always
 @(posedge clk2) begin
    sync1 <= async_bus;
    sync2 <= sync1;
end
  • • 256 位总线每位 2 级同步,512 个 DFF。
  • • 宽总线同步是 DFF 膨胀的常见来源。
  • • 修复方式是减少同步位宽或用握手/异步 FIFO。

   
   
   
   
    
   
   
   
   // ✅ 好:用握手或异步 FIFO 代替宽总线同步
// 只同步 valid/ready 握手信号,数据走异步 FIFO

async_fifo u_fifo (
    .wdata
 (async_bus),
    .wclk
  (clk1),
    .rclk
  (clk2),
    .rdata
 (sync_bus)
);
  • • 只同步握手信号,数据走异步 FIFO。
  • • 同步 DFF 从 512 降到个位数。
  • • 适合宽总线跨时钟域场景。

8.4 🔍 诊断主线

  • • 📊 stat:看 DFF 总量和 memory 数量。
  • • 📐 stat -width:找最大位宽信号,定位异常集中点。
  • • 💾 memory -show:看 memory bits 是否匹配预期。
  • • 📏 ltp -noff:看流水级数是否真的必要。
  • • 🎯 预算对照:先问“预期多少”,再看“实际多少”。

💡 判断原则:先问预算,再看实际。512 位 10 级流水,5120 个 DFF 可能合理;1024×32 数组退化就是事故。


九、多专题联动:信号到动作的统一映射

🔧 七类结构风险常常 同时出现、互相放大。根因往往在同一个 RTL 写法上。

联动诊断顺序建议:

  • • 1️⃣ 先过缺陷门禁:latch、多驱、悬空、组合环。
  • • 2️⃣ 再看 memory 推断:memory bits 是否为 0,DFF 是否集中在大位宽信号。
  • • 3️⃣ 再看 FSM 编码:状态数 × 编码方式是否匹配 DFF 预算。
  • • 4️⃣ 再看长组合链:深度是否超过阈值,根因是哪类操作。
  • • 5️⃣ 再看 MUX 和扇出:MUX 占比、位宽、是否在关键路径。
  • • 6️⃣ 最后看 DFF 总量:区分预期并行度和意外退化。

🎯 联动原则:memory 退化会同时推高 DFF、扇出和布线压力;MUX 过重会同时推高深度、扇出和面积;FSM 编码不当会同时推高 DFF 和译码深度。根因优先,症状其次。


十、总结:结构风险前移的五条主线

🏁 七类专题,五条治理主线:

  • • 🩺 缺陷门禁:latch、多驱、悬空、组合环 零容忍,CI 硬失败。
  • • 💾 存储优先:大数组先看 memory bits,退化优先改模板,不是加流水。
  • • 🏷️ 状态机预算:状态数 × 编码方式 = DFF 预算,先匹配再看深度。
  • • 📏 深度根因:长组合链先看根因(宽加法/比较器/优先级/MUX 树),再决定拆结构还是插流水。
  • • 🌐 扇出与 MUX 联动:高扇出和大位宽 MUX 互相放大,优先“选择计算”、复制、打拍、OR 树。

🎯 一句话收尾:这七类结构风险,功能仿真看不出来,后端却要付出巨大代价。RTL 阶段用秒级结构报告提前暴露、用相对趋势驱动修改,是成本最低的排雷方式。

 


【声明】内容源于网络
0
0
ai算法芯片与系统
长期关注ai领域,算法,芯片,软件(系统,框架,编译器,算子库)等联合设计
内容 245
粉丝 0
ai算法芯片与系统 长期关注ai领域,算法,芯片,软件(系统,框架,编译器,算子库)等联合设计
总阅读7.4k
粉丝0
内容245