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