PSS基础之function使用

LTE PSS ZC序列 MATLAB仿真:3种根指数序列生成与互相关特性分析 本文详细介绍了LTE主同步信号(PSS)中ZC序列的MATLAB仿真实践,包括三种根指数(25、29、34)序列的生成方法与互相关特性分析。通过时频域特性验证和抗噪声性能测试,展示了ZC序列在物理层同步中的优异性能,为通信工程提供了可直接复用的代码方案和优化技巧。 阅读详情

       函数可以在全局、包或组件范围内声明。函数可以是静态函数或实例(非静态)函数。全局函数或包函数始终是静态的。组件函数可以显式声明为 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);
        }
    }

};

[1999] [Policy Gradient] [Policy Gradient Methods for Reinforcement Learning with Function Approxim] 本文提出了强化学习中策略梯度方法的理论基础和函数逼近技术。通过策略梯度定理(Theorem 1)建立了策略参数θ与期望回报ρ之间的梯度关系,证明过程中运用了状态值函数V^π和动作值函数Q^π的递归性质。研究进一步探讨了函数逼近方法,其中f_w作为Q^π的近似,通过最小二乘优化进行更新(Theorem 2)。当满足特定条件(式4)时,策略梯度可以精确表示为f_w的加权和(式5)。最后,以softmax策略为例,推导了具体参数更新公式,展示了该理论框架在实际算法中的应用。这项工作为后续策略梯度算法的发展奠定了重 阅读详情

相关推荐

APK静态分析(取证角度)——理论部分

APP是指应用程序(Application),是指能够在手机、平板电脑、电脑等移动设备上运行的软件。APP可以帮助用户进行各种功能操作,如社交媒体、游戏、购物、学习、工作等。用户可以通过应用商店或者在线下载安装APP,然后在设备上使用它们。APP的种类非常丰富,能够满足用户不同的需求和兴趣。

currify的博客 3208

UVM:验证IP(Verification Intellectual Property, VIP)

VIP可用于植入用户的验证环境中,用于协议标准和接口的连接和检查。这些VIP除了根据协议等的驱动driver和sequence外,还包括相应的覆盖率模型、dut软件模型、说明文档等。例如高级外围总线(Advanced Peripheral Bus, APB)是唯一主多从的设备总线标准。如果在项目中涉及到了APB接口,就可以使用APB的VIP。...

weixin_46492844的博客 7603

C#连接数据库报Authentication to host ‘127.0.0.1‘ for user ‘root‘ using method ‘caching_sha2_password‘ fail

所以导致的,除了上边的办法,还可以把这个加密规则修改一下,这个的修改方式有很多,具体原因是因为MySQL8.0以前的加密规则是。

weixin_42209881的博客 4128

DVT| DVT在PSS中的应用

便携式激励技术是IC验证中最热门的话题之一。一些EDA供应商已经开发了相关的工具,并与Accelera Systems Initiative合作,为它们定义一个标准的输入格式。便携式激励标准(PSS)1.0版于2018年6月发布,人们对这一方法很感兴趣。现在所有相关的商业工具都支持该标准,采用速度正在加快。 然而,在实际芯片设计中采用PSS并不是一件容易的事。PSS提供了两种输入格式,这两种格式都比传统的SystemVerilog约束随机测试台抽象得多。便携式激励方法令人印象深刻的功能是由输入格...

路科验证 1808

Mplus实战:如何用潜在类别分析(LCA)快速搞定心理学数据分类?

本文详细介绍了如何运用Mplus软件进行潜在类别分析(LCA),以快速处理心理学数据并识别内部异质性群体。文章从数据准备、Mplus语法编写、模型拟合与选择,到结果解读与高级应用(如纳入协变量),提供了完整的实战指南,帮助研究者从变量视角转向个体视角,有效挖掘数据中的潜在子类别。

weixin_28318011的博客 410

手把手教你学simulink(8.39)--基于Simulink的步进电机(Stepper Motor)仿真实例

通过这个仿真实例,你可以学习如何使用Simulink构建和仿真步进电机(Stepper Motor)系统。你可以根据实际需求调整模型和参数,进行更复杂的仿真和分析。希望这个例子对你有所帮助,祝你学习愉快!

MHD0815的博客 1052

systemc 学习笔记001-建模准备工作

systemc与rtl混合仿真并无论从构建case,比如pss的概念,还是替代UVM快速开发,或者说仿真速度提升等方面来讲,其实都没有很明显的优势,反而缺陷很多,sc是c++中的一个库,对硬件工程师来讲是一门特别不友好的语言,对软件工程师来讲,又要体验硬件开发中并行的概念,所以在过去20年芯片开发中,sc一直很难普及,sv对硬件工程师来很友好一骑绝尘,即使sv中也借鉴了TLM trans payload。牛逼架构师加持下的,性能仿真,前提是牛逼架构师能制定好kpi,不要总盯着带宽,延时这两个必须的指标。

walter0007的博客 1335

Plant Simulation与ABB机器人虚实结合

Plant Simulation与ABB机器人虚实结合

santayana的专栏 1869

PSRR 仿真教程,怎么仿真电路的psrr 两个电路案例,一个是16分频的分频器

更阴险的是低频段——某次仿真发现1MHz处有-10dB凹陷,查版图发现是衬底接触离振荡节点太近,噪声通过寄生电容耦合进去了。最近折腾PSRR仿真时发现,用Cadence的pss+pxf组合拳对付它特别有效——今天拿两个实际电路开刀,讲讲怎么揪出电源噪声的软肋。PSRR的测量对于改善对噪声源的免疫力很重要,如电源涟漪由于干扰或系统的数字部分。PSRR的测量对于改善对噪声源的免疫力很重要,如电源涟漪由于干扰或系统的数字部分。两个电路案例,一个是16分频的分频器,一个是250MHz的环形压控振荡器。

BeBThMqi的博客 337

鸿蒙系统开发工程师:核心技术解析与深度面试指南

摘要: 鸿蒙系统开发工程师需具备底层驱动开发、系统移植优化及分布式架构能力。核心职责包括硬件适配(Bootloader、内核移植、HDF驱动开发)、性能调优(启动加速、功耗管理)及稳定性保障。技术要求涵盖C/C++编程、Linux内核机制、鸿蒙架构(HDF、分布式服务)及ArkTS/ArkUI基础。面试重点考察系统移植流程(如ARM板适配)、驱动开发(I2C/Display)、性能优化手段及内存/同步机制的应用。

郑伟强dev的专栏 430

【温室气体数据集】全球总碳柱观测网络 TCCON

【温室气体数据集】全球总碳柱观测网络 TCCON

WW、forever的博客 437

电力系统Simulink仿真中的SVC与PSS参数优化实战

电力系统暂态稳定性分析是确保电网安全运行的核心技术,其本质是通过数学模型模拟系统在扰动下的动态行为。Simulink作为主流仿真平台,通过模块化建模实现从设备级到系统级的数字孪生。在仿真过程中,静止无功补偿器(SVC)与电力系统稳定器(PSS)的参数协调直接影响数值稳定性,不当的时间常数设置会引发高频振荡甚至系统崩溃。本文基于4机10节点系统的工程案例,详细解析了如何通过参数优化和仿真技巧改进,解决由SVC动态响应与系统振荡模式不匹配引发的典型问题,为电力电子设备与控制系统的协同调试提供实用方法论。

weixin_30457551的博客 612

SAPFiori Elements Analytical List Page 概述

ALP(Analytical List Page)是SAP Fiori提供的一种复合页面类型,结合了分析(图表/KPI)与事务(表格/操作)功能,适用于需要分析后立即执行处理的业务场景(如采购价格监控、销售逾期处理等)。其核心价值在于让用户在同一页面完成从数据洞察到事务处理的闭环,减少应用切换带来的效率损耗。 页面结构包含页头KPI标签、交互式图表和明细表格,通过联动过滤、选择同步等机制实现数据钻取与即时操作。支持标准过滤和可视化过滤,并依赖OData注解(SelectionVariant/Presenta

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 269

LTE PSS ZC序列 MATLAB仿真:3种根索引生成与62点星座图分析

本文详细解析了LTE物理层中主同步信号(PSS)的ZC序列特性,通过MATLAB实战演示了三种根索引(25、29、34)的生成方法,并深入分析了62点星座图及其自相关特性。内容涵盖ZC序列基础原理、MATLAB代码实现、星座图解析及工程应用中的关键考量,为通信工程师提供了从理论到实践的完整指导。

weixin_33946020的博客 415

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Soft Value function基础和Soft Q Learning中Policy Improvement 证明

  本文主要是来自Reinforcement Learning with Deep Energy-Based Policies文章中Appendices A的学习笔记。   本文主要证明Soft Q Learning在 maximum entropy objective中的Policy Improvement。首先我们定义一个稍微有点细致(slightly more nuanced)的最大熵目标的...

小小何先生的学习之旅 2308

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

危险API警示录:RustCrypto RSA库hazmat裸RSA接口的使用边界与安全红线

在 Rust 加密生态中,RustCrypto RSA 库(`rsa` crate)是最成熟的纯 Rust RSA 实现。但它的 `hazmat` 模块暴露了一个被称为"危险 API"(HAZARDOUS API)的裸 RSA 接口——它直接执行模幂运算,**不添加也不校验任何填充(Padding)**。绝大多数开发者都应该远离它。本文用一份完整指南,讲清楚 RustCrypto RSA 库 ha

gitblog_00300的博客 425

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

UVM面试高频考点与实战解析

UVM(Universal Verification Methodology)作为芯片验证领域的事实标准,其核心价值在于提供标准化的验证方法学框架。从技术原理看,UVM基于SystemVerilog构建,采用工厂模式、配置机制和TLM通信等关键技术,实现了验证环境的可重用性和可扩展性。在工程实践中,UVM组件生命周期管理、TLM通信机制和寄存器模型同步策略是验证工程师必须掌握的三大核心技能。特别是在SoC验证场景中,合理的phase调度和TLM接口选择直接影响验证效率。通过分析实际项目中的死锁案例和覆盖率优

weixin_30918633的博客 330

Policy Gradient Methods for Reinforcement Learning with Function Approximation

Policy Gradient Methods for Reinforcement Learning with Function Approximation 1 Policy Gradient Theorem 在时间t∈{0,1,2,...}t\in\{0,1,2,...\}t∈{0,1,2,...}的state, action, reword表示为st∈S,at∈A,rt∈Rs_t\in \mathcal S,a_t\in \mathcal A,r_t\in \mathcal Rst​∈S,at​∈A,r

weixin_37958272的博客 555

低成本LTE基站扫描终极指南:用RTL-SDR实现专业网络分析

在无线通信领域,LTE基站检测和网络分析一直是专业设备和昂贵工具的专属领域。然而,LTE-Cell-Scanner项目彻底改变了这一现状,为技术爱好者和网络工程师提供了一套完整的开源解决方案,能够使用成本极低的RTL-SDR设备实现专业的**LTE网络扫描**和**基站检测**。这款工具的最大亮点在于其优化的算法设计,即使在仅有8位A/D转换器、20dB噪声系数和100ppm频率误差的低性能RF前

gitblog_00730的博客 338

从信号捕获到SIB消息:LTE-Cell-Scanner完整工作流程图文解析

LTE-Cell-Scanner是一款强大的开源工具,能够实现从A/D采样到PDSCH中SIB ASN1消息解码的全栈LTE信号处理,特别针对RTL-SDR、HACKRF和BladeRF等硬件进行了优化。本文将详细解析其完整工作流程,帮助新手快速理解信号捕获与处理的全过程。 ## 一、信号捕获:从硬件到数字信号 ### 1.1 硬件支持与配置 LTE-Cell-Scanner支持多种SDR硬件

gitblog_00418的博客 409

加密与编码算法全解:从原理到精通(Java & JS 实战版)

如果你正在设计一个安全系统,请遵循以下垂直架构层级,每一层都依赖下一层的安全支撑:fill:#333;important;important;fill:none;color:#333;color:#333;important;fill:none;fill:#333;height:1em;密钥管理 Key Management存储安全 Storage Security传输安全 Transport Layer接口安全 API Security应用层 Application Layer业务逻辑。

csdn_silent的博客 3153

【RL】1.概论与基础

因为个人原因,没能抽出时间将笔记电子化。计划过几日实现电子化。 课程内容 问题 强化学习的基本结构是什么? 答:agent与env交互,env生成state,agent观测state为observation,决定action。见课程内容的图1。 强化学习相对于监督学习为什么训练会更加困难?(强化学习的特征) 答:[^1] 强化学习处理的多是序列数据,其很难像监督学习的样本一样满足IID(独立同分布)条件。 强化学习有奖励的延迟(Delay Reward),即在Agent的act.

BevnWu的优快云小站 473

读书笔记 -- >强化学习 -- > The Bellman Equation

本文将总结 强化学习中的一个重要基础知识,Bellman Equation。 文章目录value based 方法The V-function: the value of the stateThe Q-function: The value of the actionThe Bellman EquationBellman equation for the State-value functionBellman equation for the Action-value function参考资料 value

村头陶员外的博客 1676

[andriod]‘lws_plat_file_close‘; ISO C99 and later do not support implicit function declarations

在cc_library_shared的cflags里面增加 "-Wno-implicit-function-declaration"配置。修改Android.bp。

wgl307293845的博客 723

SONY重拳出击,开始涉足移动领域----Playstation Mobile必然崛起

Sony的E3 发布会并没有带来下一代游戏主机的消息,不过还是有一个新的亮点。那就是之前的PlayStation Suite 已经正式更名为 PlayStation Mobile。这就意味着将PS Mobile 开放给第三方的Android 手机制造商,开发者利用PS Mobile开发出的游戏和软件,不止可以运行在PSV中,还可以运行在Android手机中。       这个消

devpss的专栏 446
上一篇: PSS基础之executor使用
下一篇: PSS基础之Flow objects使用
-逐鹿中原
博客等级 码龄9年 44粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值