System verilog 在UVM RAL中,定义为无重置值的reg,但在其上设置/更新“0”数据不会触发总线事务

System verilog 在UVM RAL中,定义为无重置值的reg,但在其上设置/更新“0”数据不会触发总线事务,system-verilog,uvm,System Verilog,Uvm,在ral文件中,我有如下内容: class ral_reg_AAA_0 extends uvm_reg; rand uvm_reg_field R2Y; constraint R2Y_default { } function new(string name = "AAA_0"); super.new(name, 32,build_coverage(UVM_NO_COVERAGE)); endfunction: new virtual function void build();

在ral文件中,我有如下内容:

class ral_reg_AAA_0 extends uvm_reg;
rand uvm_reg_field R2Y;

constraint R2Y_default {
}

function new(string name = "AAA_0");
    super.new(name, 32,build_coverage(UVM_NO_COVERAGE));
endfunction: new
virtual function void build();
  this.R2Y = uvm_reg_field::type_id::create("R2Y",,get_full_name());
  this.R2Y.configure(this, 12, 4, "RW", 0, 12'h0, 0, 1, 1);
endfunction: build

`uvm_object_utils(ral_reg_AAA_0)

endclass : ral_reg_AAA_0
env.regmodel.AAA_0.R2Y.set(0);
env.regmodel.AAA_0.write(status, env.regmodel.AAA_0.get());
您可以发现R2Y设置为has_reset=0,在实际RTL中,它默认为“X”值 但如果我使用设置/更新机制来写入这个reg,如果写入数据为0,这等于R2Y中的重置值,甚至有_reset=0,似乎RAL会将m_mirror==m_视为所需,所以这个reg访问不会有总线事务

like
env.regmodel.AAA_0.R2Y.set(0);
env.regmodel.AAA_0.update(status,UVM_FRONTDOOR);
这有意义吗?我认为,无论我将哪一个值设置为这类regs,都应该始终有总线事务发生

PS:镜像和期望值是2状态向量,即使reg字段设置为“无重置”值,reg字段的m_镜像初始值仍然为0。如果RTL重置值为x,例如,设计中有10个寄存器,我想随机选取任意数量的寄存器,用随机值写入它们。当然,0也是一个合法值,在这种情况下,似乎我将错过那些“0”值寄存器设置。
我现在正在使用一种解决方法,使用“写入”ral方法将所有REG刷新为0值,它可以通过总线上的一些额外开销来满足我的期望。镜像值和所需值的内部表示为2状态向量,并按字段存储。这意味着在创建时,R2Y字段的镜像值为0。通过将所需值设置为0,值仍然相同,这就是没有启动总线事务的原因。如果要强制执行总线事务,只需使用写入。。。方法:

如果您仍然想使用set。。。要使用寄存器字段,可以尝试以下操作:

class ral_reg_AAA_0 extends uvm_reg;
rand uvm_reg_field R2Y;

constraint R2Y_default {
}

function new(string name = "AAA_0");
    super.new(name, 32,build_coverage(UVM_NO_COVERAGE));
endfunction: new
virtual function void build();
  this.R2Y = uvm_reg_field::type_id::create("R2Y",,get_full_name());
  this.R2Y.configure(this, 12, 4, "RW", 0, 12'h0, 0, 1, 1);
endfunction: build

`uvm_object_utils(ral_reg_AAA_0)

endclass : ral_reg_AAA_0
env.regmodel.AAA_0.R2Y.set(0);
env.regmodel.AAA_0.write(status, env.regmodel.AAA_0.get());

谢谢你的回复,是的,直接写信总是有效的,但在我的情况下,直接打电话给“写信”并不方便。我想利用RAL block RANDOMISE来执行寄存器随机程序,就像我使用reg.setvalue来更新某些reg的所需值一样,那么我不需要关心哪些reg需要更新,只需调用reg_block.get_registerRegs;ifregs.size=0 begin foreach regs[i]begin regs[i]。updatestatus,UVM_前门;我回答错了。我写了“更新。。。而不是写。。。请再看一遍,这正是我编写第二段代码的原因。您只需应用reg.get即可返回所需的值,即通过调用randomize更改的值。你只要把它插入write,它就可以做你想做的事情。