Config机制 本质是半个全局变量 Config机制是用来传递数据的 比如在case(派生自uvm_test)中build_phase中可如下配置: Uvm_config_db#(int)::set(this,”env.agent.driver”,”PRe_num_max”,100); 在driver中的build_phase中设置为: Uvm_config_db#(int)::get(this,””,”pre_num_max”,pre_num_max); Set中的第一个参数:说明哪个component对pre_num_max进行了设置,一般是this 第二个参数:从调用uvm_config_db::set的地方看下去,要设置的变量所在的路径 第三个参数:表示一个记号,说明这个值给driver的哪个变量 第四个参数:要设置的值 Get中的一个参数一般也是this 第二个参数填写空的字符串 第三个参数:和set中的第三个参数匹配起来 第四个参数:要设置的变量 只要保证第三个参数一致即可
省略get的config 当要传递多个变量时可以使用field_automation机制将get的变量注册。 Class mac_driver extends uvm_driver#(mac_transaction); Int pre_num_max; ……. uvm_component_utils_begin(mac_driver)
uvm_field_int(pre_num_max,UVM_ALL_ON) ……. `uvm_component_utils_end …… Endclass
跨层次的多重set(set几次,get一次):层次越高,set的优先级越高 同一层次的多重set:处于同一层次时,时间优先
聚合config变量:: 当涉及到要配置的参数成百上千,则可以考虑将所有变量放在专门的类中实现: Class iconfig extends uvm_object; Rand int var1; ……. Rand int var10000; Constraint default_cons{ Var1 = 7; …… Var10000 = 9999; } uvm_object_utils_begin(iconfig)
uvm_field_int(var1,UVM_ALL_ON) ………. `uvm_object_utils_end Endclass
在base_test中则这样写: Class base_test extends uvm_test; Iconfig cfg; Function void build_phase(uvm_phase phase); Super.build_phase(phase); Cfg = iconfig::type_id::create(“cfg”); Uvm_config_db#(iconfig)::set(this,:env_agent.driver”,”cfg”,cfg); …….. Endfunction Endclass 这样省略了大多数set语句,但在相应的driver中则需要这样写: Class mac_driver extens uvm_driver#(mac_transaction); Iconfig cfg; uvm_component_utils_begin(mac_driver)
uvm_field_object(cfg,UVM_ALL_ON | UVM_REFERENCE) `uvm_component_utils_end Extern task main_phase(uvm_phase phase); Endclass
Task mac_driver::main_phase(uvm_phase phase); Super.main_phase(phase); While(1) begin Seq_item_port.get_next_item(req); Pre_num = $urand_range(cfg.pre_num_min,cfg.pre_num_max); …. End Endtask
如果需要在某个case中改变某个变量值,则可以: Class case100 extends base_test; Function void build_phase(uvm_phase phase); Super.build_phase(phase); Cfg.pre_num_max = 100; Cfg.pre_num_min = 8; …. Endfunction Enclass
实时的改变config值 有时候,当运行到DUT的某一时刻,需要改变验证平台的某些配置参数。这种情况可以通过virtual sequence的方式实现 Class vsequencer extends uvm_sequencer; Iconfig; ……. Endclass
Class base_test extends uvm_test; Iconfig cfg; Vsequencer vsqr; Function void build_phase(uvm_phase phase); Super.build_phase(phase); Cfg = iconfig::type_id::create(“cfg”); Vsqr = vsequencer::type_id::create(“vsqr”,this); Vsqr.cfg = this.cfg; …. Endfunction Endclass
Class vseq_extends uvm_sequence; uvm_object_utils(vseq)
uvm_declare_p_sequencer(vsequencer) Task body(); …… P_sequencer.cfg.pre_num_max=99; ….. Endtask Endclass
新闻热点
疑难解答