3

我有一个寄存器映射,它有 16 位宽的寄存器。我有一个大于 16 位宽的字段,所以它必须跨越两个地址。如何定义对该字段的后门访问?

这是我为我的领域尝试的test_pattern[23:0]

register_a.add_hdl_path_slice("path.to.regmap.test_pattern[15:0]", 0, 16);
register_b.add_hdl_path_slice("path.to.regmap.test_pattern[23:16]", 0, 8);

这失败并出现此错误:

错误:VPI TYPERR vpi_handle_by_name() 无法获取部件选择的句柄。

目前尚不清楚这是否是我的工具的限制,或者 UVM 代码如何使用 VPI。在 UVM 代码中四处寻找之后,我看到了应该处理部分选择的代码,但它在#ifdef QUESTA指令内部,所以我认为这是一个工具约束。

有什么好的解决方法吗?

4

3 回答 3

0

根据UVM 类参考

函数 void add_hdl_path_slice(字符串名称,
    整数偏移量,
    整数大小,
    位第一 = 0,
    字符串种类=“RTL”)

我猜解决方案应该使用offset来选择起始索引。

register_a.add_hdl_path_slice("path.to.regmap.test_pattern", 0, 16);
register_b.add_hdl_path_slice("path.to.regmap.test_pattern", 16, 8);

可能的替代方案,for循环中的位选择:

for (int i=0; i<16; i++) begin
  string tmp_path_s;
  tmp_path_s = $sformatf("path.to.regmap.test_pattern[%0d]", i);
  register_a.add_hdl_path_slice(tmp_path_s, i, 1);
end
for (int i=0; i<8; i++) begin
  string tmp_path_s;
  tmp_path_s = $sformatf("path.to.regmap.test_pattern[%0d]", i+16);
  register_a.add_hdl_path_slice(tmp_path_s, i, 1);
end
于 2014-06-13T19:41:54.103 回答
0

非常遗憾的是,贡献此代码的人(大概是Mentor?)认为有必要在ifdefs. 事实上,UVM_1_2在整个 DPI/PLI 接口文件被拆分为模拟器特定实现的分支上,情况更糟!

查看distrib/src/dpi/uvm_hdl.cgit://git.code.sf.net/p/uvm/code 的 master 分支,看起来唯一特定于 QUESTA 的代码是这个函数:

static int uvm_hdl_set_vlog_partsel(char *path, p_vpi_vecval value, PLI_INT32 flag);
static int uvm_hdl_get_vlog_partsel(char *path, p_vpi_vecval value, PLI_INT32 flag);

它使用以下 DPI 定义的值:

svLogic logic_bit;
svGetBitselLogic(&bit_value,0);
svLogicVecVal bit_value;
svGetPartselLogic(&bit_value,value,i,1);
svPutPartselLogic(value,bit_value,i,1);

理论上,如果您的模拟器和 Mentor 代码都符合标准,您可以删除ifdefs它,它应该仍然可以工作。

您也可以通过检测路径中的部件选择并用于vpi_handle_by_index读取各个位来做到这一点,任何模拟器也应该支持这一点。

请注意,我最初的回答是关于特定于 Mentor 的代码是错误的 - 感谢 @dave_59 让我直截了当并向 Mentor 道歉。

于 2014-06-16T16:40:40.630 回答
0

是否有某些原因为什么您不将其拆分为 2 个寄存器。由于您的寄存器大小为 16 位,因此声明大于此的寄存器没有意义。

我看到像这样定义的大字段的方式是声明 2 个寄存器,每个寄存器都有一个单独的字段。例如,如果您需要一个 32 位指针,您将拥有:

addr_high 带有 16 位字段 addr_low 带有 16 位字段

为方便起见,您可以添加一个按顺序访问两者的任务。

于 2015-02-17T22:51:07.280 回答