uvm寄存器模型学习笔记(四)

对于连续地址的读写,需用uvm_mem;

分两种情况:

情况1:总线支持一次性读写多个寄存器地址;

情况2:总线不支持一次性读写多个寄存器地址

对于情况1,仍然用write和read,只是在参数传递时用extension,value仍然是单个数值

对于情况2,用burst write和burst read,value用队列或数组的形式,寄存器模型会自动拆分成多次读写单个寄存器,比如连续读16个寄存器,value的数组或队列的大小定为16,寄存器模型会自动拆成16个tr发给driver

以下是针对情况1的编写

reg_model编写:

class data_fifo extends uvm_mem;
    function new(string name = "data_fifo");
        super.new(name,14,8);//一共14个地址,地址宽度8bit
    endfunction
    `uvm_object_utils(data_fifo)
endclass


class reg_model extends uvm_reg_block;
    `uvm_object_utils(reg_model)

    rand        data_fifo        mm;
    
    virtual function void build();
        `uvm_info(get_name(),"build function is called",UVM_LOW)
        default_map = create_map("default_map",0,1,UVM_BIG_ENDIAN,0);
        mm = data_fifo::type_id::create("mm", , get_full_name());

        mm.configure(this,"top_e.regs");//hdl路径
        default_map.add_mem(mm,8'h00);//从偏移地址00开始
        
    endfunction

endclass

adapter reg2bus编写

function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw);
        uart_transaction    ext,tr;        
        uvm_reg_item reg_item = get_item();        
        tr = new("tr");
        if (reg_item.extension != null && $cast(ext, reg_item.extension)) begin
            tr.addr = rw.addr;
            tr.wr_pro = (rw.kind == UVM_READ) ? 1'b0 : 1'b1;
            
            if(tr.wr_pro)begin
                tr.reg_len = ext.reg_len;
                tr.w_data = new[tr.reg_len];
                foreach(tr.w_data[i])
                    tr.w_data[i] = ext.w_data[i];
            end
        end
        tr.frame_head = 16'h55AA;
        tr.crc_cal();
        tr.print();
        return tr;
    endfunction

在参考模型的main phase里发起一次写14个寄存器

uart_transaction     ext;

    uvm_status_e        status;
    uvm_reg_data_t         value;

    
    ext = new();
    ext.wr_pro = 1;
    ext.reg_len = 14;
    ext.w_data = new[14];
    // 准备要写入的数据
    for (int i = 0; i < 14; i++) 
        ext.w_data[i] = i;

    p_rm.mm.write(
    .status(status),
    .offset(0),
    .value(value),
    .fname(""),          
    .extension(ext),
    .path(UVM_FRONTDOOR)
);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值