UVM基础-sequence library

2023-10-27

1.1 sequence library在环境中的使用

       uvm_sequence_library定义为是一堆sequence的集合,本质上其实就是uvm_sequence,只不过在普通的uvm_sequence的基础上封装了多种算法,支持对内部sequence的随机发送,或者有序发送等,在随机测试场景下会发挥大作用,从源码上看,uvm_sequnce_library实际上就是继承自uvm_sequence:

 在uvm_sequence_library中会维护一个sequence的队列,每加入一个sequence,就会在队列中加入一个sequence。用户自定义的sequence_library可以继承自uvm_sequence_library:

1.	class my_seq_library0 extends uvm_sequence_library#(uvm_sequence_item);
2.	      `uvm_object_utils(my_seq_library0)
3.	      `uvm_sequence_library_utils(my_seq_library0)
4.	      function void new(string name="my_seq_library0");
5.	           super.new(name);
6.	           init_sequence_library();
7.	      endfunction:new
8.	endclass

在声明sequence_library的时候,需要注意三个点:

  • seq_library要继承自uvm_sequence_library,且需要指定参数,一般为uvm_sequence_item,也可以是用户自定的transaction类型。
  • seq_library除了要注册到uvm_object_utils之外,还需要通过`uvm_sequence_library_utils宏进行注册;
  • 在seq_library的new函数中,需要调用init_sequence_library()函数初始化library中的sequence队列。

声明完一个sequence_library,如果不加入任何的sequence,那么这个sequence_library为空,这样的library不具备任何作用,需要在自定义的sequence中,将自定sequence加入到这个sequence_library中:

1.	class my_sequence extends uvm_sequence#(uvm_sequence_item);
2.	      my_transaction my_tr;
3.	      `uvm_object_utils(my_sequence)
4.	      `uvm_add_to_seq_lib(my_sequence, my_seq_library0)
5.	......
6.	      virtual task body();
7.	            repeat(10) begin
8.	                `uvm_do(my_tr)
9.	            end
10.	      endtask:body
11.	......
12.	endclass

在自定义的sequence中,使用uvm_add_to_seq_lib加入到sequence_library中,这个宏有两个参数,第一个是需要加入的sequence,第二个是sequence_library的名字。

       同样的,对于同一个sequence,可以加入到不同的sequence_library中,上述代码可以写为:

1.	class my_sequence extends uvm_sequence#(uvm_sequence_item);
2.	      my_transaction my_tr;
3.	      `uvm_object_utils(my_sequence)
4.	      `uvm_add_to_seq_lib(my_sequence, my_seq_library0)
5.	      `uvm_add_to_seq_lib(my_sequence, my_seq_library1)
6.	      `uvm_add_to_seq_lib(my_sequence, my_seq_library2)
7.	......
8.	      virtual task body();
9.	            repeat(10) begin
10.	                `uvm_do(my_tr)
11.	            end
12.	      endtask:body
13.	......
14.	endclass

另外,对于同一个sequence_library,也可以加入不同的sequence,比如有另外一个my_sequence_new:

1.	class my_sequence_new extends uvm_sequence#(uvm_sequence_item);
2.	      my_transaction my_tr;
3.	      `uvm_object_utils(my_sequence_new)
4.	      `uvm_add_to_seq_lib(my_sequence_new, my_seq_library0)
5.	......
6.	      virtual task body();
7.	            repeat(10) begin
8.	                `uvm_do(my_tr)
9.	            end
10.	      endtask:body
11.	......
12.	endclass

1.2 sequence library的启动方法

       sequence_library的启动实际上和sequence的启动类似,可以作为sequencer中main_phase的default_sequence启动,也可以调用sequence_library的start函数进行启动。

在tc中:

1.	class my_tc extends base_test;
2.	      my_seq_library0  seq_lib;
3.	      `uvm_component_utils(my_tc)
4.	......
5.	      virtual function void build_phase(uvm_phase phase);
6.	           super.build_phase(phase);
7.	           seq_lib = my_seq_library0::type_id::create("seq_lib");
8.	           uvm_config_db#(uvm_sequence_base)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", seq_lib);
9.	       endfunction:build_phase
10.	......
11.	endclass

或者也可以写成:

1.	class my_tc extends base_test;
2.	      my_seq_library0  seq_lib;
3.	      `uvm_component_utils(my_tc)
4.	......
5.	      virtual function void build_phase(uvm_phase phase);
6.	           super.build_phase(phase);
7.	           //seq_lib = my_seq_library0::type_id::create("seq_lib");
8.	           uvm_config_db#(uvm_object_wrap)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", seq_lib::type_id::get());
9.	       endfunction:build_phase
10.	......
11.	endclass

这里注意的是使用type_id::get()方法返回的是uvm_object_wrap类型的变量,和factory机制有关,因此uvm_config_db的参数必须是uvm_object_wrap,而使用seq_lib直接作为default_seq启动,则uvm_config_db的参数应该传递为uvm_sequence_base类型。

       另外,还可以通过调用seq_lib的start函数启动,在tc的main_phase中:

1.	class my_tc extends base_test;
2.	      my_seq_library0  seq_lib;
3.	      `uvm_component_utils(my_tc)
4.	......
5.	      virtual function void build_phase(uvm_phase phase);
6.	           super.build_phase(phase);
7.	           seq_lib = my_seq_library0::type_id::create("seq_lib");
8.	           //uvm_config_db#(uvm_object_wrap)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", seq_lib::type_id::get());
9.	       endfunction:build_phase
10.	
11.	       virtual function void main_phase(uvm_phase phase);
12.	           super.main_phase(phase);
13.	           phase.raise_objection(this);
14.	           seq_lib.start(env.i_agt.sqr, null, -1);
15.	           phase.drop_objection(this);
16.	       endfunction:main_phase
17.	......
18.	endclass

本质上,sequence_library和普通的sequence没有差别,所以启动方式也和普通的sequence方法一样。从uvm_sequence_library的源码也可以看出来,其继承自uvm_sequence,可以理解为在常规的sequence基础上封装了一层,然后内部丰富了sequence的发送算法和随机数量。

2.1 选择算法控制

如果不加任何设置,调用start任务后,sequence_library将会随机发送加入到library的sequence,uvm提供了4种sequence_library的模式,在基类uvm_sequence_library中,通过select_mode控制:

       select_mode的默认模式是:UVM_SEQ_LIB_RAND,也就是完全随机,那么其他几种模式的含义:

UVM_SEQ_LIB_RAND

完全随机发送sequence

UVM_SEQ_LIB_RANDC

将加入到sequence_library中的数据随机排一个顺序,然后进行依次发送,能保证内部每个sequence都被发送一次

UVM_SEQ_LIB_ITEM

不发送加入到sequence library中的sequence,发送自己产生的sequence,此时sequence library相当于一个普通的sequence

UVM_SEQ_LIB_USER

采用用户自定义的方式发送sequence,需要重载select_sequence方法实现

       这里重点说明下UVM_SEQ_LIB_USER的用法,如果用户将sequence_library的模式设定为该模式,需要重载select_sequence方法,这个方法的原型为:

重载该函数,实现用户自定义的sequence的发送,在sequence_library中:

1.	class my_seq_lib extends uvm_sequence_library#(uvm_sequence_item);
2.	      `uvm_object_utils(my_seq_lib)
3.	      `uvm_sequence_library_utils(my_seq_lib)
4.	      function void new(string name="my_seq_lib");
5.	          super.new(name);
6.	          init_sequence_library();
7.	      endfunction:new
8.	      virtual function int unsigned select_sequence(int unsigned max);
9.	          static int unsigned index[$];
10.	          static bit inited;
11.	          int value;
12.	          if (!inited) begin
13.	               for(int i=0; i<=max; i++) begin
14.	                      if((sequence[i].get_type_name() == "seq0") || 
15.	                         (sequence[i].get_type_name() == "seq1") ||
16.	                         (sequence[i].get_type_name() == "seq3") ) begin
17.	                         index.push_back(i);
18.	               end
19.	               inited = 1'b1;
20.	           end
21.	           value = $urandom_range(0, index.size()-1);
22.	           return index[value];
23.	       endfunction:select_sequence
24.	endclass

重载函数的含义是:初始化一开始inited为0,如果在sequence_library内部的sequence队列中加入seq0、seq1和seq3,那么会将index队列增加seq的序号,然后将初始化inited赋值为1,也就是只进行一次index的入队,循环外使用一个随机选取index队列中的序号,将序号返回,返回后,sequence_library会按照返回值发送sequence。也就是说这个功能为:只在sequence序号为0,1,3的sequence中随机选取一个发送。

这里用到了sequence_library中维护的sequence队列sequence[$],其源码为:

即注册到factory机制的加入sequence_library中的所有sequence。

 

2.2 运行次数控制

       实际上,在sequence_library中运行的sequence有次数说明,收到sequence_library中的变量max_random_count和min_random_count控制:

 可以看到,这两个值默认是10,也就是说,如果不加以设置,以UVM_SEQ_LIB_RAND运行的sequence_library,会随机执行10次sequence的发送,如果是UVM_SEQ_LIB_ITEM,则会产生10个sequence_item发送。

       sequence_library发送的机制其实是会选在min_random_count和max_random_count之间任意选择一个数来决定发送sequence的次数。可以通过设定这两个值改变sequence_library发送sequence的数量。可以在tc中通过uvm_configdb的方式改变值:

class my_tc extends base_test;
2.	       my_seq_library0  seq_lib;
3.	       `uvm_component_utils(my_tc)
4.	 ......
5.	       virtual function void build_phase(uvm_phase phase);
6.	            super.build_phase(phase);
7.	            seq_lib = my_seq_library0::type_id::create("seq_lib");
8.	                   uvm_config_db#(uvm_seq_lib_mode)::set(this, "env.i_agt.sqr.main_phase", "default_sequence.select_mode", UVM_SEQ_LIB_RANDC);
9.	                   uvm_config_db#(unsigned int)::set(this, "env.i_agt.sqr.main_phase", "default_sequence.min_sequence_count", 5);
10.	                   uvm_config_db#(unsigned int)::set(this, "env.i_agt.sqr.main_phase", "default_sequence.max_sequence_count", 20);
11.	            uvm_config_db#(uvm_object_wrap)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", seq_lib::type_id::get());
12.	        endfunction:build_phase
13.	
14.	 endclass

上述代码执行,会将sequence_library的select_mode设置为UVM_SEQ_LIB_RANDC模式,然后设定最大seq_count为20,最小seq_count为5,也就是发送sequence的数量介于5到20之间的随机值。

3.1 通过sequence library cfg控制sequence library的参数

事实上,除了通过config_db的方式设定sequence_library的两个主要的参数之外,还可以通过sequence library cfg进行归一化设定,sequence library cfg在uvm中的源码为:

其内部包含的主要变量就是selection_mode,min_random_count和max_random_count,可以看到在new函数中,可以直接设定这三个参数,实现参数的传递,在tc中,实例化uvm_sequence_library_cfg,然后通过new函数实现参数配置,再通过config_db的方式传递cfg,也可以实现对sequence_library参数的控制。

1.	 class my_tc extends base_test;
2.	       my_seq_library0  seq_lib;
3.	              uvm_sequence_library_cfg seq_lib_cfg;
4.	       `uvm_component_utils(my_tc)
5.	 ......
6.	       virtual function void build_phase(uvm_phase phase);
7.	            super.build_phase(phase);
8.	            seq_lib = my_seq_library0::type_id::create("seq_lib");
9.	            seq_lib_cfg = new("seq_lib_cfg", UVM_SEQ_LIB_RANDC, 5, 20);
10.	            uvm_config_db#(uvm_object_wrap)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", seq_lib::type_id::get());
11.	            uvm_config_db#(uvm_sequence_library_cfg)::set(this, "env.i_agt.sqr.main_phase", "default_sequence.config", seq_lib_cfg);
12.	        endfunction:build_phase
13.	
14.	 endclass

 

3.2 实现控制sequence library参数的几种方法

       配置sequence_library的三个参数:select_mode,min_sequence_count,max_sequence_count的方式,可以通过在tc中利用config_db的方式传递值,也可以通过uvm_sequence_library_cfg的方式,在new函数中直接传递值,然后利用uvm_config_db将cfg传递给default_sequence.config,实现这三个参数的控制。

       实际上,因为这三个参数都是uvm_sequence_library基类的成员变量,tc中启动sequence_library之前,可以直接对这三个值进行赋值,也可以实现对参数的控制,例如如下tc代码:

1.	class my_tc extends base_test;
2.	       my_seq_library0  seq_lib;
3.	       `uvm_component_utils(my_tc)
4.	 ......
5.	       virtual function void build_phase(uvm_phase phase);
6.	            super.build_phase(phase);
7.	            seq_lib = my_seq_library0::type_id::create("seq_lib");
8.	            seq_lib.select_mode=UVM_SEQ_LIB_ITEM;
9.	            seq_lib.min_sequence_count = 2;
10.	            seq_lib.max_sequence_count = 20;
11.	            uvm_config_db#(uvm_sequence_library_cfg)::set(this, "env.i_agt.sqr.main_phase", "default_sequence.config", seq_lib_cfg);
12.	       endfunction:build_phase
13.	......
14.	endclass

或者在main_phase中调用start函数之前,对seq_lib进行赋值:

1.	class my_tc extends base_test;
2.	       my_seq_library0  seq_lib;
3.	       `uvm_component_utils(my_tc)
4.	 ......
5.	       virtual function void build_phase(uvm_phase phase);
6.	            super.build_phase(phase);
7.	            seq_lib = my_seq_library0::type_id::create("seq_lib");
8.	            ......
9.	            //uvm_config_db#(uvm_sequence_library_cfg)::set(this, "env.i_agt.sqr.main_phase", "default_sequence.config", seq_lib_cfg);
10.	       endfunction:build_phase
11.	
12.	       virtual task main_phase(uvm_phase phase);
13.	            super.main_phase(phase);
14.	            seq_lib.starting_phase = phase;
15.	            seq_lib.select_mode=UVM_SEQ_LIB_RANDC;
16.	            seq_lib.min_sequence_count = 2;
17.	            seq_lib.max_sequence_count = 20;
18.	            seq_lib.start(env.vseq.my_sqr, null, -1);
19.	       endtask:main_phase
20.	......
21.	endclass

这里对sequence_library的参数控制方法进行总结:

  • 首先可以通过uvm_config_db的方式直接传输这三个参数,参数传输的时候注意uvm_config_db参数化类的参数类型,以及“密钥”的类型(使用default_sequence.xxx)。
  • 其次可以通过例化uvm_sequence_library_cfg的方式,在构造函数new中直接传递这三个变量。然后通过uvm_config_db的方式将cfg传输。

最后,可以通过层次化的方式直接赋值,即seq_lib.xxx直接赋值的方式,可以在default_sequence启动之间赋值,也可以在调用start函数之前赋值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UVM基础-sequence library 的相关文章

  • Quartus II 安装

    本次介绍使用的 Quartus 版本为 10 1 目前 Quartus II 官网已经没有 13 1 以下版本的安装包 大家可以安装 13 1 以上版本的软件 功能都是大同小异 下载地址 FPGA Software Download Cen
  • DDR3学习总结(一)

    简介 DDR3 SDRAM常 简称 DDR3 是当今较为常见的一种储存器 在计算机及嵌入式产品中得到广泛应用 特别是应用在涉及到大量数据交互的场合 比如电脑的内存条 对DDR3的读写操作大都借助IP核来完成 本次实验将采用 Xilinx公司
  • STM32【复习串口】

    串口复习加深理解笔记 杂谈 USART FLAG TXE发送缓冲区空标志 说明可以往数据寄存器写入数据了 但并不代码数据发送完成了 USART FLAG TC发送完成标志 这个才是代表USART在缓冲区的数据发送完成了 即从机接收到了数据
  • 数字芯片流程

    芯片设计分为前端设计和后端设计 前端设计 逻辑设计 和后端设计 物理设计 并没有同意严格的界限 这个过程中涉及到了与工艺有关的设计就是后端设计 一 需求分析 产品需要解决的问题 预测3 5年的趋向和走势 确保前瞻性 确保芯片是有卖点的 客户
  • Verilog的奇技淫巧[更新中]

    1 Verilog常用的数据选择语句vect a b 或vect a b 转载自 MDY常用的数据选择语句Verilog明德扬论坛 Powered by Discuz vect为变量名字 a为起始位置 加号或者减号代表着升序或者降序 b是进
  • HDLBits — Verilog Practice(每日一题)

    HDLBits Verilog Practice 每日一题 一 Getting Started 1 Getting Started 一 Getting Started 1 Getting Started 问题描述 Build a circu
  • J-Link仿真器与JTAG和SWD下载与接线

    目录 1 JTAG 1 1JTAG今天被用来主要的三大功能 1 2JTAG引脚 1 3可选引脚 2 SWD 2 1 SWD引脚 2 2 可选择引脚 2 3 JTag和SWD模式引脚定义 3 J Link仿真器 4 IAR与MDK配置两种下载
  • 关于Keil中Memory中观察不到数据变化的问题以及启动文件栈的初始化

    关于Keil中Memory中观察不到数据变化的问题 在KEIL中观察Memory数据变化 一定要记得只能在RAM地址或ROM之内观察 如下图所示 RAM的地址设置在地址为0x20000000开始的地方 大小为0x20000 因此只有在这个范
  • MOS管的知识,看这一篇就可以了

    转载 21ic电子网 2020 11 15 18 19 以下文章来源于记得诚电子设计 作者记得诚 记得诚电子设计 分享电子硬件知识 永远相信美好的事情即将发生 今天的文章简单总结一下MOS管 如下是本文目录 场效应管分类 场效应管分为结型
  • 数码管电子时钟

    文章目录 前言 一 回顾数码管 二 任务描述 三 系统框图 四 模块调用 五 模块原理图 六 工程源码 6 2 时钟计数模块代码 6 2 数码管驱动模块代码 6 3 顶层模块代码 七 仿真测试 7 1 测试代码 7 2 仿真结果 八 管脚信
  • FIFO读写控制

    如果在两个模块之间传输数据 两个模块之间的处理速率不同 会导致采集数据的遗漏或错误 在他们之间加一个数据缓存器 所有数据先经过缓存器缓存 再输入数据接送模块 创建两个模块 一个 作为发送模块 一个作为接受模块 发送模块检测到 fifo为空开
  • 【Xilinx DDR3 MIG】Xilinx FPGA DDR3读写实验相关用户接口引脚解释

    目录 DDR3读写实验 实验框图 时钟模块 DDR3读写及LED指示模块 MIG IP核 用户接口解释
  • 【DDR3 控制器设计】(3)DDR3 的写操作设计

    写在前面 本系列为 DDR3 控制器设计总结 此系列包含 DDR3 控制器相关设计 认识 MIG 初始化 读写操作 FIFO 接口等 通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等 附上汇总博客直达链接 DD
  • 蓝桥杯真题:迷宫

    目录 题目描述 运行限制 dfs bfs 结果 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 下图给出了一个迷宫的平面图 其中标记为 11 的为障碍 标记为 00 的为可以通行的地方 010000 000
  • 基于FPGA的AHT10传感器温湿度读取

    文章目录 一 系统框架 二 i2c接口 三 i2c控制模块 状态机设计 状态转移图 START INIT CHECK INIT IDLE TRIGGER WAIT READ 代码 四 数据处理模块 串口 代码 五 仿真 testbench设
  • 【FPGA】通俗理解从VGA显示到HDMI显示

    注 大部分参考内容来自 征途Pro FPGA Verilog开发实战指南 基于Altera EP4CE10 2021 7 10 上 贴个下载地址 野火FPGA Altera EP4CE10征途开发板 核心板 野火产品资料下载中心 文档 hd
  • 【电子技术】什么是LFSR?

    目录 0 前言 1 数学基础 1 1 逻辑异或 1 2 模2乘法 和 模2除法 2 线性反馈移位寄存器LFSR 3 抽头和特征多项式 4 阶线性反馈移位寄存器实例 0 前言 线性反馈移位寄存器 Linear Feedback Shift R
  • 硬核 | 从零制作一个激光雷达需要多久?

    编辑 ADS智库 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 硬件交流 技术交流群 本文只做学术分享 如有侵权 联系删文 激光雷达 LiDAR 是激光探测及测距系统的简称 目前广泛应用在无
  • [Verilog] Verilog 基本格式和语法

    主页 元存储博客 全文 3000 字 文章目录 1 声明格式 1 1 模块声明 1 2 输入输出声明 1 3 内部信号声明 1 4 内部逻辑声明
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二

随机推荐

  • python nltk下载_Python-如何下载NLTK数据?

    小编典典 要下载特定的数据集 模型 请使用nltk download 函数 例如 如果你要下载punkt句子标记器 请使用 python3 gt gt gt import nltk gt gt gt nltk download punkt
  • cocos2dx opengl入门系列一-序言

    入门序言 在开始这个系列之前有必要说明一下这个系列的结构 系列会从最简单的opengl画三角形 gt 再画四边形 gt 显示一个纹理 gt 显示多重纹理 完 就是这样简单直接 好吧 这么简单的原因是本人水平有限 还有一个原因是cocos2d
  • 屏的接口类型种类以及接口定义分析

    一 屏的接口类型大致有 1 SPI SPI 采用较少 连线为CS SLK SDI SDO四根线 连线少但是软件控制比较复杂 一般用于低速黑白小尺寸屏 2 I2C I2C一般用于低速黑白小尺寸屏 3 CPU 在功能机上用的多 4 RGB 大屏
  • Markdown高级

    Markdown高级 警告 Markdown 未正式支持的解决方法 概述 大多数使用 Markdown 的人会发现基本和扩展的语法元素可以满足他们的需求 但很有可能 如果你使用 Markdown 的时间足够长 你会不可避免地发现它不支持你需
  • 微信小程序报错 Error: errCode: -1

    如果你是因为请求云数据库内的数据 那就是权限问题 解决方法如下 勾选 所有用户可读 仅创建者可读写 如果你需要让所有用户都可读写那要怎么办呢 答案是创建云函数 调用云函数写入数据库 因为云函数就是创建者权限
  • RISC-V IDE MRS使用笔记(三):提升浮点计算效率

    RISC V IDE MRS使用笔记 三 提升浮点计算效率 MRS内置CH32V30X系列芯片 此系列芯片支持FPU 浮点计算单元 想要打开时需要开启相应的扩展 如下图所示 此时如果编译单精度类型的浮点变量 就会启用FPU进行浮点计算 提高
  • windows 64位 安装mvn提示 不是内部或外部命令

    在安装mvn的过程中当在mvn的目录下去执行mvn命令的时候是可以正常执行的 当设置好环境变量后执行后发现提示mvn不是内部命令 原因是设置的MAVEN HOME变量未被Path解析 解决办法是 直接把path中的 MAVEN HOME b
  • vue子组件弹窗 el-dialog

    弹窗 在vue中结合elementui 在父组件中通过点击事件 控制子组件弹窗显示 将父组件的值通过props的方式传递给子组件弹窗 子组件通过computed的方式来获取值和设置新值 在set中调用 emit update porp 方法
  • 51nod 1165 整边直角三角形的数量(两种解法)

    链接 http www 51nod com Challenge Problem html problemId 1165 直角三角形 三条边的长度都是整数 给出周长N 求符合条件的三角形数量 例如 N 120 共有3种不同的满足条件的直角3角
  • Understanding and Detecting Software Upgrade Failures in Distributed Systems

    分布式系统中的升级故障 Tips 摘要 介绍 方法论 升级故障的严重程度 升级故障的根本原因 升级故障的触发因素 测试和检测升级故障 未来研究方向 相关工作和总结 后记 Tips 作者主页 论文下载地址 摘要 升级是破坏分布式系统可用性的不
  • iOS内购(IAP,In App Purchases-在APP内部支付),设置及使用

    项目中使用到了中间货币 金币 的形式来进行功能使用 模式是使用RMB换成 金币比如 1RMB 10金币 所以会集成第三方的支付平台 使用了微信和支付宝的第三方平台过后 发现审核失败 被苹果拒绝 查了一查原因 才是因为苹果对app内的中间币的
  • 分支语句简单讲

    分支语句之if语句 if 表达式 语句1 else 语句2 if语句中if else后默认只有一条语句 若要跟多条语句 要用 把语句括起来 例如下面 if age lt 18 printf 未成年 n printf 不能喝酒 n else
  • 如何开发kanzi插件,越详细越好

    开发Kanzi插件需要使用Kanzi SDK 它提供了一系列工具和技术 可以帮助开发者实现自己的设想 并将其应用在Kanzi上 首先 我们需要从Kanzi官网上下载Kanzi SDK 然后使用IDE 如Visual Studio或Eclip
  • Python代码规范:企业级代码静态扫描-代码规范、逻辑、语法、安全检查,以及代码规范自动编排(1)

    适用于企业实际使用Python或Python框架 Tornado Django Flask等 开发的项目作为扫描目标 进行代码规范 逻辑 语法 安全检查 代码风格规范主要有几个方面 命名规范 语言规范 格式规范 其中大部分命名规范和语言规范
  • rabbitmq命令小记录

    rabbitmq学习的一些链接 http blog csdn net anzhsoft article details 19563091 检查是否有内存泄露 sudo rabbitmqctl list queues name message
  • JAVA毕业设计课设源码分享50+例

    1 基于Springboot员工薪资管理系统 2 基于server jsp智能化停车场管理系统 3 基于SSM网上点餐系统 4 基于springboot商城购物系统 5 基于springboot中小学教务管理系统 6 基于springboo
  • 如何搭建测试环境

    1 首先检查环境和本地网络是否正确 环境就是检查系统版本是否符合开发要求 系统与本地是否能连接 2 找开发要软件包 安装数据库和服务器 把压缩包拖入 或rz 一键安装或单个yum install 3 上传项目包 确认上传的路径 文档 开发
  • vs更换本地git账号

    有人认为vs中用的git账号是哪个无所谓 其实不然 git账号不同 访问的权限就不一样 那么如果想跟换git账号该怎么做呢 win7 控制面板 gt 用户帐户和家庭安全 gt 凭据管理器 编辑普通凭据中的git账号或者直接删除 然后重启vs
  • rdesktop架构解析(RDP协议分析)

    转载自 http blog csdn net songbohr article details 5309650 本文立足于rdesktop的架构层次进行解析 算是抛砖引玉 国内对RDP协议深入解析的资料到本文发布时为空白 ps 昨天在nok
  • UVM基础-sequence library

    一 sequence library的用法 1 1 sequence library在环境中的使用 uvm sequence library定义为是一堆sequence的集合 本质上其实就是uvm sequence 只不过在普通的uvm s