为什么Do not call super.build_phase() from any class that is extended from an UVM base class!
时间: 2024-02-26 21:51:57 浏览: 172
在UVM中,每个类都是从uvm_object或其子类派生而来的。这些基类中的build_phase()函数都是纯虚函数,必须在子类中实现。由于这些基类中的build_phase()函数没有实现,因此在使用UVM时,不应该在任何扩展自UVM基类的类中调用super.build_phase(),否则会导致编译器错误。
如果一个类扩展自UVM基类,它应该实现自己的build_phase()函数,并且不需要调用基类的build_phase()。在build_phase()函数中,应该调用uvm_component::build_phase(),这是一个静态函数,它会初始化UVM组件的所有属性和配置。
相关问题
`ifndef BASE_TEST__SV `define BASE_TEST__SV class base_test extends uvm_test; my_env env; function new(string name = "base_test", uvm_component parent = null); super.new(name,parent); endfunction extern virtual function void build_phase(uvm_phase phase); extern virtual function void report_phase(uvm_phase phase); `uvm_component_utils(base_test) endclass function void base_test::build_phase(uvm_phase phase); super.build_phase(phase); env = my_env::type_id::create("env", this); endfunction function void base_test::report_phase(uvm_phase phase); uvm_report_server server; int err_num; super.report_phase(phase); server = get_report_server(); err_num = server.get_severity_count(UVM_ERROR); if (err_num != 0) begin $display("TEST CASE FAILED"); end else begin $display("TEST CASE PASSED"); end endfunction `endif
这是一段 System Verilog 代码,定义了一个名为 base_test 的类,继承自 uvm_test。在 build_phase 和 report_phase 函数中分别进行了测试环境的创建和测试结果的报告。
下面代码的作用是什么:class scp_2_pdma_mem2perip_burst_test extends base_test; `uvm_component_utils (scp_2_pdma_mem2perip_burst_test) virtual function void test_cfg(); endfunction function new (string name="scp_2_pdma_mem2perip_burst_test", uvm_component parent=null); super.new (name, parent); endfunction : new function void build_phase(uvm_phase phase); super.build_phase(phase); endfunction : build_phase task run_phase(uvm_phase phase); ahb1_spi0_std_mode_sequence ahb1_spi0_std_mode_seq; ahb_master_8corecfg_sequence ahb_mst_8ccfg_seq; sysctrl_dma_config_sequence stsctrl_dma_seq; pdma_config_mem2perip_burst_sequence pdma_cfg_mem2perip_burst_seq; super.run_phase(phase); ahb1_spi0_std_mode_seq = ahb1_spi0_std_mode_sequence::type_id::create("ahb1_spi0_std_mode_seq"); ahb_mst_8ccfg_seq = ahb_master_8corecfg_sequence::type_id::create("ahb_mst_8ccfg_seq"); stsctrl_dma_seq = sysctrl_dma_config_sequence::type_id::create("stsctrl_dma_seq"); pdma_cfg_mem2perip_burst_seq = pdma_config_mem2perip_burst_sequence::type_id::create("pdma_cfg_mem2perip_burst_seq"); phase.raise_objection(this); // seq.starting_phase = phase; ahb1_spi0_std_mode_seq.start(env.scp_2_8core_master_agent.sequencer); ahb_mst_8ccfg_seq.start(env.scp_2_8core_master_agent.sequencer); stsctrl_dma_seq.start(env.scp_2_8core_master_agent.sequencer); pdma_cfg_mem2perip_burst_seq.start(env.scp_2_8core_master_agent.sequencer); phase.drop_objection(this); endtask endclass
这段代码定义了一个类 "scp_2_pdma_mem2perip_burst_test",它是 "base_test" 类的子类,并且使用了 UVM (Universal Verification Methodology)框架。这个类包含以下成员函数:test_cfg() 和 new(),以及 build_phase() 和 run_phase() 函数,它们均重写了 base_test 中对应的函数。在 run_phase() 函数中,定义了四个不同的 sequence,然后启动这四个 sequence,实现对 "env.scp_2_8core_master_agent" 中的 sequencer 的控制。这段代码可能是用于硬件验证的测试代码。
阅读全文