如何使用uvm访问基于顺序寄存器的偏移量?

时间:2019-03-11 06:49:46

标签: system-verilog uvm

我需要访问4个仅在偏移量上不同的相同寄存器。

reg布局: reg0:0x10 reg1:0x14 reg2:0x18 reg3:0x20 我使用自动工具生成uvm_block,如下所示:

class dut_reg_block extend uvm_reg_block
REG0 reg0;
REG1 reg1;
REG2 reg2;
REG3 reg3;
endclass;

support我有一个功能ConfigureDut( RegNum ),在其中我想根据 RegNum (0〜3)访问寄存器,如何优雅地实现呢?

当前,代码是这样的:

if (RegNum == 0) reg_block.reg0.read(data);
else if (RegNum == 1) reg_block.reg1.read(data);
else if (RegNum == 2) reg_block.reg2.read(data);
......

因为uvm_block是自动生成的,所以我也不能使用数组。 有人可以建议一种更好的方式访问这些寄存器吗? 谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用read_reg_by_name方法:

reg_block.read_reg_by_name(status, $sformatf("reg%0d", RegNum), data);

您使用$sformatfRegNum int的字符串中建立寄存器名称:

$sformatf("reg%0d", RegNum)

,然后利用以下事实:UVM中的每个组件都有一个名称,并且该名称应该与引用它的变量相同。