SystemVerilog 遍历层次结构
SystemVerilog looping through hierarchy
我在寄存器块 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];
有没有办法在 RegBlock
内的所有 DUT.Regblock.Register1, RegisterA, RegisterABC, ...
上创建一个循环并创建这些位翻转?
有很多方法可以做到这一点,但不是在 SystemVerilog 语言本身。您可以在 C 中编写 VPI 代码以迭代块名称并使用 C API 应用力。或者您可以使用特定于工具的命令来迭代块名称并使用命令(通常是 Tcl)来施加力。
这两个都超出了本论坛可以展示的范围。
根据 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;
}
}
我在寄存器块 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];
有没有办法在 RegBlock
内的所有 DUT.Regblock.Register1, RegisterA, RegisterABC, ...
上创建一个循环并创建这些位翻转?
有很多方法可以做到这一点,但不是在 SystemVerilog 语言本身。您可以在 C 中编写 VPI 代码以迭代块名称并使用 C API 应用力。或者您可以使用特定于工具的命令来迭代块名称并使用命令(通常是 Tcl)来施加力。
这两个都超出了本论坛可以展示的范围。
根据 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;
}
}