1.寄存器模型
硬件的各个功能模块由处理来配置功能以及访问状态,而与处理器的对话是通过寄存器的读写来实现的。
寄存器的硬件实现是通过触发器,而每一个比特位的触发器都对应着寄存器的功能描述
一个寄存器由32个比特位构成,将单个寄存器拆分之后,又可以分为多个域(field),不同的域
代表着某一项独立的功能。不同的域,对外部的读写而言,又分为WO(write-only),RO(read-only,只读)和RW(read and write,读写),还有一些特殊行为(quirky)的寄存器,例如读后擦除模式(clean-on-read,RC),只写一次模式(write-on-to-set, W1S)
多个寄存器构成寄存器模型,属于验证环境的寄存器模型可以抽象化层次模型。
对功能验证而言,总线访问寄存器的方式抽象为寄存器模型访问的模式,这种方式使得寄存器后期的地址修改。
中心管理的寄存器描述文件:软件建立寄存器的方法与硬件寄存器保持一致
验证工程师会利用寄存器描述文件来生成uvm寄存器模型,以供验证过程中的激励使用,寄存器测试和功能覆盖率收集
uvm_reg_field:用来针对寄存器功能域来构建对应的比特位
uvm_reg:与寄存器相匹配,其内部可以例化和配置多个uvm_reg_field对象
uvm_mem:匹配硬件存储模型
uvm_reg_map:用来指定寄存器列表中各个寄存器的偏移地址,访问属性以及对应的总线
uvm_reg_block:可以容纳多个寄存器(uvm_reg),存储器(uvm_mem)和寄存器列表(uvm_reg_map)
class ctrl_reg extends uvm_reg;
`uvm_object_utils(ctrl_reg)
uvm_reg_field reserved;
rand uvm_reg_field pkt_len;
rand uvm_reg_field prio_level;
ranf uvm_reg_field chnl_en;
function new(string name = "ctrl_reg");
super.new(name, 32, UVM_NO_COVERAGE);
endfunction
virtual function build();
reserved = uvm_reg_field::type_id::create("reserved");
pkt_len = uvm_reg_field::type_id::create("pkt_len");
prio_level = uvm_reg_field::type_id::create("prio_level");
chnl_en = uvm_reg_field::type_id::create("chnl_en");
reserv