关于gen_fsm 的一些理解

gen_fsm module                    Callback module
--------------                    ---------------
gen_fsm:start_link                -----> Module:init/1

gen_fsm:send_event                -----> Module:StateName/2

gen_fsm:send_all_state_event      -----> Module:handle_event/3

gen_fsm:sync_send_event           -----> Module:StateName/3

gen_fsm:sync_send_all_state_event -----> Module:handle_sync_event/4

-                                 -----> Module:handle_info/3

-                                 -----> Module:terminate/3

-                                 -----> Module:code_change/4
 
1:gen_fsm 可以应用状态机,看了yourihua的 

Erlang OTP设计原则Gen_Fsm行为 有感。 proc_lib:start_link(

gen_fsm:start_link -> gen:start ->gen:do_spawn ->proc_lib_start_link -> 其实都是通过apply(M,F,A) 最后这是mod:init(Arg) ,所以gen_fsm:start_link 里面代码就有mod:init .
gen_fsm:start_link                -----> Module:init/1

  
gen_fsm:send_event                -----> Module:StateName/2  是init 通过初始化 {ok,static,State }, static 就是StateName,   所以就调用调了 Module:StateName/2  再次调用就可以改变状态了。
其实是通过下面实现的,
Event这是 gen_fsm:send_event/2 向gen_fsm 发送的状态
dispatch({'$gen_event', Event}, Mod, StateName, StateData) ->
    Mod:StateName(Event, StateData);
dispatch({'$gen_all_state_event', Event}, Mod, StateName, StateData) ->
    Mod:handle_event(Event, StateName, StateData);
dispatch({'$gen_sync_event', From, Event}, Mod, StateName, StateData) ->
    Mod:StateName(Event, From, StateData);
dispatch({'$gen_sync_all_state_event', From, Event},
	 Mod, StateName, StateData) ->
    Mod:handle_sync_event(Event, From, StateName, StateData);
dispatch({timeout, Ref, {'$gen_timer', Msg}}, Mod, StateName, StateData) ->
    Mod:StateName({timeout, Ref, Msg}, StateData);
dispatch({timeout, _Ref, {'$gen_event', Event}}, Mod, StateName, StateData) ->
    Mod:StateName(Event, StateData);
dispatch(Info, Mod, StateName, StateData) ->
    Mod:handle_info(Info, StateName, StateData).


  

  

  

  

  

 
<think>我们正在处理一个关于PrimeTime PX (ptpx) 功耗分析报告的问题。用户注意到报告中次级功耗的总和并不等于100%。这通常是由于报告中的功耗分类和计算方式导致的。下面我将逐步解释可能的原因。 ### 1. **功耗分类** ptpx的功耗报告通常将总功耗分为几个主要类别: - **Internal Power** (内部功耗):由单元内部翻转引起。 - **Switching Power** (开关功耗):由互连线上的电容充放电引起。 - **Leakage Power** (静态功耗):由晶体管漏电流引起。 - 其他可能的分类,如**Clock Power**(时钟功耗)等。 在报告中,这些类别可能被进一步细分为次级类别(sub-levels)。例如,内部功耗可能按不同的单元类型或层次结构进行细分。 ### 2. **次级功耗总和与总功耗的关系** 次级功耗(sub-level power)通常是指某个主要功耗类别下的细分项。例如,内部功耗可能被细分为: - 组合逻辑内部功耗 - 时序单元内部功耗 但是,**总功耗(Total Power)** 是所有这些主要类别的总和: $$ \text{Total Power} = \text{Internal Power} + \text{Switching Power} + \text{Leakage Power} + \cdots $$ 而次级功耗(sub-level)只是某个主要类别下的细分。因此,当我们说“次级功耗总和”时,我们指的是某个主要类别(如内部功耗)下的所有细分项的总和。这个总和应该等于该主要类别的值,而不是总功耗的100%。 ### 3. **为什么次级功耗总和不等于100%?** 用户观察到次级功耗的总和(例如,内部功耗下的所有子项)不等于100%。这可能有以下原因: - **次级功耗仅针对一个主要类别**:用户可能正在查看某个主要类别(如内部功耗)下的次级分类,并期望这些次级分类的总和等于整个设计的功耗的100%。但实际上,它们只应该等于该主要类别的100%。例如,内部功耗的次级分类总和应等于内部功耗的值,而不是总功耗的值。 - **存在未归类的功耗**:有时,工具可能无法将某些功耗分配到具体的次级类别中,导致有部分功耗未被计入次级分类。这可能是由于设计中的一些特殊结构或未标注功耗的单元造成的。 - **四舍五入误差**:报告中的数字通常经过四舍五入显示,因此多个次级功耗的显示值之和可能与主要类别的显示值有微小差异(但通常应该非常接近)。 - **层次结构的影响**:如果设计具有层次结构,功耗报告可能按层次组织。在这种情况下,子模块的功耗总和可能不等于父模块的功耗,因为父模块本身可能还有一些顶层的功耗(如顶层互连线)未被分配到子模块中。 ### 4. **如何验证** - 检查报告中的主要功耗类别(如Internal, Switching, Leakage)的值。 - 然后,检查某个主要类别下的次级功耗的总和,看是否等于该主要类别的值(而不是总功耗的值)。 - 如果次级功耗总和与主要类别值有差异(且不是四舍五入造成的),则需要检查是否有功耗未被归类。可以查看报告是否有“unattributed”或“unknown”等项。 ### 5. **示例** 假设一个报告如下: ``` Total Power = 100 mW Internal Power = 60 mW Sub-level 1 = 30 mW Sub-level 2 = 20 mW Sub-level 3 = 10 mW (这里总和=60 mW, 等于Internal Power) Switching Power = 30 mW Sub-level 1 = 15 mW Sub-level 2 = 15 mW (总和=30 mW) Leakage Power = 10 mW Sub-level 1 = 10 mW ``` 在这个例子中,每个主要类别下的次级功耗总和都等于该主要类别的值。而总功耗是这三个主要类别的总和(60+30+10=100 mW)。 如果用户将内部功耗的三个次级功耗相加(30+20+10=60 mW)并期望它等于总功耗的100%(即100 mW),那显然是不正确的。因为它只占总功耗的60%。 ### 6. **其他可能原因** - **时钟网络功耗**:时钟网络功耗有时会被单独列出,或者包含在开关功耗中。如果用户没有将时钟功耗考虑在内,可能会导致困惑。 - **多电压域**:如果设计中有多个电压域,功耗报告可能会按电压域分开报告。用户需要确保在同一个电压域内进行次级功耗的累加。 - **功耗计算选项**:ptpx在计算功耗时,有一些选项(如`-verbose`)可以显示更详细的信息。检查这些选项是否启用,以确保报告完整。 ### 结论 次级功耗的总和应该等于其所属的主要功耗类别的值,而不是总功耗的100%。用户需要明确自己正在查看的是哪个主要类别的次级分类,并检查该主要类别的值是否等于其次级分类的总和。如果存在差异,可能是由于四舍五入、未归类的功耗或报告配置问题导致。 §§相关问题§§ 1. 如何配置ptpx以生成更详细的功耗报告? 2. ptpx中如何处理多电压域的功耗分析? 3. 如何减少ptpx功耗分析中的未归类功耗? 4. 如何验证ptpx功耗报告的准确性?</think>### 理解 ptpx 功耗报告中次级功耗总和不等于 100% 的原因 在 PrimeTime PX (ptpx) 功耗分析报告中,次级功耗(sub-level power)的总和与总功耗比例不一致是常见现象,主要由以下原因造成: --- #### 1. **功耗分类层级差异** - **总功耗** = 动态功耗(开关 + 内部) + 静态功耗(泄漏) + 其他特殊功耗(如时钟树)[^1]。 - **次级功耗** 仅针对特定类别(如内部功耗的子项),其总和只占**所属父类别的 100%**,而非全局总功耗的 100%。 **示例**: $$ \text{内部功耗} = \text{子项 A} + \text{子项 B} = 100\% \\ \text{但} \frac{\text{内部功耗}}{\text{总功耗}} \neq 100\% $$ --- #### 2. **未归类的功耗(Unattributed Power)** ptpx 可能无法将部分功耗分配到具体模块或单元,导致: - 未归类的功耗单独列出,不参与次级分类的求和。 - 常见于: - 顶层互连线的开关功耗 - 未标注功耗的 IP 核 - 功耗计算中的近似误差 --- #### 3. **功耗计算精度问题** - 四舍五入误差:次级功耗的小数位四舍五入后,总和可能略低于或高于 100%。 - 工具内部计算:ptpx 可能使用不同精度的算法计算不同层级的功耗(如模块级用快速估算,单元级用精确模型)。 --- #### 4. **层次化设计的影响** - 若设计包含层次化模块(Hierarchical Blocks): - 父模块功耗可能包含子模块功耗**之外**的额外开销(如模块间布线)。 - 子模块功耗总和 ≠ 父模块功耗,导致比例失调。 --- #### 5. **特殊功耗项的独立统计** - 某些功耗项(如时钟网络功耗)可能被单独报告: $$ \text{总功耗} = \text{次级功耗总和} + \text{时钟功耗} + \text{未归类功耗} $$ - 这些独立项不参与次级分类的百分比计算。 --- ### 解决方案建议 1. **检查报告配置** 确保 `report_power` 命令启用 `-verbose` 选项,显示所有未归类功耗: ```tcl report_power -hierarchy -verbose > power.rpt ``` 2. **验证功耗源** 核对是否遗漏了以下独立项: - `Clock Network Power` - `Blackbox Power`(未建模 IP) - `Constant Net Power` 3. **统一精度设置** 在功耗计算时指定精度(如 `set_power_calculation_options -decimal_places 4`),减少四舍五入误差。 4. **分层对比** 逐层检查父模块与子模块的功耗关系: ```tcl report_power -blocks [get_cells *] # 遍历所有子模块 ``` --- ### 典型报告示例 | **Category** | **Power (mW)** | **% Total** | |---------------------|----------------|-------------| | **Internal** | 50 | 40% | |    ↳ Sub-level A | 30 | 24% | |    ↳ Sub-level B | 20 | 16% | | **Switching** | 40 | 32% | | **Leakage** | 15 | 12% | | **Clock Network** | 10 | 8% | | **Unattributed** | 5 | 4% | | **Total** | 120 | 100% | > 📌 注意:次级功耗(A+B=40%)总和为内部功耗的 100%,但仅占总功耗的 40%,其余由其他独立项组成。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值