gpt4 book ai didi

system-verilog - 我可以从字符串派生一个寄存器名称(在 regmodel 中可用)吗

转载 作者:行者123 更新时间:2023-12-01 12:44:41 41 4
gpt4 key购买 nike

我有一个简单的序列

 regmodel.REGx.write (...)

假设我在 regmodel 下有 8 个寄存器。 REG0, REG1, REG2,.....,REG7我想将数字作为测试加参数传递,比如 +NUM=4

使用 $sformat 或 $psprintf,我可以创建具有正确寄存器名称的字符串变量例如

  if ($value$plusargs ("NUM=%0d", num))
$display ("Testcase passed %0d num", num);
else
num = 0;
$sformat (regName, "REG%0d", num);

现在我有 regName 但我不能使用以下内容:

   regmodel.regName.write (...)

regName 是字符串类型,regmodel 没有任何寄存器名称regName,请问还有其他方法可以实现吗?我正在查看 get_name、get_full_name,但在这种情况下它们无济于事。

现在我可以有 if - else 8 次或 case 语句,但是对于大量寄存器来说真的很不方便。

最佳答案

您当然可以使用以编程方式组合的字符串找到寄存器。您将需要使用 uvm_reg_block::get_reg_by_name

用法看起来像这样:

function void write_reg_by_num(int num, bit[31:0] data);
string reg_name = $sformatf("REG%0d", num);
uvm_reg reg = regmodel.get_reg_by_name(reg_name);
if (reg == null) begin
// No reg was found... you likely want to flag an error here
end else begin
uvm_status_e status;
reg.write(status, data);
end
endfunction

请注意,生成的 uvm_reg 对象属于基类类型,因此如果您想访问各个字段,则需要使用基类方法来访问这些字段。也就是说,您需要使用 uvm_reg 上的方法,例如uvm_reg::get_field_by_name

关于system-verilog - 我可以从字符串派生一个寄存器名称(在 regmodel 中可用)吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21393970/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com