uvm_phase phase

时间: 2024-02-01 14:03:29 浏览: 23
在UVM(Universal Verification Methodology)中,phase是一种控制器,用于控制测试环境中各个组件的执行顺序和时序。UVM Testbench中的所有组件都需要执行特定的任务,如建立环境、生成用例、执行用例、分析结果等,而这些任务都是在特定的时期(phase)执行的。 UVM中定义了一系列标准的phase,如build、connect、run、extract等。每个phase都有固定的执行顺序,如build phase用于创建测试环境,connect phase用于连接各个组件,run phase用于执行测试用例,extract phase用于分析结果。 在UVM中,phase由uvm_phase类来实现。uvm_phase类提供了一系列的方法,如:`add()`方法用于向phase添加组件,`raise_objection()`方法用于在phase执行期间提出异议,`drop_objection()`方法用于在phase执行期间解决异议,`execute()`方法用于执行phase等。 通过使用uvm_phase类,用户可以方便地控制测试环境中各个组件的执行顺序和时序,从而实现高效的测试环境。
相关问题

task main_phase(uvm_phase phase);

在 UVM(Universal Verification Methodology)中,`main_phase` 是一个自定义的用户任务(user task),它在测试环境中的主要阶段被调用。在该阶段,主要的测试活动和功能被执行,包括生成测试向量、应用刺激、收集结果等。 这个任务可以在 `run_phase` 中被调用,如下所示: ```systemverilog task run_phase(uvm_phase phase); phase.raise_objection(this); main_phase(phase); phase.drop_objection(this); endtask ``` 在 `main_phase` 中,你可以编写自己的测试逻辑和功能,以及调用其他组件的任务或方法来执行验证任务。根据你的测试需求,你可以在这个阶段编写各种自定义的操作。 希望这可以回答你的问题!如果你还有其他问题,请随时提问。

请逐行注释下面的代码:class riscv_instr_base_test extends uvm_test; riscv_instr_gen_config cfg; string test_opts; string asm_file_name = "riscv_asm_test"; riscv_asm_program_gen asm_gen; string instr_seq; int start_idx; uvm_coreservice_t coreservice; uvm_factory factory; uvm_component_utils(riscv_instr_base_test) function new(string name="", uvm_component parent=null); super.new(name, parent); void'($value$plusargs("asm_file_name=%0s", asm_file_name)); void'($value$plusargs("start_idx=%0d", start_idx)); endfunction virtual function void build_phase(uvm_phase phase); super.build_phase(phase); coreservice = uvm_coreservice_t::get(); factory = coreservice.get_factory(); uvm_info(gfn, "Create configuration instance", UVM_LOW) cfg = riscv_instr_gen_config::type_id::create("cfg"); uvm_info(gfn, "Create configuration instance...done", UVM_LOW) uvm_config_db#(riscv_instr_gen_config)::set(null, "*", "instr_cfg", cfg); if(cfg.asm_test_suffix != "") asm_file_name = {asm_file_name, ".", cfg.asm_test_suffix}; // Override the default riscv instruction sequence if($value$plusargs("instr_seq=%0s", instr_seq)) begin factory.set_type_override_by_name("riscv_instr_sequence", instr_seq); end if (riscv_instr_pkg::support_debug_mode) begin factory.set_inst_override_by_name("riscv_asm_program_gen", "riscv_debug_rom_gen", {gfn, ".asm_gen.debug_rom"}); end endfunction function void report_phase(uvm_phase phase); uvm_report_server rs; int error_count; rs = uvm_report_server::get_server(); error_count = rs.get_severity_count(UVM_WARNING) + rs.get_severity_count(UVM_ERROR) + rs.get_severity_count(UVM_FATAL); if (error_count == 0) begin uvm_info("", "TEST PASSED", UVM_NONE); end else begin uvm_info("", "TEST FAILED", UVM_NONE); end uvm_info("", "TEST GENERATION DONE", UVM_NONE); super.report_phase(phase); endfunction virtual function void apply_directed_instr(); endfunction task run_phase(uvm_phase phase); int fd; for(int i = 0; i < cfg.num_of_tests; i++) begin string test_name; randomize_cfg(); riscv_instr::create_instr_list(cfg); riscv_csr_instr::create_csr_filter(cfg); asm_gen = riscv_asm_program_gen::type_id::create("asm_gen", , gfn); asm_gen.cfg = cfg; asm_gen.get_directed_instr_stream(); test_name = $sformatf("%0s_%0d.S", asm_file_name, i+start_idx); apply_directed_instr(); uvm_info(gfn, "All directed instruction is applied", UVM_LOW) asm_gen.gen_program(); asm_gen.gen_test_file(test_name); end endtask virtual function void randomize_cfg(); DV_CHECK_RANDOMIZE_FATAL(cfg); uvm_info(`gfn, $sformatf("riscv_instr_gen_config is randomized:\n%0s", cfg.sprint()), UVM_LOW) endfunction endclass

这是一个 SystemVerilog 类定义,定义了一个名为 riscv_instr_base_test 的类,继承自 uvm_test。下面是代码解释: ``` class riscv_instr_base_test extends uvm_test; ``` 定义一个名为 riscv_instr_base_test 的类,继承自 uvm_test。 ``` riscv_instr_gen_config cfg; ``` 定义一个名为 cfg 的 riscv_instr_gen_config 类型变量。 ``` string test_opts; ``` 定义一个名为 test_opts 的字符串类型变量。 ``` string asm_file_name = "riscv_asm_test"; ``` 定义一个名为 asm_file_name 的字符串类型变量,并将其初始化为 "riscv_asm_test"。 ``` riscv_asm_program_gen asm_gen; ``` 定义一个名为 asm_gen 的 riscv_asm_program_gen 类型变量。 ``` string instr_seq; ``` 定义一个名为 instr_seq 的字符串类型变量。 ``` int start_idx; ``` 定义一个名为 start_idx 的整型变量。 ``` uvm_coreservice_t coreservice; ``` 定义一个名为 coreservice 的 uvm_coreservice_t 类型变量。 ``` uvm_factory factory; ``` 定义一个名为 factory 的 uvm_factory 类型变量。 ``` uvm_component_utils(riscv_instr_base_test) ``` 宏定义,用于简化组件注册过程。 ``` function new(string name="", uvm_component parent=null); ``` 定义一个构造函数 new。 ``` super.new(name, parent); ``` 调用父类 uvm_test 的构造函数。 ``` void'($value$plusargs("asm_file_name=%0s", asm_file_name)); void'($value$plusargs("start_idx=%0d", start_idx)); ``` 从命令行参数中获取 asm_file_name 和 start_idx 的值。 ``` endfunction ``` 构造函数结束。 ``` virtual function void build_phase(uvm_phase phase); ``` 定义一个虚函数 build_phase,用于实现组件的构建过程。 ``` super.build_phase(phase); ``` 调用父类 uvm_test 的 build_phase 函数。 ``` coreservice = uvm_coreservice_t::get(); factory = coreservice.get_factory(); ``` 获取 uvm_coreservice_t 和 uvm_factory 实例。 ``` uvm_info(gfn, "Create configuration instance", UVM_LOW) cfg = riscv_instr_gen_config::type_id::create("cfg"); ``` 创建 riscv_instr_gen_config 的实例 cfg。 ``` uvm_info(gfn, "Create configuration instance...done", UVM_LOW) ``` 输出一条消息,表示创建配置实例完成。 ``` uvm_config_db#(riscv_instr_gen_config)::set(null, "*", "instr_cfg", cfg); ``` 将 cfg 对象存储到配置数据库中。 ``` if(cfg.asm_test_suffix != "") asm_file_name = {asm_file_name, ".", cfg.asm_test_suffix}; ``` 如果配置文件中指定了 asm_test_suffix,则将其添加到 asm_file_name 的末尾。 ``` if($value$plusargs("instr_seq=%0s", instr_seq)) begin factory.set_type_override_by_name("riscv_instr_sequence", instr_seq); end ``` 如果命令行参数中指定了 instr_seq,则使用该指令序列进行测试。 ``` if (riscv_instr_pkg::support_debug_mode) begin factory.set_inst_override_by_name("riscv_asm_program_gen", "riscv_debug_rom_gen", {gfn, ".asm_gen.debug_rom"}); end ``` 如果支持调试模式,则为 riscv_asm_program_gen 组件设置调试 ROM。 ``` endfunction ``` build_phase 函数结束。 ``` function void report_phase(uvm_phase phase); ``` 定义一个 report_phase 函数,用于在测试结束时输出测试结果。 ``` uvm_report_server rs; int error_count; rs = uvm_report_server::get_server(); ``` 获取 uvm_report_server 实例。 ``` error_count = rs.get_severity_count(UVM_WARNING) + rs.get_severity_count(UVM_ERROR) + rs.get_severity_count(UVM_FATAL); ``` 获取测试过程中出现的警告、错误和致命错误的数量。 ``` if (error_count == 0) begin uvm_info("", "TEST PASSED", UVM_NONE); end else begin uvm_info("", "TEST FAILED", UVM_NONE); end ``` 根据错误数量输出测试结果。 ``` uvm_info("", "TEST GENERATION DONE", UVM_NONE); ``` 输出一条消息,表示测试生成完成。 ``` super.report_phase(phase); ``` 调用父类 uvm_test 的 report_phase 函数。 ``` endfunction ``` report_phase 函数结束。 ``` virtual function void apply_directed_instr(); ``` 定义一个虚函数 apply_directed_instr,用于实现针对指定指令的测试。 ``` endfunction ``` apply_directed_instr 函数结束。 ``` task run_phase(uvm_phase phase); ``` 定义一个任务 run_phase,用于执行测试过程。 ``` int fd; for(int i = 0; i < cfg.num_of_tests; i++) begin string test_name; randomize_cfg(); riscv_instr::create_instr_list(cfg); riscv_csr_instr::create_csr_filter(cfg); asm_gen = riscv_asm_program_gen::type_id::create("asm_gen", , gfn); asm_gen.cfg = cfg; asm_gen.get_directed_instr_stream(); test_name = $sformatf("%0s_%0d.S", asm_file_name, i+start_idx); apply_directed_instr(); uvm_info(gfn, "All directed instruction is applied", UVM_LOW) asm_gen.gen_program(); asm_gen.gen_test_file(test_name); end ``` 根据配置文件中指定的测试数量循环执行测试: - 调用 randomize_cfg 函数,随机生成测试配置。 - 调用 create_instr_list 函数,生成指令序列。 - 调用 create_csr_filter 函数,生成 CSR 过滤器。 - 创建 riscv_asm_program_gen 组件实例 asm_gen。 - 将 cfg 对象赋值给 asm_gen 的 cfg 变量。 - 调用 get_directed_instr_stream 函数,获取指定指令流。 - 为测试生成一个文件名,格式为 asm_file_name_测试编号.S。 - 调用 apply_directed_instr 函数,应用指定指令。 - 输出一条消息,表示所有指定指令已经被应用。 - 调用 gen_program 函数,生成汇编代码。 - 调用 gen_test_file 函数,生成测试文件。 ``` endtask ``` run_phase 任务结束。 ``` virtual function void randomize_cfg(); ``` 定义一个虚函数 randomize_cfg,用于随机生成测试配置。 ``` DV_CHECK_RANDOMIZE_FATAL(cfg); uvm_info(`gfn, $sformatf("riscv_instr_gen_config is randomized:\n%0s", cfg.sprint()), UVM_LOW) ``` 调用 DV_CHECK_RANDOMIZE_FATAL 宏检查随机化过程是否成功,并输出配置信息。 ``` endfunction ``` randomize_cfg 函数结束。 ``` endclass ``` riscv_instr_base_test 类定义结束。

相关推荐

class vbase_test extends uvm_test; uvm_component_utils(vbase_test) env m_env; vseqr m_vseqr; int unsigned simSeed; function new(string name, uvm_component parent); super.new(name, parent); endfunction : new extern function void build_phase (uvm_phase phase); extern function void connect_phase (uvm_phase phase); extern task reset_phase(uvm_phase phase); extern task reset_reg_model(); extern function void end_of_elaboration_phase(uvm_phase phase); extern function void start_of_simulation_phase(uvm_phase phase); extern task main_phase(uvm_phase phase); // report test result extern virtual function void report_phase(uvm_phase phase); endclass : vbase_test function void vbase_test::build_phase (uvm_phase phase); super.build_phase(phase); m_env = env::type_id::create(.name("m_env"), .parent(this)); // virtual sequencer m_vseqr = vseqr::type_id::create(.name("m_vseqr"), .parent(this)); uvm_config_db# (uvm_object_wrapper)::set(this,"m_vseqr.main_phase","default_sequence",vBaseSeq::type_id::get()); //uvm_config_db# (uvm_object_wrapper)::set(this,"m_vseqr.main_phase","default_sequence",vUniBaseSeq#()::type_id::get()); endfunction : build_phase function void vbase_test::connect_phase (uvm_phase phase); m_vseqr.p_rm = m_env.m_reg_model; m_vseqr.i2c_seqr = m_env.m_i2c_agent.m_seqr; endfunction : connect_phase task vbase_test::reset_phase(uvm_phase phase); //uvm_info(get_type_name(), {"REGISTER MODEL:\n", m_reg_model.sprint()}, UVM_MEDIUM) reset_reg_model(); super.reset_phase(phase); endtask task vbase_test::reset_reg_model(); forever begin wait (tb_top.reset_n == 0); m_env.m_reg_model.reset(); uvm_info(get_type_name(), "Reseting Complete", UVM_MEDIUM) wait (tb_top.reset_n == 1); end endtask function void vbase_test::end_of_elaboration_phase(uvm_phase phase); int handle; $system("rm -rf TEST_RUNNING"); simSeed = $get_initial_random_seed(); handle = $fopen($psprintf("TEST_RUNNING_%0d",simSeed),"w"); $fclose(handle); handle = $fopen("caseSeed","w"); $fwrite(handle,"%0d",simSeed); $fclose(handle); if($test$plusargs("uvm_tree")) uvm_top.print_topology(); endfunction : end_of_elaboration_phase function void vbase_test::start_of_simulation_phase(uvm_phase phase); uvm_info(get_type_name(), {"start of simulation for ", get_full_name()}, UVM_HIGH); endfunction : start_of_simulation_phase task vbase_test::main_phase(uvm_phase phase); phase.phase_done.set_drain_time(this, 200ns); endtask : main_phase // report test result function void vbase_test::report_phase(uvm_phase phase); uvm_report_server server; int handle; int unsigned err_num; super.report_phase(phase); server = get_report_server(); err_num = (server.get_severity_count(UVM_ERROR) + server.get_severity_count(UVM_FATAL)); simSeed = $get_initial_random_seed(); $display("\n********************************************************************************************\n"); if (err_num != 0) begin $display("TEST CASE FAILED!!!"); handle = $fopen($psprintf("TEST_FAILED_%0d",simSeed),"w"); end else begin $display("TEST CASE PASSED!!!"); handle = $fopen($psprintf("TEST_PASSED_%0d",simSeed),"w"); end $fclose(handle); $display("\n********************************************************************************************\n"); $system("rm -rf TEST_RUNNING*"); endfunction endif

最新推荐

recommend-type

UVM_PHASE执行顺序

自己实测后整理的uvm_phase顺序 自己实测后整理的uvm_phase顺序
recommend-type

UVM_Class_Reference_Manual_1.2.pdf

UVM_Class_Reference_Manual_1.2.pdf用来查UVM中的phase啥的很是方便。目录很清晰。与之共享。
recommend-type

Linux 平台基于 Qt5 的网速浮窗.zip

Linux 平台基于 Qt5 的网速浮窗
recommend-type

RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz

REALTEK 8188FTV 8188eus 8188etv linux驱动程序稳定版本, 支持AP,STA 以及AP+STA 共存模式。 稳定支持linux4.0以上内核。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章

![:YOLOv1目标检测算法:实时目标检测的先驱,开启计算机视觉新篇章](https://img-blog.csdnimg.cn/img_convert/69b98e1a619b1bb3c59cf98f4e397cd2.png) # 1. 目标检测算法概述 目标检测算法是一种计算机视觉技术,用于识别和定位图像或视频中的对象。它在各种应用中至关重要,例如自动驾驶、视频监控和医疗诊断。 目标检测算法通常分为两类:两阶段算法和单阶段算法。两阶段算法,如 R-CNN 和 Fast R-CNN,首先生成候选区域,然后对每个区域进行分类和边界框回归。单阶段算法,如 YOLO 和 SSD,一次性执行检
recommend-type

设计算法实现将单链表中数据逆置后输出。用C语言代码

如下所示: ```c #include <stdio.h> #include <stdlib.h> // 定义单链表节点结构体 struct node { int data; struct node *next; }; // 定义单链表逆置函数 struct node* reverse(struct node *head) { struct node *prev = NULL; struct node *curr = head; struct node *next; while (curr != NULL) { next
recommend-type

c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf

校园超市商品信息管理系统课程设计旨在帮助学生深入理解程序设计的基础知识,同时锻炼他们的实际操作能力。通过设计和实现一个校园超市商品信息管理系统,学生掌握了如何利用计算机科学与技术知识解决实际问题的能力。在课程设计过程中,学生需要对超市商品和销售员的关系进行有效管理,使系统功能更全面、实用,从而提高用户体验和便利性。 学生在课程设计过程中展现了积极的学习态度和纪律,没有缺勤情况,演示过程流畅且作品具有很强的使用价值。设计报告完整详细,展现了对问题的深入思考和解决能力。在答辩环节中,学生能够自信地回答问题,展示出扎实的专业知识和逻辑思维能力。教师对学生的表现予以肯定,认为学生在课程设计中表现出色,值得称赞。 整个课程设计过程包括平时成绩、报告成绩和演示与答辩成绩三个部分,其中平时表现占比20%,报告成绩占比40%,演示与答辩成绩占比40%。通过这三个部分的综合评定,最终为学生总成绩提供参考。总评分以百分制计算,全面评估学生在课程设计中的各项表现,最终为学生提供综合评价和反馈意见。 通过校园超市商品信息管理系统课程设计,学生不仅提升了对程序设计基础知识的理解与应用能力,同时也增强了团队协作和沟通能力。这一过程旨在培养学生综合运用技术解决问题的能力,为其未来的专业发展打下坚实基础。学生在进行校园超市商品信息管理系统课程设计过程中,不仅获得了理论知识的提升,同时也锻炼了实践能力和创新思维,为其未来的职业发展奠定了坚实基础。 校园超市商品信息管理系统课程设计的目的在于促进学生对程序设计基础知识的深入理解与掌握,同时培养学生解决实际问题的能力。通过对系统功能和用户需求的全面考量,学生设计了一个实用、高效的校园超市商品信息管理系统,为用户提供了更便捷、更高效的管理和使用体验。 综上所述,校园超市商品信息管理系统课程设计是一项旨在提升学生综合能力和实践技能的重要教学活动。通过此次设计,学生不仅深化了对程序设计基础知识的理解,还培养了解决实际问题的能力和团队合作精神。这一过程将为学生未来的专业发展提供坚实基础,使其在实际工作中能够胜任更多挑战。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依
recommend-type

:YOLO目标检测算法的挑战与机遇:数据质量、计算资源与算法优化,探索未来发展方向

![:YOLO目标检测算法的挑战与机遇:数据质量、计算资源与算法优化,探索未来发展方向](https://img-blog.csdnimg.cn/7e3d12895feb4651b9748135c91e0f1a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5rKJ6YaJ77yM5LqO6aOO5Lit,size_20,color_FFFFFF,t_70,g_se,x_16) # 1. YOLO目标检测算法简介 YOLO(You Only Look Once)是一种