UVM中的phase机制

2023-10-28

5.1 phase机制
*5.1.1 task phase与function phase
UVM中的phase,按照其是否消耗仿真时间($time打印出的时间)的特性,可以分成两大类,一类是function phase,如build_phase、connect_phase等,这些phase都不耗费仿真时间,通过函数来实现;另外一类是task phase,如run_phase等,它们耗费仿真时间,通过任务来实现。给DUT施加激励、监测DUT的输出都是在这些phase中完成的。在图5-1中,灰色背景所示的是task
phase,其他为function phase。

上述所有的phase都会按照图中的顺序自上而下自动执行:

文件:src/ch5/section5.1/5.1.1/my_case0.sv
4 class my_case0 extends base_test;
5   string tID = get_type_name();
…
11   virtual function void build_phase(uvm_phase phase);
12     super.build_phase(phase);
13     `uvm_info(tID, "build_phase is executed", UVM_LOW)
14   endfunction
15
…
26   virtual function void start_of_simulation_phase(uvm_phase phase);
27     super.start_of_simulation_phase(phase);
28     `uvm_info(tID, "start_of_simulation_phase is executed", UVM_LOW)
29   endfunction
30
31   virtual task run_phase(uvm_phase phase);
32     `uvm_info(tID, "run_phase is executed", UVM_LOW)
33   endtask
34
35   virtual task pre_reset_phase(uvm_phase phase);
36     `uvm_info(tID, "pre_reset_phase is executed", UVM_LOW)
37   endtask
…
79   virtual task post_shutdown_phase(uvm_phase phase);
80     `uvm_info(tID, "post_shutdown_phase is executed", UVM_LOW)
81   endtask
82
83   virtual function void extract_phase(uvm_phase phase);
84     super.extract_phase(phase);
85     `uvm_info(tID, "extract_phase is executed", UVM_LOW)
86   endfunction
…
98   virtual function void final_phase(uvm_phase phase);
99     super.final_phase(phase);
100   `uvm_info(tID, "final_phase is executed", UVM_LOW)
101   endfunction
102
103
104 endclass

运行上述代码,可以看到各phase被依次执行。在这些phase中,令人疑惑的是task phase。对于function phase来说,在同一时间只有一个phase在执行;但是task phase中,run_phase和pre_reset_phase等12个小的phase并行运行。后者称为动态运行(runtime)的phase。对于task phase,从全局的观点来看其顺序大致如下:

fork
  begin
    run_phase();
  end
  begin
    pre_reset_phase();
    reset_phase();
    post_reset_phase();
    pre_configure_phase();
    configure_phase();
    post_configure_phase();
    pre_main_phase();
    main_phase();
    post_main_phase();
    pre_shutdown_phase();
    shutdown_phase();
    post_shutdown_phase();
  end
join

UVM提供了如此多的phase,在一般的应用中,无论是function phase还是task phase都不会将它们全部用上。使用频率最高的是build_phase、connect_phase和main_phase。这么多phase除了方便验证人员将不同的代码写在不同的phase外,还有利于其他验证方法学向UVM迁移。一般的验证方法学都会把仿真分成不同的阶段,但是这些阶段的划分通常没有UVM分得这么多、这么细
致。所以一般来说,当其他验证方法学向UVM迁移的时候,总能找到一个phase来对应原来方法学中的仿真阶段,这为迁移提供
了便利。

5.1.2 动态运行phase
动态运行(run-time)phase是UVM1.0引入的新的phase,其他phase则在UVM1.0之前(即UVM1.0EA版和OVM中)就已经存在
了。
UVM为什么引入这12个小的phase呢?分成小的phase是为了实现更加精细化的控制。reset、configure、main、shutdown四个phase是核心,这四个phase通常模拟DUT的正常工作方式,在reset_phase对DUT进行复位、初始化等操作,在configure_phase则进行DUT的配置,DUT的运行主要在main_phase完成,shutdown_phase则是做一些与DUT断电相关的操作。通过细分实现对DUT更精确的控制。假设要在运行过程中对DUT进行一次复位(reset)操作,在没有这些细分的phase之前,这种操作要在
scoreboard、reference model等加入一些额外的代码来保证验证平台不会出错。但是有了这些小的phase之后,分别在scoreboard、
reference model及其他部分(如driver、monitor等)的reset_phase写好相关代码,之后如果想做一次复位操作,那么只要通过phase
的跳转,就会自动跳转回reset_phase。
关于跳转的内容,请参考5.1.7节。

*5.1.3 phase的执行顺序
5.1.1节笼统地说明了phase是自上而下执行的,而在3.5.4节时曾经提到过,build_phase是一种自上而下执行的。但这两种“自
上而下”是有不同含义的。
5.1.1节中的自上而下是时间的概念,不同的phase按照图5-1中所示的phase顺序自上而下执行。而3.5.4节所说的自上而下是空间的概念,即在图3-2中,先执行的是my_case的build_phase,其次是env的build_phase,一层层往下执行。这种自上而下的顺序其实是唯一的选择。
对于UVM树来说,共有三种顺序可以选择,一是自上而下,二是自下而上,三是随机序。最后一种方式是不受人控制的,在
编程当中,这种不受控制的代码越少越好。因此可以选择的无非就是自上而下或者自下而上。
假如UVM不使用自上而下的方式执行build_phase,那会是什么情况呢?UVM的设计哲学就是在build_phase中做实例化的工
作,driver和monitor都是agent的成员变量,所以它们的实例化都要在agent的build_phase中执行。如果在agent的build_phase之前执行driver的build_phase,此时driver还根本没有实例化,所以调用driver.build_phase只会引发错误。
UVM是在build_phase中做实例化工作,这里的实例化指的是uvm_component及其派生类变量的实例化,假如在其他phase实例化一个uvm_component,那么系统会报错。如果是uvm_object的实例化,则可以在任何phase完成,当然也包括build_phase了。
除了自上而下的执行方式外,UVM的phase还有一种执行方式是自下而上。事实上,除了build_phase之外,所有不耗费仿真时间的phase(即function phase)都是自下而上执行的。如对于connect_phase即先执行driver和monitor的connect_phase,再执行agent的connect_phase。
无论是自上而下还是自下而上,都只适应于UVM树中有直系关系的component。对于同一层次的、具有兄弟关系的component,如driver与monitor,它们的执行顺序如何呢?一种猜测是按照实例化的顺序。如代码清单5-3中,A_inst0到A_inst3的build_phase是顺序执行的,这种猜测是错误的。通过分析源代码,读者可以发现执行顺序是按照字典序的。这里的字典序的排序依据new时指定的名字。假如monitor在new时指定的名字为aaa,而driver的名字为bbb,那么将会先执行monitor的build_phase。反之若monitor为mon,driver为drv,那么将会先执行driver的build_phase。如下面的代码:

文件:ch5/section5.1/5.1.3/brother/my_env.sv
4 class my_env extends uvm_env;
5
6 A A_inst0;
7 A A_inst1;
8 A A_inst2;
9 A A_inst3;
…
16 virtual function void build_phase(uvm_phase phase);
17 super.build_phase(phase);
18
19 A_inst0 = A::type_id::create("dddd", this);
20 A_inst1 = A::type_id::create("zzzz", this);
21 A_inst2 = A::type_id::create("jjjj", this);
22 A_inst3 = A::type_id::create("aaaa", this);
23
24 endfunction
25
26 `uvm_component_utils(my_env)
27 endclass

其中A的代码为:

文件:ch5/section5.1/5.1.3/brother/A.sv
3 class A extends uvm_component;
…
12 endclass
13
14 function void A::build_phase(uvm_phase phase);
15   super.build_phase(phase);
16   `uvm_info("A", "build_phase", UVM_LOW)
17 endfunction
18
19 function void A::connect_phase(uvm_phase phase);
20   super.connect_phase(phase);
21   `uvm_info("A", "connect_phase", UVM_LOW)
22 endfunction

输出的结果将会是:

# UVM_INFO A.sv(16) @ 0: uvm_test_top.env.aaaa [A] build_phase
# UVM_INFO A.sv(16) @ 0: uvm_test_top.env.dddd [A] build_phase
# UVM_INFO A.sv(16) @ 0: uvm_test_top.env.jjjj [A] build_phase
# UVM_INFO A.sv(16) @ 0: uvm_test_top.env.zzzz [A] build_phase
# UVM_INFO A.sv(21) @ 0: uvm_test_top.env.aaaa [A] connect_phase
# UVM_INFO A.sv(21) @ 0: uvm_test_top.env.dddd [A] connect_phase
# UVM_INFO A.sv(21) @ 0: uvm_test_top.env.jjjj [A] connect_phase
# UVM_INFO A.sv(21) @ 0: uvm_test_top.env.zzzz [A] connect_phase

这里可以清晰地看出无论是自上而下(build_phase)还是自下而上(connect_phase)的phase,其执行顺序都与实例化的顺序
无关,而是严格按照实例化时指定名字的字典序。
只是这个顺序是在UVM1.1d源代码中找到的,UVM并未保证一直会是这个顺序。如果代码的执行必须依赖于这种顺序,例如
要求必须先执行driver的build_phase,再执行monitor的build_phase,那么应该立即修改代码,杜绝这种依赖性在代码中出现。

类似run_phase、main_phase等task_phase也都是按照自下而上的顺序执行的。但是与前面function phase自下而上执行不同的是,这种task phase是耗费时间的,所以它并不是等到“下面”的phase(如driver的run_phase)执行完才执行“上面”的phase(如agent的run_phase),而是将这些run_phase通过fork…join_none的形式全部启动。所以,更准确的说法是自下而上的启动,同时在运行。
对于同一component来说,其12个run-time的phase是顺序执行的,但是它们也仅仅是顺序执行,并不是说前面一个phase执行完就立即执行后一个phase。以main_phase和post_main_phase为例,对于A component来说,其main_phase在0时刻开始执行,100时刻执行完毕:

文件:src/ch5/section5.1/5.1.3/phase_wait/A.sv
19 task A::main_phase(uvm_phase phase);
20   phase.raise_objection(this);
21   `uvm_info("A", "main phase start", UVM_LOW)
22   #100;
23   `uvm_info("A", "main phase end", UVM_LOW)
24   phase.drop_objection(this);
25 endtask
26
27 task A::post_main_phase(uvm_phase phase);
28   phase.raise_objection(this);
29   `uvm_info("A", "post main phase start", UVM_LOW)
30   #300;
31   `uvm_info("A", "post main phase end", UVM_LOW)
32   phase.drop_objection(this);
33 endtask

对于B component来说,其main_phase在0时刻开始执行,200时刻执行完毕:

文件:src/ch5/section5.1/5.1.3/phase_wait/B.sv
13 task B::main_phase(uvm_phase phase);
14 phase.raise_objection(this);
15 `uvm_info("B", "main phase start", UVM_LOW)
16 #200;
17 `uvm_info("B", "main phase end", UVM_LOW)
18 phase.drop_objection(this);
19 endtask
20
21 task B::post_main_phase(uvm_phase phase);
22 phase.raise_objection(this);
23 `uvm_info("B", "post main phase start", UVM_LOW)
24 #200;
25 `uvm_info("B", "post main phase end", UVM_LOW)
26 phase.drop_objection(this);
27 endtask

此时整个验证平台的main_phase才执行完毕,接下来执行post_main_phase,即A和B的post_main_phase都是在200时刻开始执
行。假设A的post_main_phase执行完毕需要300个时间单位,而B只需要200个时间单位,无论是A或者B,其后续都没有其他耗时
间的phase了,整个验证平台会在500时刻关闭。上述代码的执行结果如下:

# UVM_INFO B.sv(15) @ 0: uvm_test_top.env.B_inst [B] main phase start
# UVM_INFO A.sv(21) @ 0: uvm_test_top.env.A_inst [A] main phase start
# UVM_INFO A.sv(23) @ 100: uvm_test_top.env.A_inst [A] main phase end
# UVM_INFO B.sv(17) @ 200: uvm_test_top.env.B_inst [B] main phase end
# UVM_INFO B.sv(23) @ 200: uvm_test_top.env.B_inst [B] post main phase start
# UVM_INFO A.sv(29) @ 200: uvm_test_top.env.A_inst [A] post main phase start
# UVM_INFO B.sv(25) @ 400: uvm_test_top.env.B_inst [B] post main phase end
# UVM_INFO A.sv(31) @ 500: uvm_test_top.env.A_inst [A] post main phase end

可以看到对于A来说,main_phase在100时刻结束,其post_main_phase在200时刻开始执行。在100~200时刻,A处于等待B的
状态,除了等待不做任何事情。B的post_main_phase在400时刻结束,之后就处于等待A的状态。
这个过程如图5-2所示。

无论从A还是B的角度来看,都存在一段空白等待时间。但是从整个验证平台的角度来看,各个task phase之间是没有任何空
白的。

上述的这种同步不仅适用于不同component的动态运行(run-time)phase之间,还适用于run_phase与run_phase之间。这两种同步都是不同component之间的相同phase之间的同步。除了这两种同步外,还存在一种run_phase与post_shutdown_phase之间的同步。这种同步的特殊之处在于,它是同一个component的不同类型phase(两类task phase,即run_phase与run-time phase)之间的同步,即同一个component的run_phase与其post_shutdown_phase全部完成才会进入下一个phase(extract_phase)。例如,假设整个验证平台中只在A中控制objection:

//phase_wait2/A.sv
19 task A::post_shutdown_phase(uvm_phase phase);
20 phase.raise_objection(this);
21 `uvm_info("A", "post shutdown phase start", UVM_LOW)
22 #300;
23 `uvm_info("A", "post shutdown phase end", UVM_LOW)
24 phase.drop_objection(this);
25 endtask
26
27 task A::run_phase(uvm_phase phase);
28 phase.raise_objection(this);
29 `uvm_info("A", "run phase start", UVM_LOW)
30 #200;
31 `uvm_info("A", "run phase end", UVM_LOW)
32 phase.drop_objection(this);
33 endtask

在上述代码中,post_shutdown_phase在300时刻完成,而run_phase在200时刻完成。验证平台进入extract_phase的时刻是300。
从整个验证平台的角度来说,只有所有component的run_phase和post_shutdown_phase都完成才能进入extract_phase。
无论是run-time phase之间的同步,还是run_phase与post_shutdown_phase之间的同步,或者是run_phase与run_phase之间的同
步,它们都与objection机制密切相关。关于这一点,请参考5.2.1节。
*5.1.4 UVM树的遍历
在图3-2中,除了兄弟关系的component,还有一种叔侄关系的component,如my_scoreboard与my_driver,从树的层次结构上
来说,scoreboard级别是高于driver的,但是,这两者build_phase的执行顺序其实也是不确定的。这两者的执行顺序除了上节提到的字典序外,还用到了图论中树的遍历方式:广度优先或是深度优先。
所谓广度优先,指的是如果i_agt的build_phase执行完毕后,接下来执行的是其兄弟component的build_phase,当所有兄弟的
build_phase执行完毕后,再执行其孩子的build_phase。
所谓深度优先,指的是如果i_agt的build_phase执行完毕后,它接下来执行的是其孩子的build_phase,如果孩子还有孩子,那么
再继续执行下去,一直到整棵以i_agt为树根的UVM子树的build_phase执行完毕,之后再执行i_agt的兄弟的build_phase。
UVM中采用的是深度优先的原则,对于图3-2中的scoreboard及driver的build_phase的执行顺序,i_agt实例化时名字为“i_agt”,而scb为“scb”,那么i_agt的build_phase先执行,在执行完毕后,接下来执行driver、monitor及sequencer的build_phase。当全部执行完毕后再执行scoreboard的build_phase:

# UVM_INFO my_agent.sv(29) @ 0: uvm_test_top.env.i_agt [agent] build_phase
# UVM_INFO my_driver.sv(16) @ 0: uvm_test_top.env.i_agt.drv [driver] build_phase
# UVM_INFO my_agent.sv(29) @ 0: uvm_test_top.env.o_agt [agent] build_phase
# UVM_INFO my_scoreboard.sv(23) @ 0: uvm_test_top.env.scb [scb] build_phase

反之,如果i_agt实例化时是bbb,而scb为aaa,则会先执行scb的build_phase,再执行i_agt的build_phase,接下来是driver、
monitor及sequencer的build_phase。
如果读者的代码中要求scoreboard的build_phase先于driver的build_phase执行,或者要求两者的顺序反过来,那么应该立即修改
这种代码,去除这种对顺序的要求。

5.1.5 super.phase的内容
在前文的代码中,有时候出现super.xxxx_phase语句,有些时候又不会出现。如在main_phase中,有时出现super.main_phase,
有时又不会;在build_phase中,则一般会出现super.build_phase。那么uvm_component在其各个phase中都默认做了哪些事情呢?哪些phase应该加上super.xxxx_phase,哪些又可以不加呢?
对于build_phase来说,uvm_component对其做的最重要的事情就是3.5.3节所示的自动获取通过config_db::set设置的参数。
如果要关掉这个功能,可以在自己的build_phase中不调用super.build_phase。

除了build_phase外,UVM在其他phase中几乎没有做任何相关的事情:

function void uvm_component::connect_phase(uvm_phase phase);
connect();
return;
endfunction
function void uvm_component::start_of_simulation_phase(uvm_phase phase);
start_of_simulation();
return;
endfunction
function void uvm_component::end_of_elaboration_phase(uvm_phase phase);
end_of_elaboration();
return;
task uvm_component::run_phase(uvm_phase phase);
run();
return;
endtask
function void uvm_component::extract_phase(uvm_phase phase);
extract();
return;
endfunction
function void uvm_component::check_phase(uvm_phase phase);
check();
return;
endfunction
function void uvm_component::report_phase(uvm_phase phase);
report();
return;
endfunction
function void uvm_component::connect(); return; endfunction
function void uvm_component::start_of_simulation(); return; endfunction
function void uvm_component::end_of_elaboration(); return; endfunction
task uvm_component::run(); return; endtask
function void uvm_component::extract(); return; endfunction
function void uvm_component::check(); return; endfunction
function void uvm_component::report(); return; endfunction
function void uvm_component::final_phase(uvm_phase phase); return; endfunction
task uvm_component::pre_reset_phase(uvm_phase phase); return; endtask
task uvm_component::reset_phase(uvm_phase phase); return; endtask
task uvm_component::post_reset_phase(uvm_phase phase); return; endtask
task uvm_component::pre_configure_phase(uvm_phase phase); return; endtask
task uvm_component::configure_phase(uvm_phase phase); return; endtask
task uvm_component::post_configure_phase(uvm_phase phase); return; endtask
task uvm_component::pre_main_phase(uvm_phase phase); return; endtask
task uvm_component::main_phase(uvm_phase phase); return; endtask
task uvm_component::post_main_phase(uvm_phase phase); return; endtask
task uvm_component::pre_shutdown_phase(uvm_phase phase); return; endtask
task uvm_component::shutdown_phase(uvm_phase phase); return; endtask
task uvm_component::post_shutdown_phase(uvm_phase phase); return; endtask

由如上代码可以看出,除build_phase外,在写其他phase时,完全可以不必加上super.xxxx_phase语句,如第2章中所有的super.main_phase都可以去掉。当然,这个结论只适用于直接扩展自uvm_component的类。如果是扩展自用户自定义的类,如
base_test类,且在其某个phase,如connect_phase中定义了一些重要内容,那么在具体测试用例的connect_phase中就不应该省略
super.connect_phase。

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

UVM中的phase机制 的相关文章

  • 文章UVM and C – Perfect Together的解读与思考

    解读UVM and C Perfect Together 文章获取方式 xff1a 路科验证 gt 资源 gt DVCon2018 USA zip gt 08 3 http rockeric com resource paper 文章主要内
  • 验证平台,SV 和UVM

    验证 是确保设计和预定的设计期望一致的过程 验证平台 xff1a 被用来应用一个或多个测试激励 xff0c 并将激励发送到设计的输入中 xff0c 激励可通过验证平台产生 xff0c 或者通过手动创建 最后 xff0c 输出进行比较 xff
  • error execution phase kubelet-start: error uploading crisocket: timed out waiting for the condition

    在部署k8s容器过程中添加node节点提示 查询10250端口使用情况发现已经被使用netstat anpt grep 10250 说明之前有安装记录 xff0c 需要进行重新初始化操作 swapoff a 关闭swap空间 kubeadm
  • STM32Cube的PWM控制算法篇(一)数字锁相环初步设计Digital phase locked loop

    数字锁相环 Digital phase locked loop数字锁相环是一个通过PID算法使PWM调频改变相位 xff0c 以达到与目标模型同频同相或同频稳定相位差的目的 xff0c 在实际应用中较为常见 xff0c 其中包括齿轮对接 远
  • APB协议UVM验证环境的搭建

    APB协议UVM验证环境的搭建 一 编译文件 只需编译这两个文件即可 apb pkg sv 里面包含了 apb svh 即编译apb pkg sv这个文件的同时 也会编译所需要的所有的头文件 ifndef APB PKG SV define
  • UVM的构造函数new的个人理解

    构造函数new 自己总结的规律 理解 结合UVM实战这本书的阅读理解 归纳一下自己对new函数的个人理解 只是书本前几章阅读后的认知 还不能完善 在此只为记录防丢失 构造函数new 一般类的实例化 包含类的声明和类的构造 比如 my dri
  • UVM中的phase机制

    5 1 phase机制 5 1 1 task phase与function phase UVM中的phase 按照其是否消耗仿真时间 time打印出的时间 的特性 可以分成两大类 一类是function phase 如build phase
  • vcs覆盖率选项

    vcs中常用的收集覆盖率选项如下 1 cm dir
  • 说一说system verilog内建函数$value$plusargs()

    在学习system verilog的时候遇到了一个长的很奇怪的函数 奇怪到啥程度 别的函数都是一个 xxx 这个函数一次来了两个 长的虽然奇怪 但是这个函数的作用很大 首先看一下它的基本格式 value plusargs user stri
  • 如何在父uvm_transaction中随机及例化子的uvm_transaction

    Use Case AXI DMA控制器有128个独立的通道 可以并行进行读写操作 首先我们对AXI DMA控制器的top level的事务进行建模 如下 class axi dmac transaction extends uvm tran
  • uvm_info信息定制

    1 uvm自带的打印信息国语繁重 不利于debug uvm info TESTCASE sformatf my case0 new UVM DEBUG UVM INFO home zl Desktop uvm study template
  • 验证网站列表,持续更新中...

    verificationacademy com verificationguide com chipverify com https www runoob com w3cnote verilog2 sdf html https www th
  • 电力电子转战数字IC——我的IC面试(2022.10.14更新)

    目录 感谢信 HKWS10 14面试 25mins JXC10 13面试 30mins JDSK9 23面试 42mins 快速的自我介绍 介绍一下这个MCDF的项目 你这里写SV搭建的验证环境 和UVM搭建的有什么区别吗 你这里写了覆盖率
  • 修改 PhaseListener 中的 JSF 组件树

    我有一个问题 我已经实现了一个 PhaseListener 它的目的是向树中附加有消息的任何 UIInput 组件添加一个样式类 如果没有附加任何消息 则删除该样式类 PhaseListener 在 RENDER RESPONSE 阶段运行
  • UVM 测试平台 - 将两个不同驱动程序连接到同一接口的“UVM”方式是什么?

    在我的测试平台中 我有一个需要驱动的接口 该接口可以以两种不同的模式驱动 每种模式都有自己的驱动程序协议和事务类型 到目前为止 我已经分别设计了两个 uvm agents 现在 我需要一种方法来交换其中一个或另一个 具体取决于我正在运行的测
  • 从测试台访问 uvm_config_db 的最佳方式?

    我想在我的顶级测试平台中创建一个时钟 其周期可以通过测试进行控制 我所做的是将周期设置到 uvm config db 中并将其返回到测试台中 我必须输入 1 以确保构建阶段已完成 否则 get 返回错误值 module testbench
  • 使用 fft 查找每个谐波的相位

    我用的是Matlab 我有一个正弦信号 X 放大器 220 频率 50 我添加了 3 个谐波 x1 gt h2 放大器 30 频率 100 相位 30 x2 gt h4 放大器 10 频率 200 相位 50 x3 gt h6 放大器 05
  • 请求范围的 bean 和数据模型初始化?

    更新二 好的 我设法缩小了范围 我有一个带有数据表的页面 具有排序和过滤功能 两者都发生在数据库中 换句话说 我不使用我使用的 rich datatable 的嵌入式功能 而是让 DB 来完成工作 我与请求范围豆子 唯一的会话范围 bean
  • 在 XCode 的复制标头构建阶段将角色更改为公共时,如何保留子组?

    目前 层次结构已变平 所有头文件都被复制到我的 Classes 文件夹中的单个 Headers 目录中 无论它们位于哪个子文件夹中 如果标头具有引用子文件夹中其他标头的 include 语句 则在引用标头时就会出现问题 特别是 这会搞砸 B
  • 如何在Python中从声音中获取Pi-Phase以获得相消干涉

    第一 我不知道该把这个话题放在哪里 因为它是一个编程和声音问题 如果有错误的地方请评论 但这是我的问题 如何将声音加载到 Python 中并创建它的 反向声音 因此 当我播放原始文件和 pi 偏移 文件时 它们会产生破坏性干扰并相互抵消 因

随机推荐

  • 【文献调研】多任务学习-Part1

    基于数据增强和多任务学习的突发公共卫生时间谣言识别研究 摘要 Motivation 通过引入多任务学习模型和数据增强方法 解决突发公共卫生事件情景下谣言识别任务数据不平衡且带标签数据量少的问题 Methods 首先提取突发公共卫生事件谣言文
  • 《Learning Spark》第八章:调优及调试spark应用

    2020 07 05 引言 我记得当时我就是因为使用hadoop太过费劲了 才上手的spark 然后因为自己的机器性能不行 又一点一点调优 当时调优的过程 主要是从底层的结构上来进行调优 主要就是那些worker数量以及内存大小等等 但是对
  • PyTorch和TensorFlow生成对抗网络学习MNIST数据集

    介绍 生成对抗网络 简称GAN 是最近开发的最受欢迎的机器学习算法之一 对于人工智能 AI 领域的新手 我们可以简单地将机器学习 ML 描述为AI的子领域 它使用数据来 教 机器 程序如何执行新任务 一个简单的例子就是使用一个人的脸部图像作
  • png四通道透明背景图成功加入到视频帧中 使用了mask原理

    import cv2 import ffmpeg import cv2 import numpy as np import glob video f D CCTV CCTV mp4 视频文件名 output f D CCTV logoaft
  • 共享内存---结构体使用

    共享内存主要是通过映射机制实现的 Windows 下进程的地址空间在逻辑上是相互隔离的 但在物理上却是重叠的 所谓的重叠是指同一块内存区域可能被多个进程同时使用 当调用 CreateFileMapping 创建命名的内存映射文件对象时 Wi
  • 网络基础-应用层:E-mail应用:SMTP协议,POP协议,IMAP协议

    Email应用的构成 邮件客户端 邮件服务器 SMTP协议 只支持文本 邮件服务器 邮箱 存储发给该用户的Email 消息队列 存储等待发送的Email SMTP协议 邮件服务器之间传递消息所使用的协议 客户端 发送消息的服务器 服务器 接
  • js实用方法记录-js动态加载css、js脚本文件

    js实用方法记录 动态加载css js 附送一个加载iframe h5打开app代码 1 动态加载js文件到head标签并执行回调 方法调用 dynamicLoadJs http www yimo link static js main m
  • 双向链表实现简单的增删查改

    前言 上次分享了单向链表的增删查改 这次要介绍双向链表的增删查改 其实双向链表也有多种 这次主要介绍结构最复杂但是实现起功能反而最简单的带头双向循环链表 希望我的分享对各位有些许帮助 学习这篇文章的内容最好有这篇文章的基础 目录 一 双向链
  • VBA常用语法(一)

    VBA语句 一 VBA语句 1 宏程序语句 运行后可 以完成一个功能 给单元格a1赋值 Sub test 开始语句 Range a1 10 程序主体 End Sub 结束语句 2 函数程序语句 运行后可以返回一个值 Function shc
  • 阿里云数据库 MongoDB 版Python 连接示例

    安装pymongo import uuid from pymongo import MongoClient 两地址 CONN ADDR1 demotest 1 mongodb tbc3 newtest rdstest aliyun inc
  • 即将开班「中国图象图形学学会」前沿讲习班第2期——智能驾驶与机器视觉

    CSIG图像图形学科前沿讲习班第2期 主题 智能驾驶与机器视觉 2017年7月15日 17日 清华大学 智能驾驶无疑开启了交通运输行业的新时代 随着传感器和人工智能技术的逐渐成熟 智能驾驶已经从 概念化 进入 落地实用化 的关键窗口期 越来
  • 高精度地图定位在高速公路自动驾驶系统中的应用

    摘要 自动驾驶已经成为全球汽车产业的战略发展方向 其中L3 级高速公路自动驾驶是最有可能率先落地的自动驾驶系统 高精度地图和定位系统是自动驾驶系统的关键一部分 近年来发展迅速 已经达到可量产状态 文章首先分析了自动驾驶和高精度地图定位的发展
  • 运动目标检测代码(帧差、高斯混合、vibe代码实现)

    主要介绍四种运动目标检测的算法代码 每段代码博主实测可运行 当前主流的混合高斯背景模型 VIBE算法代码转载自他处 另外GMG算法 KNN算法在朱伟的书中也有讲 opencv3 0中 有专门的背景模型类BackgroundSubtracto
  • Java学习笔记29——字节流2

    字节流读数据 字节流读数据 一次读一个字节的数据 一次读一个字节数组的数据 字节流复制图片 字节流读数据 一次读一个字节的数据 FileInputStream 从文件系统中的文件获取输入字节 public class FileInputSt
  • 数据结构-第1章 概述

    第1章 概述 第2章 线性表 第3章 栈和队列 第4章 串 矩阵和广义表 第5章 树和二叉树 第6章 图 第7章 查找 第8章 排序 一 第1章 概述 1 数据 所有能被计算机识别 存储和处理的符号的集合 包括数字 字符 声音 图像等信息
  • 如何强制性管控代码质量

    一 背景 在之前的文章中 我们已经描述了jenkins和sonarqube是如何集成起来的 今天我们在该篇文章中描述下 如何使用gerrit jenkins sonar进行代码质量管控 主要是利用sonarqube分析代码的能力来管控 一般
  • ajax后台返回数据中文乱码_透彻分析和解决一切javaWeb项目乱码问题

    前言 乱码是我们在程序开发中经常碰到且让人头疼的一件事 尤其是我们在做javaweb开发 如果我们没有清楚乱码产生的原理 碰到乱码问题了就容易摸不着头脑 无从下手 乱码主要出现在两部分 如下 第一 浏览器通过表单提交到后台 如果表单内容有中
  • 近期面试总结

    最近两个月大大小小的面试已经不下十来场了 一共面了5 6个公司 大的有蚂蚁金服 小的有初创公司 也有做直播的等等 但是面试都是大同小异 因此来记录一下自己的不足之处以及需要加强的地方 项目 个人的项目经验其实非常重要 很多面试官往往会从项目
  • xprop

    xprop 使用说明 名字 xprop X的属性显示器 概要 xprop help grammar id id root name name frame font font display display len n notype fs f
  • UVM中的phase机制

    5 1 phase机制 5 1 1 task phase与function phase UVM中的phase 按照其是否消耗仿真时间 time打印出的时间 的特性 可以分成两大类 一类是function phase 如build phase