2015-10-06 23 views
0

我正在写一组使用uvm_reg类的注册模型。单独的寄存器大小是8位。创建寄存器块来包含那些寄存器:注册抽象层差异访问类型

class my_reg_block extends uvm_reg_block; 
    my_byte_reg reg_00; 
    my_byte_reg reg_01; 
    my_byte_reg reg_10; 
    my_byte_reg reg_11; 
    ... 
    // build() 
    my_map.add_reg(reg_00, 32'h0000 /*offset*/, ""RW"); 
    my_map.add_reg(reg_01, 32'h0001 /*offset*/, ""RW"); 
    my_map.add_reg(reg_10, 32'h0002 /*offset*/, ""RW"); 
    my_map.add_reg(reg_11, 32'h0003 /*offset*/, ""RW"); 
    ... 

我有一个注册适配器,将读/写转换为总线事务。 所以,我能够做到这一点我的序列中:

reg_00.write(status, 'hff, .parent(this)); 

总线事务会做写入到特定的寄存器:reg_00

我的问题是总线有byte_enable,它允许它在双字访问中跨4个寄存器写入。使用上面的现有寄存器模型,是否可以同时写入/读入4个寄存器?还是需要创建另一组寄存器(32位大小)? 这将是这样的伪代码:

{reg_11,reg_10,reg_01,reg_00}.write(status, 'hffffffff, .parent(this)); 

什么建议吗?

+1

好像你正在寻找突发传输。可能[此链接](http://stackoverflow.com/questions/23143815/using-burst-read-write-with-register-model)可以帮助。 – sharvil111

回答

0

您可以尝试在write函数中使用扩展参数将其他信息(如byte_enable)传递给适配器。然后,如果这是一个合法的双字交易并且相应地分配总线交易字段,那么适配器可以相应地决定。看到序列在下面

virtual function uvm_sequence_item reg2bus(const ref uvm_reg_bus_op rw); 
bus_trans   trans; 
uvm_reg_item   item; 
regtrans_params   params; 


item     = get_item(); 
trans     = bus_trans::type_id::create("trans"); 

if(item.extension == null) 
    `uvm_fatal("", "item.extension==null !!") 
if(!$cast(params, item.extension)) 
    `uvm_fatal("", "FAILED $cast(params, item.extension) !!") 

trans.dst_chip_addr    = params.chip_addr; 

部分例如:

block.reg_00.write(status, 32'hfffffffff .extension(params)); 
+0

此方法适用于我,谢谢。 – AldoT