在UVM RAL中,reg定义为无复位值,但设置/更新a' 0' 0它上面的数据不会触发总线事务

时间:2014-08-18 09:12:58

标签: 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();
  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'值 但如果我使用设置/更新机制来编写此注册表,如果write data is 0等于R2Y中的重置值(偶数has_reset = 0),则RAL似乎会处理m_mirror == m_desired所以赢得& #39;是此reg访问的总线交易。

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

这有意义吗?我想无论我为这些类型设置哪个值,都应该总是发生总线交易。

PS:镜像和期望值是2状态向量,甚至寄存器字段设置为'不重置'如果RTL复位值为" x"例如,设计中有10个regs,我想随机选取任意数量的它们来写入它们的值,m_mirrored寄存器字段的初始值仍为0.随机值(当然,0也是合法值),似乎我会想念那些' 0' 0在这种情况下,值寄存器设置。 我现在正在使用一种解决方法,使用' write'将所有regs刷新为0值。 ral方法,它可以满足我的期望与总线上的一些额外开销

1 个答案:

答案 0 :(得分: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());