SV学习笔记(六)

文章目录

  • 覆盖率类型
    • 写在前面
    • 代码覆盖率
    • 断言覆盖率
    • 功能覆盖率
    • 漏洞率曲线
  • 功能覆盖策略
    • 收集信息而非数据
    • 只测量需要的内容
    • 验证的完备性
  • 覆盖组
    • 写在前面
    • 在类里定义covergroup
  • 数据采样
    • 写在前面
    • coverpoint和bin
    • bin的创建和应用
    • 命名coverpoint和bin
    • 条件覆盖率
    • 翻转覆盖率
    • wildcard覆盖率
    • 忽略bin
    • 非法的bin
    • 交叉覆盖率
    • 排除部分cross bin
    • 指定精细的交叉覆盖率
  • 覆盖选项
    • 单个实例的覆盖率
    • 注释
    • 覆盖次数限定
    • 覆盖率目标
    • covergroup方法
  • 数据分析
  • 参考资料

覆盖率类型

写在前面

  • 覆盖率是 衡量设计验证完备性 的一个通用词。
  • 随着测试逐步覆盖各种合理的场景,仿真过程会慢慢勾画出你的设计情况。
  • 覆盖率工具会 在仿真过程中收集信息 ,然后进行后续处理并且得到覆盖率报告。
  • 通过这个报告找出覆盖之外的盲区,然后修改现有的测试或者创建新的测试来填补这些盲区。
  • 这个过程可以一直迭代进行,直到你对覆盖率满意为止。
    • 可以使用一个反馈回路来分析覆盖率的结果,并决定采取哪种行动来达到100%的覆盖率。
    • 首要的选择是使用更多的种子来运行现有的测试程序
    • 大量种子依然对于覆盖率增长没有帮助时,需要建立新的约束。
    • 只有在确实需要的时候才会求助于创建定向测试。

代码覆盖率

  • 不添加任何额外的HDL代码,工具会通过分析源代码和增加隐藏代码来自动完成代码覆盖率的统计。

  • 当运行完所有测试,代码覆盖率工具便会创建相应的数据库。

  • 仿真器都带有代码覆盖率的工具,覆盖率数据也可被转换为可读格式。

  • 行覆盖率:多少行代码已经被执行过。

  • 路径覆盖率:在穿过代码和表达式的路径中有哪些已经被执行过。

  • 翻转覆盖率:哪些单位比特变量的值为0或1。

  • 状态机覆盖率:状态机哪些状态和状态转换已经被访问过。

  • 代码覆盖率最终的结果用于衡量你执行了设计中的多少代码。

  • 关注点应该放在设计代码的分析上,而不是测试平台。

  • 未经测试的设计代码里可能隐藏硬件漏洞,也可能仅仅就是冗余的代码。

  • 代码覆盖率衡量的是测试对于硬件设计描述的”实现”究竟测试得有多彻底,而非针对验证计划。

  • 代码覆盖率达到了100%,并不意味着验证的工作已经完成,但代码覆盖率100%是验证工作完备性的必要条件。

断言覆盖率

  • 断言是用于一次性地或在一段时间对一个或者多个设计信号在逻辑或者时序上的声明性代码。
  • 断言可以跟随设计和测试平台一起仿真,也可以被形式验证工具所证实。
  • 你可以使用SV的程序性代码编写等效性检查, 但使用SVA(SV断言)来表达会更容易。
  • 断言最常用于查找错误,例如两个信号是否应该互斥,或者请求与许可信号之间的时序等。
  • 一旦检测到问题,仿真就可以立即停止。
  • 有些断言可以用于查找感兴趣的信号值或者设计状态。
  • 可以使用cover property来测量这些关心的信号值或者状态是否发生。
  • 在仿真结束时,仿真工具可以自动生成断言覆盖率数据。
  • 断言覆盖率数据以及其它覆盖率数据都会被集成在同一个覆盖率数据库中,verifier可以对其展开分析。

功能覆盖率

  • 验证的目的就是确保设计在实际环境中的行为正确。
  • 功能描述文档详细说明了设计应该如何运行,而验证计划则列出了相应的功能应该如何激励、验证和测量。
  • 当你收集测量数据希望找出那些功能已经被覆盖时,你其实就是在计算”设计”的覆盖率。
  • 功能覆盖率是和功能设计意图紧密相连的,有时也被称为”描述覆盖率”,而代码覆盖率则是衡量设计的实现情况。
  • 某个功能在设计中可以被遗漏,代码覆盖率不能发现这个错误,但是功能覆盖率可以。

  • 每一次仿真都会产生一个带有覆盖率信息的数据库,记录随机游走的轨迹。
  • 把这些信息全部合并在一起就可以得到功能覆盖率,从而衡量整体的进展程度。
  • 通过分析覆盖率数据可以决定如何修改回归测试集。
  • 如果覆盖率在稳步增长,那么添加新种子或者加长测试实际即可。
  • 如果覆盖率增速放缓,那么需要添加额外的约束来产生更多”有意思”的激励。
  • 如果覆盖率停止增长,然而设计某些测试点没有被覆盖到,那么就需要创建新的测试了。
  • 如果覆盖率为100%但依然有新的设计漏洞,那么覆盖率可能没有覆盖到设计中的某些设计功能区域。

漏洞率曲线

  • 在一个项目实施期间,你应该保持追踪每周有多少个漏洞被发现。
  • 一开始,当你创建测试程序时,通过观察可能就会发现很多漏洞。
  • 当设计逐渐稳定时,你需要利用自动化的检查方式来协助发现可能的漏洞。
  • 在设计临近流片时,漏洞率会下降,甚至有望为零。即便如此,验证工作仍然不能结束。
  • 每次漏洞率下降时,就应该寻找各种不同的办法去测试可能的边界情况(corner case)。
  • 漏洞率可能每周都有变化,这跟很多因素都有关。不过漏洞率如果出现意外的变化,可能预示着潜在的问题。

功能覆盖策略

收集信息而非数据

  • 比如MCDF, 你需要关心的是合法的寄存器地址和非法的寄存器地址,可写的寄存器域和非法的寄存器域,而不是具体的寄存器地址数值
  • 一旦关注的地方着眼于感兴趣的状态,而不是具体数值,那么这对于你如何定义功能覆盖率,以及如何收集信息会减轻很大的负担。
  • 设计信号如果数量范围太大,应该拆分为多个小范围再加上边界情况。

只测量需要的内容

  • Verifier需要懂得, 在使能覆盖率收集时, 这一特性会降低很大的仿真性能。
  • 由于收集功能覆盖率数据的开销很大,所以应该只测量你会用来分析并且改进测试的那部分数据。
  • 同时也需要设定合理的覆盖率采样的事件一方面提升采样效率,一方面也可以降低收集覆盖率的开销。

验证的完备性

  • 完备的覆盖率测量结果和漏洞增长曲线,可以帮助确认设计是否被完整地验证过。
  • 如果代码覆盖率低但功能覆盖率高,这说明验证计划不完整,测试没有执行设计的所有代码。
  • 如果代码覆盖率高但功能覆盖率低,这说明即使测试平台很好地执行了设计所有代码,但是测试还是没有把设计定位到所有感兴趣的状态上。
  • 你的目标是同时驱动高的代码覆盖率和功能覆盖率。

覆盖组

写在前面

  • 覆盖组(covergroup) 与类相似, 一次定义后便可以多次实例化。
  • covergroup可以包含一个或者多个coverpoint, 且全都在同一时间采集。
  • covergroup可以定义在类中,也可以定义在interface或者module中。
  • covergroup可以采样任何可见的变量,例如程序变量、接口信号或者设计端口。
  • 一个类里可以包含多个covergroup。
  • 当你拥有多个独立的covergroup时, 每个covergroup可以根据需要自行使能或者禁止。
  • 每个covergroup可以定义单独的触发采样事件,允许从多个源头收集数据。
  • covergroup必须被例化才可以用来收集数据。

在类里定义covergroup

class Transactor;Transaction tr;mailbox mbx_in;covergroup CovPort;coverpoint tr.port;endgroupfunction new(mailbox mbx_in) ;//CovPort = new() ;CovPort cg1 = new() ; //使用这种例化方式可以给对象设定名字this.mbx_in=mbx_in;endfunctiontask main;forever begintr=mbx_in.get;ifc.cb.port <= tr.port;ifc.cb.data <= tr.data;CovPort.sample() ;endendtask
endclass

白话一刻

  • Transaction tr;:定义一个类型为Transaction的变量tr,用来存储事务对象。

  • mailbox mbx_in;:定义一个mailbox类型的变量mbx_in,通常用于在模拟环境中作为消息队列或通道。

  • covergroup CovPort;:定义一个覆盖组CovPort,用于收集覆盖信息,常用于验证测试中。

  • coverpoint tr.port;:在CovPort覆盖组内定义一个覆盖点,用于监控tr对象的port字段的取值情况。

    function new(mailbox mbx_in) ;这是Transactor类的构造函数,当创建Transactor对象时会被调用。

  • CovPort cg1 = new() ;:创建一个新的CovPort覆盖组实例,并命名为cg1

  • this.mbx_in=mbx_in;:将传递给构造函数的mbx_in参数赋值给类的成员变量mbx_in

  • tr=mbx_in.get;:从mbx_in邮箱中获取一个事务对象,并赋值给tr

  • ifc.cb.port <= tr.port;ifc.cb.data <= tr.data;:将tr对象中的portdata字段的值分别赋给ifc.cb(可能是一个接口或组件)的portdata字段。

  • CovPort.sample() ;:对覆盖组CovPort进行采样,以收集覆盖信息。

这个Transactor类主要用于从mailbox中接收事务对象,将事务对象的数据写入某个接口或组件,并收集相关的覆盖信息。

  • covergroup由采样的数据和数据被采样的事件构成。
  • 当这两个条件都准备好以后,测试平台便会触发covergroup。
  • 这个过程可以通过直接使用sample() 函数完成, 也可以在covergroup中采样阻塞表达式或者使用wait或@实现在信号或事件上的阻塞。
  • 如果你希望在代码中显式地触发covergroup采样, 或者不存在采样时刻的信号或事件, 又或者一个covergroup被例化为多个实例需要单独触发, 那么可以使用sample()方法。
  • 如果你想借助已有的事件或者信号触发covergroup, 可以在covergroup声明中使用阻塞语句。
event trans_ready;
covergroup CovPort @(trans_ready);coverpoint ifc.cb.port;
endgroup
  • 与直接调用sample() 相比, 使用事件触发的好处在于你能够借助已有的事件。

数据采样

写在前面

  • 当你在coverpoint指定采样一个变量或表达式时, SV会创建很多的”仓(bin) ”来记录每个数值被捕捉到的次数。
    这些bin是衡量功能覆盖率的基本单位。
  • covergroup中可以定义多个coverpoint, coverpoint中可以自定义多个cover bin或者SV帮助自动定义多个cover bin(建议自己定义,原因有两点:一是工具可能会多定义其他的bin,二是工具定义的bin不能很好的命名,基于这两点,自己定义bin在覆盖率分析时更容易)。
  • 每次covergroup采样, SV都会在一个或者多个cover bin中留下标记, 用来记录采样时变量的数值和匹配的cover bin。
  • 在仿真之后,可以使用分析工具读取这些数据库来生成覆盖率报告,包含了各部分和总体的覆盖率。

coverpoint和bin

  • 为了计算一个coverpoint上的覆盖率, 首先需要确定可能数值的个数,这也被称为域。
  • 覆盖率就是采样值的数目除以bin的数目。例如一个3比特变量的域是0:7, 正常情况下会自动分配8个bin。如果仿真过程中有7个值被采样到, 那么最终该coverpoint的覆盖率是7/8。
  • 所有的coverpoint的覆盖率最终构成一个covergroup的覆盖率。
  • 所有的covergroup的覆盖率构成了整体的功能覆盖率。

bin的创建和应用

  • SV会默认为某个cover point创建bin, 用户也可以自己定义bin的采样域。
  • 如果采样变量的域范围过大而又没有指定bin, 那么系统会默认分配64个bin, 将值域范围平均分配给这64个bin。
  • 用户可以通过covergroup的选项auto_bin_max来指定自动创建bin的最大数目(默认64)。
  • 实际操作中, 自动创建bin的方法不实用, 建议用户自行定义bin,或者减小auto_bin_max的数值。
covergroup CovPort;options.auto_bin_max=8; //所有cover point auto_bin数量=8coverpoint tr.port{options.auto_bin_maxm 2; } //特定cover point auto_bin数量=2
endgroup

命名coverpoint和bin

covergroup CovKind;coverpoint tr.kind{bins zero=(0) ; //1个仓代表kind==0bins lo=([1:3] , 5) ; //1个仓代表1:3和5bins hi[] =([8:S] 1; //8个独立的仓代表8:15bins misc=default; //1个仓代表剩余的所有值}//没有分号
endgroup
  • 注意coverpoint定义使用{} 而不是begin…end。大括号的结尾没有带分号, 这和end一样。

条件覆盖率

  • 可以使用关键词iff给coverpoint添加条件。
  • 这种做法常用于在复位期间关闭覆盖以忽略不合理的条件触发。
  • 也可以使用start和stop函数来控制covergroup各个独立实例。
covergroup CoverPort;coverpoint port iff (!bus_if.reset);
endgroup//===========================================initial beginCovPort ck = new();#1ns;ck.stop();bus_if.reset=1;#100ns bus_if.reset=0;ck.start();ck.sample();
end

翻转覆盖率

  • coverpoint也可以用来记录变量从A值到B值的跳转情况。
  • 还可以确定任何长度的翻转次数。
covergroup CoverPort;coverpoint port {bins t1 = (0=>1), (0=>2), (0=>3);}
endgroup

wildcard覆盖率

  • 可以使用关键字wildcard来创建多个状态或者翻转。
  • 在表达式中,任何x,z或者?都会被当成0或1的通配符。
bit [2:0] port;
covergroup CoverPort;coverpoint port{wildcard bins even={3'b??0};wildcard bins odd={3'b??1}}
endgroup

忽略bin

  • 在某些coverpoint可能始终无法得到全部的域值。
  • 对于那些不计算功能的域值可以使用ignore_bins来排除, 最终它们并不会计入coverpoint的覆盖率。
bit[2:0] low_ports_0_5; //只使用数值0-5
covergroup CoverPort;coverpoint low_ports_0_5 {ignore_bins hi={[6, 7]}; //忽略数值6-7
endgroup

非法的bin

  • 有些采样值不仅应该被忽略,而且如果出现还应该报错。
  • 这种情况可以在测试平台中监测, 也可以使用illegal_bins对特定的bin进行标示。
bit[2:0] low_ports_0_5; //只是用数值0-5
covergroup CoverPort;coverpoint low_ports_0_5{illegal_bins hi={[6, 7]}; //如果出现6-7便报错}
endgroup

交叉覆盖率

  • coverpoint是记录单个变量或者表达式的观测值。
  • 如果想记录在某一时刻,多个变量之间值的组合情况,需要使用交叉(cross) 覆盖率。
  • cross语句只允许带coverpoint或者简单的变量名。
class Transaction;rand bit[3:0] kind;rand bit[2:0] port;
endclassTransaction tr;
covergroup CovPort;kind: coverpoint tr.kind; //kind是coverpoint名称port: coverpoint tr.port; //port是coverpoint名称cross kind, port;
endgroup

排除部分cross bin

  • 通过使用ignore bins、binsof和intersect分别指定coverpoint和值域, 这样可以清除很多不关心的cross bin。
covergroup Covport;port: coverpoint tr.port {bins port[] = {[O:$]};}kind: coverpoint tr.kind {bins zero = {0};bins lo   = {[1:3]};bins hi[] = {[8:$]};bins misc = default;}cross kind, port {ignore_bins hi = binsof(port) intersect {7};ignore_bins md = binsof(port) intersect {0} &&binsof(kind) intersect {[9:11]};ignore_bins lo = binsof(kind.lo);}
endgroup
  • 原来port有8个bin,kind有11个bin,正常cross会产生88个bin,通过ignore_bins,hi排除了11个,md排除了3个,lo排除了24个。具体自行分析。

指定精细的交叉覆盖率

  • 随着cross覆盖率越来越精细, 可能需要花费不少的时间来指定哪些bin应该被使用或者被忽略。
  • 更适合的方式是不使用自动分配的cross bin, 而自己声明感兴趣的cross bin。
  • 假如有两个随机变量a和b,它们带着三种感兴趣的状态,(a0,b0)、(a1、b0)和(b==1)。
class Transaction;rand bit a, b;
endclasscovergroup CrossBinNames;a: coverpoint tr.a {bins a0 = {0};bins a1 = {1};option.weight=0; } //不计算覆盖率b: coverpoint tr.b {bins b0 = {0};bins b1 = {1};option.weight=0; } //不计算覆盖率ab: cross a, b {bins aOb0 = binsof(a.a0) && binsof(b.b0);bins a1b0 = binsof(a.a1) && binsof(b.b0);bins b1   = binsof(b.bl);}
endgroup
class Transaction;rand bit a, b;
endclasscovergroup CrossBinsofIntersect;a: coverpoint tr.a {option.weight=0; } //Do nOt count this cover pointb: coverpoint tr.b {option.weight=0; } //Do nOt count this cover pointab: cross a, b {bins aOb0 = binsof(a) intersect{O} && binsof(b) intersect{O};bins alb0 = binsof(a) intersect{1} && binsof(b) intersect{O};bins b1 = binsof(b) intersect{1}; }
endgroup

覆盖选项

单个实例的覆盖率

  • 如果对一个covergroup例化多次, **那么默认情况下SV会将所有实例的覆盖率合并到一起。**如果需要单独列出每个covergroup实例的覆盖率,需要设置覆盖选项。
covergroup CoverLength;coverpoint tr.length;option.per_instance=l; //每个实例单独收集
endgroup

注释

  • 如果有多个covergroup实例, **可以通过参数来对每一个实例传入单独的注释。**这些注释最终会显示在覆盖率数据的总结报告中。
covergroup CoverPort(int lo, hi, string comment);option.comment = comment;option.per_instance = 1;coverpoint port {bins range= {[lo:hi]};}
endgroup...CoverPort cp_lo = new(0, 3, "Low port numbers");
CoverPort cp_hi = new(4, 7, "High port numbers" ;

覆盖次数限定

  • 默认情况下, 数值采样了1次就可以计入有效的bin。可以通过修改atleast来修改每个bin的数值最少的采样次数, 如果低于at_least数值, 则不会被计入bin中。
  • option.at_least可以在covergroup中声明来影响所有的coverpoint,也可以在coverpoint中声明来只影响该coverpoint下所有的bin。
  • 一般会使用默认的1,除非有特殊要求。

覆盖率目标

  • 一个covergroup或者一个coverpoint的目标是100%覆盖率。
  • 不过你也可以将其设置为低于100%的目标。这个选项只会影响覆盖率报告。
  • 一般会使用默认的100,除非有特殊要求。
covergroup CoverPort;coverpoint port;option.goal=90;
endgroup

covergroup方法

  • sample() : 采样。
  • get_coverage() /get_inst_coverage() : 获取覆盖率,返回0-100的real数值。
  • set_inst_name(string) : 设置cover group的名称。
  • start() /stop() : 使能或者关闭覆盖率的收集。

数据分析

  • 使用$get_coverage() 可以得到总体的覆盖率。
  • 也可以使用covergroup_inst.get_inst_coverage() 来获取单个covergroup实例的覆盖率。
  • 这些函数最实际的用处是在一个测试当中监测覆盖率的变化。
  • 如果覆盖率水平在一段时间之后没有提高,那么这个测试就应该停止。
  • 重启新的随机种子或者测试可能有望提高覆盖率。
  • 如果测试可以基于功能覆盖率采取一些深入的行动,例如重新限定随机的约束,那将是一件非常好的事情,但是这种测试很难编写。

参考资料

  • Wenhui’s Rotten Pen
  • SystemVerilog
  • chipverify

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/299162.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux——线程控制

目录 前言 一、线程创建 1.创建线程 2.线程传递结构体 3.创建多线程 4.收到信号的线程 二、线程终止 三、线程等待 四、线程分离 五、取消线程 六、线程库管理的原理 七、站在语言角度理解pthread库 八、线程的局部存储 前言 前面我们学习了线程概念和线程创建&…

C语言实现快速排序算法

1. 什么是快速排序算法 快速排序的核心思想是通过分治法&#xff08;Divide and Conquer&#xff09;来实现排序。 算法的基本步骤是: 1. 选择一个基准值&#xff08;通常是数组中的某个元素&#xff09;&#xff0c;将数组分成两部分&#xff0c;使得左边的部分所有元素都小于…

C和C++内存管理

目录&#xff1a; 一&#xff1a;C和C内存分布 二&#xff1a;C动态内存管理方式 三&#xff1a;C动态内存管理方式 四&#xff1a;operator new与operator delete函数 五&#xff1a;new和delete的实现原理 六&#xff1a;定位new表达式(placement-new) 七&#xff1…

ubuntu-server部署hive-part2-安装hadoop

参照 https://blog.csdn.net/qq_41946216/article/details/134345137 操作系统版本&#xff1a;ubuntu-server-22.04.3 虚拟机&#xff1a;virtualbox7.0 安装hadoop ​​​​​​下载上传 下载地址 https://archive.apache.org/dist/hadoop/common/hadoop-3.3.4/ 以root用…

用C/C++加Easyx实现俄罗斯方块游戏(爆肝4万字,完全免费)

前言 相信大家一定玩过俄罗斯方块这款小游戏&#xff0c;简单容易上手是老少皆宜的小游戏&#xff0c;今天大家就跟着我来实现这个小游戏吧&#xff01;让自己学的C语言有用武之地。 为了让俄罗斯方块的开发更为简单些&#xff0c;图像更为丰富&#xff0c;在这里就利用了Easyx…

设计模式总结-原型设计模式

原型设计模式 模式动机模式定义模式结构模式分析深拷贝和浅拷贝原型模式实例与解析实例一&#xff1a;邮件复制&#xff08;浅克隆&#xff09;实例二&#xff1a;邮件复制&#xff08;深克隆&#xff09; 模式动机 在面向对象系统中&#xff0c;使用原型模式来复制一个对象自…

vue使用iview导航栏Menu activeName不生效

activeName不生效 一、问题一、解决方案&#xff0c; 一、问题 根据ivew官网的提示&#xff0c;设置了active-name和open-names以后&#xff0c;发现不管是设置静态是数据还是设置动态的数据&#xff0c;都不生效 一、解决方案&#xff0c; 在设置动态名称的时候&#xff0c…

Centos7环境下安装MySQL8详细教程

1、下载mysql安装包 下载哪个版本&#xff0c;首先需要确定一下系统的glibc版本&#xff0c;使用如下命令&#xff1a; rpm -qa | grep glibc ​​​​​​​ 2、检查是否安装过mysql ps:因为以前用yum安装过&#xff0c;所以先用yum卸载。如果不是此方式或者没安装过则跳过…

基于SpringBoot Vue求职招聘系统

一、&#x1f4dd;功能介绍 基于SpringBoot Vue招聘系统的设计与实现 角色&#xff1a;管理员、企业、用户 管理员&#xff1a;管理员进入主页面&#xff0c;主要功能包括对个人中心、企业管理、用户管理、岗位类型管理、招聘信息管理、应聘记录管理、留言反馈、系统管理等进…

笛子基础入门

文章目录 1.符号2. 笛子指法说明3. 曲谱3.1 年轮3.2 生生世世爱 1.符号 笛子简谱&#xff1a;由七个基本数字组成&#xff08;1234567&#xff09;&#xff1b;高音在数字上面加一“.”&#xff0c;低音则在下面加一“.”&#xff0c;不加点则是中音&#xff1b;数字后面加横线…

Linux从入门到精通 --- 2.基本命令入门

文章目录 第二章&#xff1a;2.1 Linux的目录结构2.1.1 路径描述方式 2.2 Linux命令入门2.2.1 Linux命令基础格式2.2.2 ls命令2.2.3 ls命令的参数和选项2.2.4 ls命令选项的组合使用 2.3 目录切换相关命令2.3.1 cd切换工作目录2.3.2 pwd查看当前工作目录2.4 相对路径、绝对路径和…

基于MPPT的风力机发电系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1风能与风力发电机模型 4.2风力机功率特性与最大功率点 4.3 MPPT 5.完整工程文件 1.课题概述 基于MPPT的风力机发电系统simulink建模与仿真。MPPT使用S函数编写实现。基于最大功率点跟踪&#xff08…

日志服务 HarmonyOS NEXT 日志采集最佳实践

作者&#xff1a;高玉龙&#xff08;元泊&#xff09; 背景信息 随着数字化新时代的全面展开以及 5G 与物联网&#xff08;IoT&#xff09;技术的迅速普及&#xff0c;操作系统正面临前所未有的变革需求。在这个背景下&#xff0c;华为公司自主研发的鸿蒙操作系统&#xff08…

网络编程套接字应用分享【Linux C/C++ 】【UDP应用 | TCP应用 | TCP线程池小项目】

目录 前提知识 1. 理解源ip&#xff0c;目的ip和Macip 2. 端口号 3. 初识TCP&#xff0c;UDP协议 4. 网络字节序 5. socket 编程 sockaddr类型 一&#xff0c;基于udp协议编程 1. socket——创建套接字 2. bind——将套接字强绑定 3. recvfrom——接受数据 4. s…

基于jsp+Spring boot+mybatis的图书管理系统设计和实现

基于jspSpring bootmybatis的图书管理系统设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获…

【精品教程】护网HVV实战教程资料合集(持续更新,共20节)

以下是资料目录&#xff0c;如需下载&#xff0c;请前往星球获取&#xff1a; 01-HW介绍.zip 02-HTTP&Burp课程资料.zip 03-信息收集_3.zip 04-SQL注入漏洞_2.zip 05-命令执行漏洞.zip 06-XSS漏洞.zip 07-CSRF.zip 08-中间件漏洞.zip 09-SSRF.zip 10-XXE.zip 11-Java反序列…

攻防世界 wife_wife

在这个 JavaScript 示例中&#xff0c;有两个对象&#xff1a;baseUser 和 user。 baseUser 对象定义如下&#xff1a; baseUser { a: 1 } 这个对象有一个属性 a&#xff0c;其值为 1&#xff0c;没有显式指定原型对象&#xff0c;因此它将默认继承 Object.prototype。 …

彩虹聚合DNS管理系统,附带系统搭建教程

聚合DNS管理系统&#xff0c;可以实现在一个网站内管理多个平台的域名解析&#xff0c;目前已支持的域名平台有&#xff1a;阿里云、腾讯云、华为云、西部数码、CloudFlare。 本系统支持多用户&#xff0c;每个用户可分配不同的域名解析权限&#xff1b;支持API接口&#xff0…

CSS设置字体样式

目录 前言&#xff1a; 1.font-family&#xff1a; 2.font-style&#xff1a; 3.font-weight&#xff1a; 4.font-size&#xff1a; 5.font-variant&#xff1a; 6.font&#xff1a; 前言&#xff1a; 在网页中字体是重要的组成部分&#xff0c;使用好字体可以让网页更…

17.应用负载压力测试

早些点&#xff0c;下午题考&#xff0c;最近几年出现的少&#xff1b; 备考较为简单&#xff1b;历年真题相似度高&#xff1b; 主要议题&#xff1a; 1.负载压力测试概述 注意这些测试细微的差别&#xff1b; 负载测试和压力测试的方法比较相似&#xff0c;但是目的不同&a…