1

我在 Register 块中实例化了寄存器Regblock,如下所示:

DUT.Regblock.Register1
DUT.Regblock.RegisterA
DUT.Regblock.RegisterABC
...

所有这些寄存器都具有相同的内部结构。我想模拟这些寄存器中位翻转的效果。

//Here an attempt to do bit flips
bitFlipLocation = $random;
force  DUT.RegBlock.Register1.reg[bitFlipLocation] = ~DUT.RegBlock.Register1.reg[bitFlipLocation];
release DUT.ABCStar1.RegBlock.Register1.reg[bitFlipLocation];

有没有办法在DUT.Regblock.Register1, RegisterA, RegisterABC, ...内部创建一个循环RegBlock并创建这些位翻转?

4

2 回答 2

3

有办法做到这一点,但不是在 SystemVerilog 语言本身中。您可以在 C 中编写 VPI 代码来迭代块名称并使用 C API 应用强制。或者您可以使用工具特定的命令来迭代块名称并使用命令(通常是 Tcl)来施加力。

这两者都超出了本论坛可以展示的范围。

于 2017-08-23T16:57:51.567 回答
1

按照 dave 的回答,我在 C 中实现了 VPI 代码,以循环遍历其中的所有寄存器,RegBlock并在某些位置随机强制位翻转(寄存器为 32 位宽)。

#include <sv_vpi_user.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#define NULL 0

void reg_flips() {
  vpiHandle module_iter;
  vpiHandle module_obj;
  vpiHandle module_regblk;
  vpiHandle reg_nets;
  vpiHandle net;
  //Starting from the RegBlock
  module_regblk = vpi_handle_by_name("DUT.RegBlock",NULL);
  //Iterator over all register in RegBlock
  module_iter = vpi_iterate(vpiModule,module_regblk);
  while (module_iter) {
    module_obj = vpi_scan(module_iter);
    if (module_obj) {
      reg_nets = vpi_iterate(vpiReg,module_obj);
        while (reg_nets) {
          net = vpi_scan(reg_nets);
          if (net) {
            s_vpi_value val;
            val.format = vpiIntVal;
            val.value.integer = rand()%2;
            int position = rand()%32;
            //Forcing the value at a given position.
            vpi_put_value(vpi_handle_by_index(net,position),&val,NULL,vpiNoDelay);
          }
          else {
            reg_nets = NULL;
          }
        }
      }
    }
    else {
      module_iter = NULL;
    }
}
于 2017-08-24T00:11:33.580 回答