| |||
本节详细介绍该类中存在的各个method以及对应的一些member的功能。首先,reg field类是基于uvm_object继承而来,因此它包含了uvm_object的所有特性。
1.1.1. 类成员介绍
value, uvm_reg_data_t类型的带rand属性,表示可以随机。uvm_reg_data_t是一个typedef的bit流,其位宽有一个UVM_REG_DATA_WIDTH的宏决定,默认情况下该宏为64,即默认一个value的长度为64位。
m_mirrored,uvm_reg_data_t类型,且带local属性,该变量用于定义寄存器模型中的镜像值,一般仅在predict时被修改,然后用于mirror时与读出的值做check(如果check被打开的话)。
m_desired,uvm_reg_data_t类型,也带local属性,用于定义寄存器模型中的期望值,除了predict之外,还能够通过set来直接修改其值,且会在read时作为check的期望值与实际读出来的值进行比较(如果check打开的话)。当然,除了用作比较,m_desired还能够通过get函数直接获取其当前值。
m_access,string类型,用于表示当前field的访问类型。
m_parent,uvm_reg类型,表示其所属的寄存器的句柄。
m_lsb,m_size,这两个都是无符号int类型,两者合起来定义了该field在一个reg中的位置,m_lsb表示field的最低位在reg中的索引,m_size则表示本field总bit长度。
m_volatile,易失性标志位,在field中,当该位为1,表示每次调用needs_update时都会返回1,即每次在用户check该寄存器是否需要update时,该field的返回都是需要update。
m_reset,string为索引的uvm_reg_data_t数组,索引用来记录复位类型,数组元素则表示了复位值。例如如果需要设置“HARD”类型的复位值为0,则表示为m_reset["HARD"] = 0,不同的用户定义复位类型和复位值都将通过一个set_reset实现,具体在后续章节描述该函数。
m_written,bit标识位,用来表示field是否已经被写过一次,该标志位主要是针对UVM自定义的“W1”,和“WO1”类型的寄存器,即该种寄存器在HARD reset之前只能够被修改一次值,m_written目前主要作用在set函数中,对于W1/WO1类型寄存器,在HARD reset之前仅可修改一次m_desired值。
m_read_in_progress,m_write_in_progress,两个标志位,表示当前field正处于读/写状态。
m_fname,m_lineno,string 类型的m_fname和int类型的m_lineno,基本上在各个函数中都作为参数开放给用户,一般可用于调试,获取调用信息,即函数在哪个文件的哪一行被调用。
m_cover_on,int类型,coverage的指示位(TBD)
m_individually_accessible,bit类型标志位,用于指示field是否可以被单独access,如果不行,则每次对field进行类似write的操作,都将调用整个reg的write进行,否则将直接在field中执行reg中write相似的操作。
m_check,uvm_check_e枚举类型,包含UVM_NO_CHECK和UVM_CHECK,如果是UVM_CHECK则表示该field在read操作时会做check,否则跳过,另外这里还要注意,如果m_volatile是1,则m_check将在初始化时默认设置位no check模式。
m_max_size,这是一个static的int类型,表示对所有的uvm_reg_field类有效,该变量会在configure中起作用,用于记录所有有效的uvm_reg_field类中,最大的那个m_size。
m_policy_names,static类型,以string为索引的数组,用于记录合法的access类型,UVM会自定义许多寄存器类型,包括一些常用的“RW”,“RO”,“WC”等等。所以虽然UVM开放了可自定义新的access类型,但通常我们都不需要去额外做这些。
1.1.2. new
构造函数,除了调用super.new之外没有执行额外动作。
1.1.3. configure
最常用的一个函数,通常在该field所在的reg中被调用,包含了field需要的一系列操作,具体参数请参阅官方文档或者源代码,这里介绍一下其执行过程。
· 首先配置m_parent,在类成员介绍中提过,m_parent表示包含它的寄存器句柄,所以在函数的参数中会有一个parent参数,在此赋值给m_parent;
· 配置m_size,即field大小,以bit为单位,根据size参数进行设置,在赋值给m_size之前会先对size做一个检查,如果size为0,则打印一个warning,并将size设置为1,然后在赋值给m_size,即m_size最小需要设置为1
· m_volatile,从volatile参数赋值
· m_access,从access参数赋值,这里会将access转换为大写赋值给m_access,即在调用configure时,access可以用小写字符串
· m_lsb,从lsb_pos参数获取
· m_cover_on,默认设置为UVM_NO_COVERAGE
· m_written,初始为0
· m_check,这里会根据m_volatile配置默认值,如果volatile为1,则NO_CHECK,否则CHECK
· m_individually_access,从individually_access参数获取
· 如果has_reset为1,给HARD类型配置复位值,即m_reset["HARD"] = reset,这里的reset就是函数的另一个参数, 否则通过UVM的resource_db机制设置一个NO_REG_HW_RESET_TEST,用于在UVM自带的reset测试中忽略该reg field。
· 调用m_parent的add_reg,用于将该reg field和包含它的reg关联起来。
· 检查m_access,如果不在已定义的m_policy_names中,则报错,并且将m_access设置为“RW”类型。
· 设置m_max_size,前面提到过,m_max_size就是表示所有reg field中最大的m_size,这段代码就是用于比较并且记录最大的m_size。
· 根据m_access类型,如果access为RO,RC,RS,WC,WS,W1C,W1S,W1T,W0C,W0S,W0T,W1CRS,W1SRC,W0CRS,W0SRC,WSRC,WCRS,WOC,WOS时,value的random功能将被关闭
· 除了上述的情况,如果is_rand参数在调用时给0,那么value的random属性也将被关闭
TBD