逻辑上来说,GPIO相当于一个bridge结构,需要有master端和slave端,但是这里将slave端的数据驱动放到interface里做,不单独实现slave端。
相比ahbram,验证结构没有大的变化,区别是集成了寄存器模型,没有实现scoreboard,check全部实现在seq端。
寄存器集成
寄存器模型实现
1.单个寄存器定义
// OUTENCLR寄存器定义
class reg_gpio_OUTENCLR extends uvm_reg;
`uvm_object_utils(reg_gpio_OUTENCLR)
uvm_reg_field Reserved_31_16;
rand uvm_reg_field ENCLR;
function new(string name = "reg_gpio_OUTENCLR");
super.new(name, 32, UVM_NO_COVERAGE);
endfunction
virtual function void build();
Reserved_31_16 = uvm_reg_field::type_id::create("Reserved_31_16");
Reserved_31_16.configure(this, 16, 0, "RW", 1, 0, 1, 0, 1);
ENCLR = uvm_reg_field::type_id::create("ENCLR");
ENCLR.configure(this, 16, 0, "RW", 0, 0, 1, 0, 1);
endfunction
endclass
2.寄存器模型实现
class gpio_rgm extends uvm_reg_block;
`uvm_object_utils(gpio_rgm)
rand reg_gpio_OUTENCLR OUTENCLR;
......
......
rand reg_gpio_MASKLOWBYTE MASKLOWBYTE[8'hFF:0];
rand reg_gpio_MASKHIGHBYTE MASKHIGHBYTE[8'hFF:0]
uvm_reg_map map;
function new(string name="gpio_rgm");
super.new(name, UVM_NO_COVERAGE);
endfunction
virtual function void build();
this.OUTENCLR = reg_gpio_OUTENCLR::type_id::create("OUTENCLR", get_full_name());
this.OUTENCLR.configure(this, null, "");
this.OUTENCLR.build()
......
......
foreach(this.MASKLOWBYTE[i]) begin
this.MASKLOWBYTE[i] = ral_reg_rkv_gpio_MASKLOWBYTE::type_id::create($sformatf("MASKLOWBYTE[%0d]",i),get_full_name());
this.MASKLOWBYTE[i].configure(this, null, "");
this.MASKLOWBYTE[i].build();
end
......
this.map = create_map("map", 'h0, 4, UVM_LITTLE_ENDIAN);
this.map.add_reg(this.OUTENCLR, `UVM_REG_ADDR_WIFTH'h0014, "RW", 0);
......
......
lock_model();
endfunction
endclass
3.adapter实现
class gpio_reg_adapter extends uvm_reg_adapter;
`uvm_object_utils(gpio_reg_adapter)
function new(string name = "gpio_r