编程自学网编程自学网编程自学网

SystemVerilog和Verilog中有没有办法找到打包结构的字段的整数位偏移量?

问题描述:

SystemVerilog和Verilog中有没有办法找到打包结构的字段的整数位偏移量?

我想知道在verilog或systemverilog中是否存在标准函数,它将返回打包结构中某个字段的位偏移量 . 例如,请参阅下面使用假设函数$ find_field_offset:

typedef struct packed
{
    logic [31:0] field_1,
    logic [15:0] field_2,
    logic [63:0] field_3
} struct_type;

struct_type the_struct;
int field_1_offset;
assign field_1_offset = $find_field_offset(the_struct.field_1);

谢谢!


答案1:

这可能不是一个好的方便的方式 . 但这是本机SV代码,找出 struct_type 内的偏移量 field_1

function automatic int get_offset_struct_type_field_1;
  struct_type x = '0;
  x.field_1 = '1;
  for (integer i = 0; i < $bits(x); i=i+1) begin
    if (x[i] == 1) return i;
  end
endfunction


答案2:

如果你按照自己喜欢的方式调用函数,因为据我所知,编译器失去了 field1 实际上是什么的上下文 . 我的意思是该函数会看到一个逻辑向量值,但不知道它来自一个结构 .

如果您可以将函数调用更改为:

$find_field_offset(the_struct, "field1"); // note "field1" in quotes

那么从技术上讲,可能会发现 the_struct 的类型为 struct_type 并遍历其所有字段以查找名为 "field1" 的字段并返回其偏移量 .

使用VPI代码的问题在于VPI对象模型的支持因供应商而异 . 您必须足够幸运地使用支持我们在此需要的功能的供应商 .


未经允许不得转载:编程自学网 » SystemVerilog和Verilog中有没有办法找到打包结构的字段的整数位偏移量?