目录
一、建立寄存器模型步骤
1、在文件timer_regmodel.sv中:
首先声明寄存器(只举两个寄存器为例):
声明寄存器块:
2、Adapter的实现:
Adapter桥接器的作用:
timer_reg_adapter中:
3、Adapter等的集成
timer_env中:
(1)、声明:
编辑
(2)、例化:
(3)、连接:
4、寄存器模型访问
timer_base_virtual_sequence中
寄存器模型的复位:
timer_integration_virt_seq中
寄存器访问和检查:
read和write任务:
mirror操作:
5、timer_base_test中
uvm_reg_map:
用于存储寄存器映射的实例,用于在寄存器块中访问寄存器映射。
调用build()函数才能创建uvm_reg,调用uvm_reg里的field等的例化配置
adapter、squencer、map三者的关系,首先需要在环境(一般在env层次时)需要连接三者通过map.set_sequencer(squencer,adapter);因为本身rgm充当sequence,adapter充当转换的桥梁,而rgm中因为有lock_model只有map能访问内部reg的field,而对于传到bus上也需要用bus的sequencer进行和drv的传递,所以三者是要关联的,这样adapter才能工作。
这里使用了predictor的显式预测,如下:
只用声明例化preditor,并且将map和adapter的句柄给它内部的map和adapter,monitor上要是analysis port然后连接到它的bus_in端口。//预定义好的bus_in analysis port
声明了rgm句柄和一个变量uvm_status_e(详细看看用法)
task body();
fork
wait_reset_asserted(); //复位函数
join_none
endtask
task wait_reset_asserted();
forever begin
@(negedge vif.apb_rstn);
rgm.reset();
end
endtask
read任务的原型为:
extern virtual task read(output uvm_status_e status,
output uvm_reg_data_t value,
input uvm_path_e path = UVM_DEFAULT_PATH,
input uvm_reg_map map = null,
input uvm_sequence_base parent = null,
input int prior = -1,
input uvm_object extension = null,
input string fname = "",
input int lineno = 0);
write任务的原型为:
extern virtual task write(output uvm_status_e status,
input uvm_reg_data_t value,
input uvm_path_e path = UVM_DEFAULT_PATH,
input uvm_reg_map map = null,
input uvm_sequence_base parent = null,
input int prior = -1,
input uvm_object extension = null,
input string fname = "",
input int lineno = 0);
task uvm_reg::mirror(output uvm_status_e status,
input uvm_check_e check = UVM_NO_CHECK,
input uvm_path_e path = UVM_DEFAULT_PATH,
…);
主要进行寄存器块rgm句柄的顶层例化,并将句柄传递给下层environment