(4) uvm_reg_field的例化以及configure函数的调用均在uvm_reg的build函数内实现; 1functionvoid uvm_reg_field::configure(uvm_reg parent,2intunsignedsize,3intunsignedlsb_pos,4stringaccess,5bit volatile,6uvm_reg_data_t reset,7bit has_reset,8bit is_rand,9bit individually_accessible);10m_parent =pa...
UVM_PREDICT_DIRECT表示不需要经过read/write行为直接将value值更新到对应的m_mirrored和m_desired值上,并不会考虑该uvm_reg_field的m_access(访问属性)值是否可写(例如RO也会被更新),这种调用存在一定的风险,需要建立在对该uvm_reg_field足够了解,并且如果此时该uvm_reg_field所在的uvm_reg不处于空闲状态,那么pred...
reg_model.INVERT_REG.read(status, value, UVM_FRONTDOOR); 但是如果按照传统的启动sequence,发送transaction等,代码量会有几十倍的增加,而且这只是一个寄存器的访问,如果有上百个寄存器需要访问的时候,寄存器模型的加入优势就更明显了。 UVM寄存器模型的加入也带来了4个新的概念。 uvm_reg_field:这是寄存器模型中...
uvm_reg_field done_field 接下来就需要实例化这些reg_field,实例化的方式有很多,可以在status_reg中...
uvm_reg_field:包含uvm_reg_data_t类型的三个成员变量value,m_mirrored,m_desire。 uvm_reg:包含成员变量m_fields,加入各个uvm_reg_field。 uvm_reg_block:uvm_reg的集合,uvm_reg需要加入到uvm_reg_map中,且属于同一个uvm_reg_block。每个uvm_reg_block至少包含一个uvm_reg_map。uvm_reg_block中也可以再...
注2:每一个register内都有一个旗语m_atomic来确保它同时只能被一个进程访问;如果一个线程在执行过程中,被显式杀掉, 有必要调用uvm_reg::reset()释放掉它所占用的key; 注3:在实际仿真过程中,发现采用寄存器后门读一个uvm_reg_field时,没有立即返回读取值,而是隔了很久,就是因为在XatomicX中获取旗语时hang住...
1)当在uvm_reg中定义此field时,不要设置为rand类型。 2)在调用此field的configure函数时,第八个参数设置为0。 3)设置此field的类型为RO、RC、RS、WC、WS、W1C、W1S、W1T、W0C、W0S、W0T、W1SRC、W1CRS、W0SRC、W0CRS、WSRC、WCRS、WOC、WOS中的一种。
rand uvm_reg_field enable; //control for enabling the DUT `uvm_object_utils(cfs_dut_reg_config) function new(string name = "cfs_dut_reg_config"); //specify the name of the register, its width in bits and if it has coverage
uvm_reg_field:这是寄存器模型中的最⼩单位。 uvm_reg:它⽐ uvm_reg_field ⾼⼀个级别,但是依然是⽐较⼩的单位。⼀个寄存器中⾄少包含⼀个 uvm_reg_field。 uvm_reg_block:它是⼀个⽐较⼤的单位,在其中可以加⼊许多的 uvm_reg,也可以加⼊其他的 uvm_reg_block。
uvm_reg_field temp_field_h;temp_field_h=temp_reg.get_field_by_name("FIELD_NAME");temp_field_h.set(write_value);tempreg.update(status);temp_field_h.read(status, read_data);需要注意的是,需要事先调⽤ral_model_h.reset(),否则寄存器⽐特位可能不对。