0

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

您可以发现R2Y设置为has_reset = 0,在实际 RTL 中,它是'X'默认值,但如果我使用设置/更新机制来编写此 reg,如果write data is 0等于 R2Y 中的重置值(偶数has_reset = 0),似乎 RAL 会处理m_mirror == m_desired所以赢了'不是此 reg 访问的总线事务。

like
env.regmodel.AAA_0.R2Y.set(0);
env.regmodel.AAA_0.update(status,UVM_FRONTDOOR);

那有意义吗?我认为无论我为这些 regs 设置哪个值,都应该总是发生总线事务。

PS:mirrored和desired values都是2-state向量,即使reg字段设置为'no reset'值,reg字段的m_mirrored初始值仍然为0。如果RTL复位值为“x”,例如,有设计了10个寄存器,我想随机选取其中任意个写成随机值(当然,0也是合法值),看来我会错过这种情况下的那些'0'值寄存器设置。我现在正在使用一种解决方法,使用“写入”ral 方法将所有 regs 刷新为 0 值,它可以满足我的期望,并在总线上有一些额外的开销

4

1 回答 1

0

镜像值和期望值的内部表示是 2 状态向量,并存储在每个字段的基础上。这意味着在创建时,您的R2Y字段的镜像值为 0。通过将期望值设置为 0,值仍然相同,这就是不启动总线事务的原因。如果要强制进行总线事务,只需使用以下write(...)方法:

env.regmodel.AAA_0.write(status, 0);  // this will write the value '0' to the register

如果您仍然想使用set(...)注册字段,那么您可以尝试以下操作:

env.regmodel.AAA_0.R2Y.set(0);
env.regmodel.AAA_0.write(status, env.regmodel.AAA_0.get());
于 2014-08-18T13:59:58.297 回答