在之前的文章(通过后门访问寄存器和后门访问HDL路径)中,我们使用了configure,add_hdl_path和add_hdl_path_slice,然后这些函数神奇地创建了HDL路径。 作为一名用户,这很好,但作为一名专家,你想知道后面发生了什么吗? 这篇文章将带你窥探一下后门访问的背后。
寄存器块的HDL路径
寄存器块将其HDL路径存储在队列中。 确切地说,它可以有多个队列(在以字符串为键的池中)。 默认键是“RTL”。 例如,您可以在拨打电话时指定按键:
add_hdl_path( string path, string kind = "RTL" );
clear_hdl_path( string kind = "RTL" );
在那里使用种类参数作为键。 我们可以在配置寄存器块时指定HDL路径:
configure( uvm_reg_block parent = null, string hdl_path = "" );
通过调用add_hdl_path,我们也可以拥有多个HDL路径。如果您有多个HDL路径,您可以一次read/write/peek/poke多个物理寄存器(如果write或poke的值相同)。请注意,即使您有多个读取值,read和peek也只会返回路径上的第一个读取值。下图说明了如何将HDL路径存储在池和队列中。
HDL路径在寄存器块中如何存储
寄存器模型的HDL路径切片
与寄存器块类似,寄存器模型将HDL路径片段存储在队列中,但方式稍微复杂一些。由于切片具有偏移量和大小信息,切片首先被构造为uvm_hdl_path_slice。然后,属于同一个物理寄存器的片被分组到一个uvm_hdl_path_concat对象中。我们可以在队列中有多个uvm_hdl_path_concat。如果您有多个uvm_hdl_path_concat,您可以一次read/write/peek/poke多个物理寄存器(如果write或poke时,则具有相同的值)。请注意,即使您有多个读取值,read和peek也只会返回路径上的第一个读取值。像寄存器块一样,寄存器模型可以在以字符串为键的池中有多个队列。默认密钥是“RTL”。例如,您可以在拨打电话时指定按键:
add_hdl_path ( uvm_hdl_path_slice slices[], string kind = "RTL" );
add_hdl_path_slice( string name, int offset, int size, bit first = 0, string kind = "RTL" );
clear_hdl_path ( string kind = "RTL" );
在那里使用种类参数作为关键。请注意,add_hdl_path采用上面提到的uvm_hdl_path_slice的动态数组。该函数创建一个新的uvm_hdl_path_concat来存储指定的切片。同样,如果add_hdl_path_slice的第一个参数为1,则会创建一个新的uvm_hdl_path_concat来存储指定的切片。下图说明了如何将HDL路径存储在池和队列中。
HDL路径在寄存器模型中如何存储
Jelly-Bean寄存器块的HDL路径

Jelly-Bean寄存器的HDL路径切片
我希望这篇文章能够帮助你更详细地理解HDL路径。