我正在使用vr_ad
e 的包。我的问题是:以下 2 个用于修改寄存器的宏有什么区别(假设foo
寄存器由 2 个字段组成:field1
和field2
):
1)
write_reg foo {.field1 == 1;};
2)
write_reg_fields foo {.field1 = 1};
我真的很感激任何帮助
这些形式之间有一个非常重要的区别。
首先,将使用所有已定义的约束 + 您在此操作中编写的约束 (field1 == 1) 生成寄存器值。新生成的值将写入 DUT。
在第二个代码中,您声明的是您只想修改寄存器的一个字段 - field1。将会发生的是 vr_ad 将从 e 模型(影子模型)获取寄存器的当前值,更改 field1 - 并将新值写入 DUT 中的寄存器。其他寄存器的字段都不会更改。此外 - 没有检查您分配给 field1 的值是否符合此寄存器上定义的约束。
让我们像一个例子一样使用它:
foo = 0xA8;
field1 = 0x8;
field2 = 0xA;
将在 foo 和 RTL 中写入一个全新的值,并且该值(使用上面的示例,其中 field1 == 1)将为 0x01;
只会更改您受约束的文件,在这种情况下 foo 的值将是 0xA1;
但除了我想说的是,在第一个示例中,您还可以通过执行以下操作获得相同的结果:
var tem_read_val: uint(bits: 8);
read_reg foo TO tem_read_val;
tem_read_val[3:0] = field1;
write_reg foo read_reg;
=> foo 是 0xA1;
从一开始我就不知道写 reg 字段,所以我不得不使用这样的东西。