2

有没有办法为sub_block 的sub_blocks分配不同的base_address

我有一个案例,我有这样的事情:

dut.rb:

    sub_block ipBlock base_address: 0x11000000

所以这个级别的寄存器都以0x110000000开头

但是ipBlock也有自己的 sub_blocks:

ipblock.rb:

    sub_block subIPBlock base_address: 0x0

由于接口差异,它自己的寄存器需要一个 0 基地址。

不幸的是,当我向subIPBlock添加寄存器时,它们仍然具有顶级ipBlock的基地址:

sub_ipblock.rb:

    add_reg :reg0, 0x0, 16, reset: 0xFFFF ...

有没有办法轻松地重新分配 sub_block 的 sub_block 的基地址?

4

2 回答 2

2

除了其他答案,还要注意这reg.offset将返回块相对地址,这听起来像你想要的。

给定选项时,所有 Origen 驱动程序都应覆盖寄存器的地址:address,因此在您的模型中,您可以实现读/写寄存器方法来添加:address选项:

def write_register(reg, options = {})
  if your_criteria_to_use_local_address
    options[:address] = reg.offset
  end
  dut.write_register(reg, options)  # Handover for original write
end

您还可以通过实现以下方法来强制/覆盖模型中的基地址:

def reg_base_address(options = {})
  0
end

最后,请注意,当使用@rchitect-of-info 的答案的域时,您可以在实例化父子块时定义两个域,然后当您实例化该子块的子块时,您可以选择哪些可用域它被分配到。

从链接到其他答案的文档中查看此示例:

$dut.subx2.suby1.reg1.address          # => 0x2000_0300
$dut.subx2.suby2.reg1.address          # => 0x3000_0300
于 2018-05-18T13:02:11.930 回答
2

我相信您可以使用子块域来实现您想要的。

sub_block :subx2, class_name: "SubX", base_address: { ips: 0x2000_0000, ahb: 0x3000_0000 }
dut.subx1.reg1.address(domain: :ips)  # => 0x2000_0200
dut.subx1.reg1.address(domain: :ahb)  # => 0x3000_0200

问候

于 2018-05-17T12:50:42.640 回答