在ral_gen的时候,如果某个field独占了一个byte,或独占了byte的倍数时,ral认为是可以进行单独field的访问的,因此ral_gen出来的ral_model中,针对field的configure函数,其中individually_accessible会被configure 为1,其余不符合条件的field会被configure 0,即认为不可以进行单独field的访问。
但实际上,即使是individual_accessible被配置成0,但调用field write or read,依旧可以完成该field寄存器的读写。这是因为ral在task内部又做了一层调整,当检测到进行该类field的读写时,ral会改变读写类型为UVM_REG,即调用父类的do_write去完成整个寄存器的访问以达到目的。并且会实时根据该reg下其余field的实际值(通过mirror拿到),以及目标访问field的期待值,进行value_adjust,最终达到了不破坏其余field的实际值条件下,并完成了目标field的dut寄存器值的更新。
对于大部分用于访问寄存器的总线来说,应该都是支持最小单位为1byte的寄存器访问,即若是总线为32bit,也可以单独只访问其中的某一个byte。
若DUT的寄存器访问总线不支持对单个BYTE进行访问(只能以REG进行访问),那就需要配置define UVM_REG_NO_INDIVIDUAL_FIELD_ACCESS。这样当环境中调用field访问时,不论该field的individual_accessible是0还是1,都会转化为REG访问。