SystemVerilog循环遍历层次结构

时间:2017-08-23 16:52:57

标签: c system-verilog vpi

我在寄存器块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上创建循环并创建这些位翻转?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

根据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;
    }
}