文章目录
一、两种寄存器访问方式
利用寄存器模型可以更方便的对寄存器进行操作。两种访问寄存器的方式是前门访问(front-door)和后门访问(back-door)。
前门访问:在寄存器模型上做的读写操作,通过总线SPI实现总线上的物理时序访问,是真实的物理操作
;
后门访问:指利用UVM DPI(uvm_hdl_read()、uvm_hdl_deposit()),将寄存器的操作直接作用到DUT内的寄存器变量,而不通过物理总线访问。
1.1.前门访问
- 下面的sequence,继承于uvm_reg_sequence。uvm_reg_sequence除了具备一般的预定义方法之外,还具有与寄存器相关的方法。
1)、第一种即uvm_reg::read( )/write( )。在传递时,用户注意将参数path指定为UVM_FRONTDOOR。uvm_reg::read()/write()方法传入的参数较多,除了status和value两个参数需传入
,其他参数若不指定,可采用默认值。
regmodel.register.write(status,value,UVM_FRONTDOOR,.parent(this)); //regmodel——寄存器模型实例名; register——寄存器实例名
regmodel.register.read(status,value,UVM_FRONTDOOR,.parent(this));
2)、第一种即uvm_reg_sequence::read_reg( )/write_reg( )。传递时,path指定为UVM_FRONTDOOR。
write_reg(regmodel.register,status,value,UVM_FRONTDOOR);
read_reg(regmodel.register,status,value,UVM_FRONTDOOR);
class apb_spi_seq extends uvm_reg_sequence;
reg_block_rgm rgm;
`uvm_object_utils(apb_spi_seq) //注册类
`uvm_declare_p_sequencer(apb_spi_sequencer) //创建p_sequencer变量,操作virtual sequence内容
...
task body();
uvm_status_e status;
uvm_reg_data_t data;
if(!uvm_config_db#(reg_block_rgm)::get(null,get_full_name(),"rgm",rgm))begin
`uvm_error("GETRGM","no top-down RGM handle is assigned")
end
rgm.ctrl.read(status,data,UVM_FRONTDOOR,.parent(this)); //1. 寄存器模型提供的方法read()/write()
rgm.ctrl.write(status,'h11,UVM_FRONTDOOR,.parent