wis*_*key 3 system-verilog uvm
我有一个简单的序列
regmodel.REGx.write (...)
Run Code Online (Sandbox Code Playgroud)
让我们考虑一下我在 regmodel viz 下有 8 个寄存器。REG0, REG1, REG2,....,REG7 我想通过 number 作为测试加参数,比如 +NUM=4
使用 $sformat 或 $psprintf,我可以创建具有正确寄存器名称的字符串变量,例如
if ($value$plusargs ("NUM=%0d", num))
$display ("Testcase passed %0d num", num);
else
num = 0;
$sformat (regName, "REG%0d", num);
Run Code Online (Sandbox Code Playgroud)
现在我有 regName 但我不能使用以下内容:
regmodel.regName.write (...)
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
请注意,生成的uvm_reg对象是基类类型的,因此如果要访问单个字段,则需要使用基类方法来访问字段。也就是说,您需要使用上的方法uvm_reg,例如uvm_reg::get_field_by_name