首页 > 学院 > 开发设计 > 正文

UVM的config机制(五)

2019-11-06 07:25:10
字体:
来源:转载
供稿:网友

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表