在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 值,它可以满足我的期望,并在总线上有一些额外的开销