c - 无法访问 svOpenArrayHandle 的维度

标签 c system-verilog uvm questasim system-verilog-dpi

我的 SystemVerilog 测试台中有一个多维动态解压缩数组,我使用 DPI-C 将其作为参数传递到 C 代码中。我正在使用 Questasim 10.4b。按照 Questa 的流程,我运行 -dpiheader 来生成头文件并将其包含在我的 C 代码中。

SystemVerilog:

// C function declaration
import "DPI-C" function void modulate_my_frame (input byte data[][]);

// multidimensional array
byte unsigned frame_packed[][];

// assume this is randomized in my testbench
int num_frames = 5;

// init 1st dimension
frame_packed = new[num_frames];

// iterate through num_frames
for (int num_frame = 0; num_frame < num_frames; num_frame++) begin

  // item
  noob_frame fr = noob_frame::type_id::create("noob_frame");

  // randomize
  if (!noob_frame.randomize()) `uvm_error(get_name(), "Cannot randomize noob_frame");

  // pack noob_frame
  // I am casting this to void to simplify this example
  // This can return a variable sized array for frame_packed[num_frame]
  void'(fr.pack_bytes(frame_packed[num_frame]);

end

// fr[][] now contains all 5 noob_frames packed into byte arrays

// call DPI-C function
modulate_my_frame( frame_packed );

这是我的 C 代码:

void modulate_my_frame (const svOpenArrayHandle data)
{
  printf( "svLeft1       = %0d\n", svLeft      ( data, 1));
  printf( "svRight1      = %0d\n", svRight     ( data, 1));
  printf( "svLow1        = %0d\n", svLow       ( data, 1));
  printf( "svHigh1       = %0d\n", svHigh      ( data, 1));
  printf( "svIncrement1  = %0d\n", svIncrement ( data, 1));
  printf( "svSize1       = %0d\n", svSize      ( data, 1));

  printf( "svLeft2       = %0d\n", svLeft      ( data, 2));
  printf( "svRight2      = %0d\n", svRight     ( data, 2));
  printf( "svLow2        = %0d\n", svLow       ( data, 2));
  printf( "svHigh2       = %0d\n", svHigh      ( data, 2));
  printf( "svIncrement2  = %0d\n", svIncrement ( data, 2));
  printf( "svSize2       = %0d\n", svSize      ( data, 2));

  printf( "svDimensions  = %0d\n", svDimensions( data   ));
}

我得到的打印输出:

# svLeft1  = 0
# svRight1 = 2
# svLow1   = 0
# svHigh1  = 2
# svIncrement1 = -1
# svSize1 = 3
# svLeft2  = -1
# svRight2 = -1
# svLow2   = -1
# svHigh2  = -1
# svIncrement2 = 0
# svSize2 = -2
# svDimensions = 2

我不明白如何获得子数组的维度?

奇怪的是,我可以使用svGetArrElemPtr2 访问我整个数组的元素。我只是不知道尺寸是多少。此时,我的解决方法是将另一个 int 数组传递到包含子数组维度的 C 代码中。

最佳答案

您的二维数组由(可能)不同长度的数组构成。如果你想获得第二个维度,你必须按元素进行。像这样的东西:

for (int i = 0; i < svSize(data, 1); i++) {

  // Each array element is itself an array
  svOpenArrayHandle* sub_array = (svOpenArrayHandle*) svGetArrElemPtr(data, i);

  printf( "sub_array size = %0d\n", svSize(sub_array, 1));
}

我使用 0 作为 i 的初始值而不是 svLeft(data, 1),因为动态数组总是从0 并包含 size 元素。

代码似乎对我不起作用,因为 sub_array 总是 NULL。它看起来就像来自 LRM 的示例,我没有发现它有任何问题,所以它可能是由于工具错误造成的。也许它可以让你开始,你会有更好的运气。

关于c - 无法访问 svOpenArrayHandle 的维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47903609/

相关文章:

c - 带引用参数的 printf

system-verilog - System Verilog wait() 语句等待的最短时间/周期长度是多少?

arrays - case 语句中的 Verilog/SystemVerilog 推断锁存器

verilog - 当 RTL 和 Goldenmodel 可能产生不同但正确的输出时,验证 HW 的标准方法是什么?

verilog - 功能覆盖 - 收集其他 bin 中未收集的所有值的 bin

C 引用常量返回一个结构

c - 尝试打印单链表,但似乎无法访问 C 中的节点数据

verilog - 如何在测试台上运行 verilog 代码?

system-verilog - 如何将 UVM 序列附加到特定的测序仪?

c - makefile gcc 自定义动态 lib 与 .so 文件的链接问题