1

许多 Origen 协议插件仅提供顶级寄存器读取和写入方法,这需要输入参数之一是寄存器对象。如果我只想写入既不是定义的寄存器也不是内存位置的位置,即我只想用数据写入地址,请问我该怎么做?

4

1 回答 1

1

如果您只想写入数据并且不关心跟踪值或需要执行位级读取/存储操作,那么所有 Origen 的 read/write_register 方法都应该接受一个值来代替寄存器对象,只要您提供地址:

dut.write_register 0x1234_5678, address: 0x4000_0010

然而,更好的方法是通过读/写内存 API,这相当于上面的:

dut.mem(0x4000_0010).write!(0x1234_5678)

当您调用该 API 时,它将在后台生成一个匿名寄存器对象以跟踪值并提供位级访问。换句话说,您获得的功能与您在该位置定义了寄存器一样。

例如,如果您需要检查您在那里写的内容:

dut.mem(0x4000_0010).data    # => 0x1234_5678

您可以在位级别读取/存储,如果您使用的是 OrigenLink 或 OrigenSim 兼容的调试环境,还可以同步:

dut.mem(0x4000_0010)[15..0].read!(0x5678)

dut.mem(0x4000_0010)[31..16].store!

dut.mem(0x4000_0010).sync

内存也可以通过具有本地地址的子块访问,但是只有一个内存对象,这将返回与对应的全局地址相同的寄存器对象。例如,假设在这种情况下,我们一直在写入 DUT 中 base_address 为 0x4000_0000 的 IP 块。在该块的 Origen 模式源代码中,您可以使用相对寻址:

# From within the IP-level model/controller
mem(0x10).write!(0x1234_5678)

# Accessing the same location via a global path
dut.mem(0x4000_0010).data  # => 0x1234_5678

默认情况下,mem返回 32 位寄存器对象,并且地址必须对齐。宽度可以根据每个 DUT 进行更改:

dut.memory_width = 16

dut.mem(0x4000_0010).size   # => 16

最后,sync 方法将接受一个 size 参数,该参数对应于要读取的内存位置的数量:

(byebug) dut.mem(0x4000_0000).sync(10)
40000000: FFFE0080
40000004: 00005555
40000008: 00000000
4000000C: 00000000
40000010: 12345678
40000014: 00000000
40000018: FFFFFFFF
4000001C: FFFFFFFF
40000020: FFFFFFFF
40000024: FFFFFFFF
于 2018-03-19T16:44:42.873 回答