我们在进行寄存器模型的后门操作时,必须提前设置后门操作路径,以此RAL模型方能进行操作。
``
在上面这个RAL 模型中,当调用reg_blk.reg1.write(*),参数指定是后门操作(UVM_BACKDOOR),那么RAL模型时如何取得硬件rtl的绝对路径?
核心的方法是调用reg::get_full_hdl_path,下面来讨论一下,首先reg
的rtl路径有两部分组成,分别是(1)uvm_reg_block的基路径(我们叫做reg的base_path)(2)reg本身自己的相对路径(我们叫做reg的offset_path)。
首先是reg的base_path:这个path定义在reg所在的block中(也叫做block的路径),设置block的路径的方式有两种(uvm_reg_block中有两个变量用来存放block的路径)
(1) uvm_object_string_pool #(uvm_queue#(string)) hdl_paths_pool
(2) string root_hdl_paths[string]
其中对于hdl_paths_pool,形象的表示如下
当调用reg_blk.add_hdl_path(path)时会增加一个路径,如果调用4次,则会增加4次路径,如上图所示
对于root_hdl_paths,调用reg_blk.set_hdl_path_root(root_path)来设置路径
``
那么最终block的路径是什么,答案是如果设置了root path,那么就是这个root path,如果没有设置,那么就是hdl_paths_pool中的值(在实际使用过程中只会add一次,这里假设是path1),其实这里的path1只是这个block的相对地址,怎么得到这个block的绝对地址呢,hier的概念,那么就是 parent_block的路径加上自身设置的路径。这里默认图中是block是root block。
那么reg1的路径是什么。首先base_path=path1(block的绝对路径),offset_ path是什么呢。在reg中,有一个变量叫做
uvm_object_string_pool#(uvm_queue#(uvm_hdl_path_concat)) m_hdl_paths_pool
这个变量用来保存reg自身设置的相对路径。
通过调用add_hdl_path_slice设置了相对路径path_offset。
这个时候这个reg的绝对 rtl 路径是base_path+offset_path。
举个例子:
在上图中
reg_blk.add_hdl_path("tb");reg1.add_hdl_path_splice("reg_boot");
最终这个reg的绝对路径是tb.reg_boot(实际硬件中路径)。