PSS基础之function使用

       函数可以在全局、包或组件范围内声明。函数可以是静态函数或实例(非静态)函数。全局函数或包函数始终是静态的。组件函数可以显式声明为 static。如果组件函数是非静态的,则每个函数调用都与该组件类型的特定实例相关联。

可以通过以下三种方式之一定义函数:
        — 使用 PSS 过程语句,可能调用其他函数。
        — 绑定到外部编程语言中的接口,例如 C/C++ 中的函数,或 SystemVerilog 中的函数/任务。这仅适用于静态函数; 实例函数不能绑定。
        — 作为目标代码模板块。

       以这三种方式之一定义函数可以与函数的初始声明耦合。定义也可以在没有声明的情况下提供。在这种情况下,定义也用作声明,定义可以与声明分开提供。函数的意图和语义由其声明固定,但其实现可能因不同的环境和上下文而异。但是,给定的 PSS 模型及其所有源单元应仅包含任何函数的一个定义。

       可以从过程 exec 块(即 exec init_down、init_up、pre_solve、post_solve、body、run_start 和 run_end)中调用函数。从 exec init_down、init_up、pre_solve 和 post_solve 调用的函数在 solve 平台上进行评估; 而从 exec body、run_start 和 run_end 调用的函数在 target 平台上进行评估。如果函数被显式声明为 solve 或 target,则其使用仅限于相应种类的 exec 块的上下文中。

       在组件范围内声明的静态函数可能会被派生组件中具有相同名称的函数声明所覆盖,该函数声明可以是静态的,也可以是非静态的。派生组件中的函数声明可能具有与基组件中的返回类型或参数不同。

       在组件范围内声明的实例函数可能会被派生组件中具有相同名称的实例函数声明所覆盖。派生组件中的函数声明必须与基组件中的函数声明具有相同的返回类型和参数。

------------------------------------------------------------------------------------------------------------------------------

       函数原型在 PSS 描述的 package 或 component 范围内声明。函数原型指定函数可用性是否仅限于 solve 或 target 平台、是否为静态、函数名称、返回类型和函数参数。请注意,此处显示的语法仅用于函数原型的声明,其中定义单独提供。还可以使用过程语句块、目标代码模板或 import function 语句立即声明和定义函数。在这些情况下,也使用相同的语法来指定原型。

       在某些环境中,测试生成和执行是单独的活动。在这些环境中,某些函数可能仅在 solve 平台上的测试生成期间可用,而其他函数仅在 target 平台上的测试执行期间可用。例如,参考模型函数可能仅在测试生成期间可用,而对硬件设备进行编程的实用程序函数可能仅在测试执行期间可用。

       假定非限定函数在测试生成和执行的所有阶段都可用。指定限定符以限制函数的可用性。不得从 target execs (即 body、run_start 和 run_end)直接或间接调用仅限于 solve 平台的函数。同样,限制在目标平台的函数也不能从 solve execs 中调用,即 init_down、init_up、pre_solve、post_solve 和 pre_body。

------------------------------------------------------------------------------------------------------------------------------

package arithmetic_pkg {
    // Prototypes
    solve function int solve_add(int a, int b);
    target function int target_add(int a, int b);
 
    // Definitions
    solve function int solve_add(int a, int b) { // solve-only definition
        return a+b;
    }
    target function int target_add(int a, int b) { // definition for any platform
        return a+b;
    }


    function bool compare(int src1, src2) {
        return src1 == src2;
    }
};

component pss_top {
    import std_pkg::*;
    import arithmetic_pkg::*;

    action add_test_a {
        rand int base1;
        rand int base2;
        int solve_sum;

        exec post_solve {
            solve_sum = solve_add(base1, base2);          
        };

        exec body {
            int sum;
            sum = target_add(base1, base2);
            if (arithmetic_pkg::compare(solve_sum, sum)) {
                message(NONE, "-----------------------\r\n");
            } else {
                message(NONE, "=======================\r\n");
            }
        }
    };


};

------------------------------------------------------------------------------------------------------------------------------

外语程序接口

       PSS 中的静态函数声明可能会公开并最终绑定到 target 平台和/或 solve 平台上可用的外语 API(函数、任务、过程等)。以前在 PSS 描述中声明的函数可以指定为 imported。从 PSS 过程上下文调用 import 的函数会以外语调用相应的 API。参数和结果传递受为该语言定义的类型映射的约束。

使用导入的函数定义

       其他语言限定符将添加到导入的函数中,以便向工具提供有关函数实现方式的更多信息。在典型使用中,此类限定符在特定于环境的软件包(例如,特定于 UVM 环境的软件包或 C-test 特定的软件包)中指定。

       在组件中声明的静态函数只能在相同组件类型的范围内导入。在派生或不相关的组件类型中导入以基组件类型声明的函数是非法的。

package memory_base_pkg {
    // C implement
    import target C function void  hsi_write8(bit[32] addr, bit[8] data);
    import target C function void hsi_write16(bit[32] addr, bit[16] data);
    import target C function void hsi_write32(bit[32] addr, bit[32] data);
    import target C function void hsi_write64(bit[32] addr, bit[64] data);

    import target C function bit[8]  hsi_read8(bit[32] addr);
    import target C function bit[16] hsi_read16(bit[32] addr);
    import target C function bit[32] hsi_read32(bit[32] addr);
    import target C function bit[64] hsi_read64(bit[32] addr);

    // System Verilog implement
    import target SV function void  scalar_write8(bit[32] addr, bit[8] data);
    import target SV function void scalar_write32(bit[32] addr, bit[32] data);

    import target SV function bit[8]  scalar_read8(bit[32] addr);
    import target SV function bit[32] scalar_read32(bit[32] addr);
};

component pss_top {
    import memory_base_pkg::*;

exec declaration C = """

#define hsi_read8(addr)                   (*((volatile uint8_t *)(addr)))
#define hsi_read16(addr)                  (*((volatile uint16_t *)(addr)))
#define hsi_read32(addr)                  (*((volatile uint32_t *)(addr)))
#define hsi_read64(addr)                  (*((volatile uint64_t *)(addr)))

#define hsi_write8(addr, val)             ((*((volatile uint8_t *)(addr))) = ((uint8_t)(val)))
#define hsi_write16(addr, val)            ((*((volatile uint16_t *)(addr))) = ((uint16_t)(val)))
#define hsi_write32(addr, val)            ((*((volatile uint32_t *)(addr))) = ((uint32_t)(val)))
#define hsi_write64(addr, val)            ((*((volatile uint64_t *)(addr))) = ((uint64_t)(val)))


""";

exec declaration SV = """

export "DPI-C" task scalar_write8;
task scalar_write8(input longint unsigned addr, input byte unsigned data);
  static string apb_master = {"*.", inst_name, ".master"};
  apb_master_agent master;
  master = find_apb_master_agent(apb_master);
  apb_write(master, addr, 1, data);
endtask;
 
export "DPI-C" task scalar_write32;
task scalar_write32(input longint unsigned addr, input int unsigned data);
  static string apb_master = {"*.", inst_name, ".master"};
  apb_master_agent master;
  master = find_apb_master_agent(apb_master);
  apb_write(master, addr, 4, data); 
endtask;
 
export "DPI-C" task scalar_read8;
task scalar_read8(input longint unsigned addr, output byte unsigned data);
  static string apb_master = {"*.", inst_name, ".master"};
  apb_master_agent master;
  master = find_apb_master_agent(apb_master);
  apb_read(master, addr, 1, data);
endtask;
 
export "DPI-C" task scalar_read32;
task scalar_read32(input longint unsigned addr, output int unsigned data);
  static string apb_master = {"*.", inst_name, ".master"};
  apb_master_agent master;
  master = find_apb_master_agent(apb_master);
  apb_read(master, addr, 4, data); 
endtask;

""";


    action hsi_write8_a {
        rand bit[32] addr;
        rand bit[8] data;

        exec body {
            hsi_write8(addr, data);
        }
    }

    action hsi_read8_a {
        rand bit[32] addr;

        exec body {
            bit[8] data;
            data = hsi_read8(addr);
        }
    }
    ////////////////////////////////////////////////////

    action scalar_write8_a {
        rand bit[32] addr;
        rand bit[8] data;

        exec body {
            hsi_write8(addr, data);
        }
    }

    action scalar_read8_a {
        rand bit[32] addr;

        exec body {
            bit[8] data;
            data = scalar_read8(addr);
        }
    }  

    action scenario_test_a {
        activity {
            select {
                do hsi_write8_a with { addr == 0x20000000; };
                do scalar_write8_a with { addr == 0x20000000; };
            }
            select {
                do hsi_read8_a with { addr == 0x20000000; };
                do scalar_read8_a with { addr == 0x20000000; };
            }
        }
    };

};

------------------------------------------------------------------------------------------------------------------------------

目标模板函数

       当与没有“函数”概念的语言(如汇编语言)集成时,函数的实现可以由 target-template 代码字符串提供。

       target-template 函数形式允许与不涉及过程接口的外部语言进行交互。例如,将汇编代码或全局变量注入生成的测试激励中。target-template 函数形式始终是 target 实现。变量引用只能在表达式位置使用。不应提供函数返回值。如果 target-template 函数是实例(非静态)函数,则嵌入在目标代码中的 PSS 表达式可以引用实例属性,可以选择使用 this。

以下内容也适用:
        a) 目标模板函数的函数原型中应未指定参数方向。这意味着不应使用参数 direction (input,output,inout)。如果函数声明包含参数的方向,则此函数不应具有 target-template 实现。
        b) 目标模板声明中指定的原型必须与函数声明中指定的原型匹配,如下所示:
                1)参数的数量必须相同。
                2)参数名称和类型必须相同。
                3)返回类型必须相同。

package aarch64_base_pkg {

    target C function void raw_write8(bit[32] addr, bit[8] val) = """
        __asm__ __volatile__ ("strb %w0, [%1]" :: "r"({{val}}), "r"({{addr}}));
    """;

    target ASM function void set_vector_base(void) = """
        switch_el x1, 3f, 2f, 1f
        3: msr VBAR_EL3, x0
           b   0f  
        2: msr VBAR_EL2, x0
           b   0f  
        1: msr VBAR_EL1, x0
           b   0f  
        0: ret 
    """;
};

component pss_top {

    action write_a {
        rand bit[32] addr;
        constraint default addr == 0x80000000;
        rand bit[8] data;

        exec body {
            raw_write8(addr, data);
        }
    }

};

内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
<think>嗯,用户想用Matlab进行电力系统稳定器(PSS)的参数优化,需要方法和教程。首先,我得回忆一下Matlab里相关的工具箱。Simulink肯定是基础,因为电力系统建模常用到它。然后是SimPowerSystems,现在可能改名叫Simscape Electrical了,对吧?还有优化工具箱,比如Global Optimization Toolbox和Optimization Toolbox,这两个应该会用到。 接下来,用户可能需要具体的步骤。参数优化通常包括建立模型、选择优化算法、设置目标函数和约束条件。目标函数可能涉及时域性能指标,比如超调量、调节时间,或者频域指标如相位补偿。约束条件可能包括参数的范围,比如PSS的时间常数不能为负。 然后,我得考虑用户可能的难点。比如,如何将Simulink模型与优化算法结合,可能需要用MATLAB脚本自动化运行仿真并提取结果。这时候,sim函数或者Batch模式可能会有用。另外,优化算法的选择,遗传算法、粒子群这些全局优化方法适合多参数问题,而fmincon这类局部优化可能需要好的初始值。 用户可能还不太清楚具体怎么操作,比如如何编写目标函数,或者如何处理仿真数据。这时候,可能需要给出代码示例,比如用ga函数设置变量范围和适应度函数。同时,提醒他们注意仿真步长和算法稳定性,避免数值振荡影响优化结果。 还有,参考资料方面,MathWorks官网的文档和示例应该是权威的。比如,Simscape Electrical的PSS模块说明,还有优化工具箱的案例。用户可能需要这些链接去深入学习。 最后,生成相关问题时要覆盖教程、算法、验证方法和挑战,这样用户能全面了解。比如,问有没有详细教程,或者如何验证优化后的参数,这些都是用户可能会遇到的后续问题。</think>### 使用Matlab进行电力系统稳定器(PSS)参数优化的方法 #### 1. **基础工具与模块** - **Simulink基础建模**:使用Simscape Electrical(原SimPowerSystems)搭建单机无穷大系统模型,包含同步发电机、励磁系统和PSS模块[^1]。 - **PSS结构选择**:常用二阶或三阶传递函数,其参数(如时间常数$T_1, T_2, T_3$和增益$K_p$)需优化。 #### 2. **优化目标与约束** - **目标函数定义**: $$J = \alpha \cdot \text{ITAE} + \beta \cdot \text{超调量} + \gamma \cdot \text{调节时间}$$ 其中ITAE(Integral of Time-weighted Absolute Error)用于衡量动态响应质量[^2]。 - **约束条件**:参数需满足物理限制(如$T_i > 0$)和频域稳定性边界。 #### 3. **优化算法实现** - **全局优化**:使用`Global Optimization Toolbox`中的遗传算法(`ga`)或粒子群算法(`particleswarm`)。 ```matlab options = optimoptions('ga','MaxGenerations',100); [x_opt, fval] = ga(@objective_function, n_vars, [], [], [], [], lb, ub, [], options); ``` - **局部优化**:结合`fmincon`进行梯度优化,需提供初始值。 #### 4. **模型集成与验证** - **自动化仿真**:通过MATLAB脚本调用Simulink模型,使用`sim`命令批量运行。 ```matlab simOut = sim('PSS_Model.slx','StopTime','10'); rotor_speed = simOut.logsout.get('RotorSpeed').Values.Data; ``` - **频域验证**:利用`power_analyze`工具进行特征值分析,确保阻尼比满足要求(一般$\zeta > 0.1$)[^3]。 #### 5. **关键注意事项** - **参数敏感性分析**:使用`fmincon`的`CheckGradients`选项验证目标函数梯度。 - **噪声处理**:在仿真中增加白噪声模块模拟实际扰动,避免过拟合。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值