许多Origen协议插件只提供顶级寄存器读写方法,这需要其中一个输入参数作为寄存器对象。如果我想写一个既不是定义的寄存器也不是内存位置的位置,即我只想写一个带数据的地址,我该怎么办呢?
答案 0 :(得分: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中具有0x4000_0000的base_address的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