注册抽象层差异访问类型

时间:2015-10-06 05:45:04

标签: verilog system-verilog uvm

我正在使用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 个答案:

答案 0 :(得分:0)

您可以尝试使用write函数中的extension参数将其他信息(如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));