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 的相关文章

  • FPGA零基础学习之Vivado-ROM使用教程

    FPGA零基础学习之Vivado ROM使用教程 本系列将带来FPGA的系统性学习 从最基本的数字电路基础开始 最详细操作步骤 最直白的言语描述 手把手的 傻瓜式 讲解 让电子 信息 通信类专业学生 初入职场小白及打算进阶提升的职业开发者都
  • 各种FIFO硬件设计(FIFO概念、异步、同步、非2次幂深度FIFO)

    文章目录 一 FIFO概述 二 FIFO分类 三 FIFO重要信号与参数 3 1 信号 3 2 参数 3 2 1 data depth的确定 四 FIFO存储原理 五 同步FIFO 5 1 空满信号判断 5 2 同步FIFO源码 5 3 测
  • 【Xilinx Vivado时序分析/约束系列6】FPGA开发时序分析/约束-IO时序输入延时

    目录 源同步FPGA输入时序分析的模型 input delay约束 极限input delay 往期系列博客 源同步FPGA输入时序分析的模型 以下为源同步FPGA输入时序分析的模型的示意图 在之前的文章中介绍过 在此介绍一下各个时钟延时的
  • Vivido添加pynq-Z2开发板

    一 下载pynq z2开发板文件 下载地址 https www tulembedded com FPGA ProductsPYNQ Z2 html 二 将下载的文件解压到vivado安装的位置 如果boards目录下面没有boards fi
  • modelsim 关联 notepad++

    modelsim 控制窗口敲入 1 proc external editor filename linenumber exec I notepad notepad exe filename 2 set PrefSource altEdito
  • 【科普】波特率和比特速率的理解

    什么是波特率 单位时间内传输的码元个数称为波特率 单位为 Baud 那码元又是什么呢 码元又称为 符号 即 symbol 维基百科上对码元的解释 持续一段固定时间的通信信道有效状态就是码元 这么解释比较抽象 可以解释码元的物理意义 在通信信
  • Matlab 高斯信道下QPSK通带通信系统的简单仿真

    1 原理 2 仿真 3 总结反思 4 参考资料 1 原理 QPSK的具体内容请参考百度 QPSK的调制jie框图大致如下 QPSK信号可以采用正交调制的方式产生 如第一张图片的左半部分 I路信号与cos 信号相乘 Q 路信号与sin信号相乘
  • verilog中wire和reg类型的区别

    module counter parameter CNT MAX 25 d24 999 999 input wire sys clk input wire sys rst n output reg led out reg 24 0 cnt
  • 上拉电阻和下拉电阻

    一 定义 上拉电阻 将一个不确定的信号 通过一个电阻与电源VCC相连 固定在高电平 下拉电阻 将一个不确定的信号 通过一个电阻与地GND相连 固定在低电平 二 作用 提高输出信号驱动能力 确定输入信号电平 防干扰 限流 阻抗匹配 抗回波干扰
  • FIFO读写控制

    如果在两个模块之间传输数据 两个模块之间的处理速率不同 会导致采集数据的遗漏或错误 在他们之间加一个数据缓存器 所有数据先经过缓存器缓存 再输入数据接送模块 创建两个模块 一个 作为发送模块 一个作为接受模块 发送模块检测到 fifo为空开
  • Verilog实现两路组相联cache

    cache代码 timescale 1ns 1ps cache共32块 分为16组 每组2块 即两路组相联 1块 4字 1字 4字节 主存共1024块 4096个字 主存地址共12位 1 0 为块内偏移 5 2 为组地址 11 6 为Tag
  • 关于xilinx BRAM IP的延迟以及流程

    关于RAM IP的延迟 1 选择了output registers 可以在RAM输出端口添加register 也可以在core的输出添加 在primitives添加 降低clock to out到primitive的延迟 在core添加re
  • 八段数码管动态显示(输入数据为BCD编码)

    八段数码管动态显示 输入数据为BCD编码 一 数码管概述 图1 八段共阴数码管内部等效原理图 图2 八段共阳数码管内部等效原理图 上面两图分别是对应八段共阴 共阳的数码管内部等效图 共阴是将八个LED数码管的阴极连接在一起接低 阳极segm
  • 【数字IC】从零开始的Verilog SPI设计

    从零开始的Verilog SPI协议设计 一 写在前面 1 1 协议标准 1 2 数字IC组件代码 1 3 设计要求 1 4 其他协议解读 1 4 1 UART协议 1 4 2 SPI协议 1 4 3 I2C协议 1 4 4 AXI协议 二
  • [从零开始学习FPGA编程-28]:进阶篇 - 基本组合电路-奇偶校验生成器(Verilog语言版本)

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 目录 第1章 奇偶校验生成器 1 1 什么是奇校验 1 2 Verilog语言描述
  • 【FMC141】基于VITA57.4标准的4通道2.8GSPS 16位DA播放子卡(2片DAC39J84)

    FMC141是一款基于VITA57 4标准的4通道2 8GSPS 2 5GSPS 1 6GSPS采样率16位DA播放FMC子卡 该板卡为FMC 标准 符合VITA57 4与VITA57 1规范 16通道的JESD204B接口通过FMC 连接
  • 硬核 | 从零制作一个激光雷达需要多久?

    编辑 ADS智库 点击下方 卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 硬件交流 技术交流群 本文只做学术分享 如有侵权 联系删文 激光雷达 LiDAR 是激光探测及测距系统的简称 目前广泛应用在无
  • 无线网络管理系统与无线路由器的区别

    第5章 波形发生器软件设计 本章我们将介绍系统的软件设计 系统中控制软件占有很重要的地位 它不仅要产生波形数据 控制波形的发生 还要控制显示电路和键盘电路 因此系统软件的好坏直接决定着系统的功能和稳定 5 1软件的总体结构 在本系统中 由于
  • MINI-UTDE 10 BASE-T 集成控制器

    MINI UTDE 10 BASE T 集成控制器 MINI UTDE 10 BASE T 拥有多达三个本地I O板和远程I OS总线通信 为用户提供了一系列生产单元功能的单一控制点 包括诸如夹头 反馈器和辅助机器等外围生产设备 支持所有主
  • DSCA190V 57310001-PK

    DSCA190V 57310001 PK DSCA190V 57310001 PK 具有两个可编程继电器功能 并安装在坚固的 XP 外壳中 DSCA190V 57310001 PK 即可使用 只需最少的最终用户校准 DSCA190V 573

随机推荐

  • 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