0

如何使用 vpi PLI 例程获取矢量端口的尺寸?例如,对于向量端口声明“输出 [2:1] out;”,我怎样才能得到左维为 2 和右维为 1?我尝试使用 vpiRange 属性,但似乎端口不支持 vpiRange 属性。谢谢!为了清楚起见,将代码放在这里。

vpiHandle lowconn = vpi_handle(vpiLowConn, portH);   
int dim = 0;
int ldim[10];
int rdim[10];

vpiHandle range_itr = vpi_iterate(vpiRange, lowconn );

vpiHandle range;
while ((range = vpi_scan(range_itr))) {
  ldim[dim] = vpi_get(vpiLeftRange, range);
  rdim[dim] = vpi_get(vpiRightRange, range);
  dim++;
}
int size = vpi_get(vpiSize, portH);
cout << endl << vpi_get_str(vpiName, portH) << " size = " << size << " LeftRange = " << vpi_get(vpiLeftRange, lowconn ) << " RightRange = " << vpi_get(vpiRightRange, lowconn );
for ( int i = 0; i < dim; i++ ) {
  cout << vpi_get_str(vpiName, portH) << " = " << ldim[i] << ":" << rdim[i];
}

我从 vpi_get(vpiLeft/RightRange) 以及 ldim 和 rdim 中得到 -1。我的代码有什么错误吗?

4

1 回答 1

1

您的问题是 vpiLeftRange 和 vpiRightRange 返回 vpiHandle,而不是值。当你实例化一个模块时。它们可以是常量表达式,也可以是变量索引表达式(对于 highcon)。因此,您可以尝试为它们获取值。这是一个适用于 vcs 的示例。

verilog 模块如下所示:

module pvpi (pa, pb);
   input wire [3:0] pa;
   input wire [7:6] pb;

   child child_inst(.a(pa), .b(pb));
   initial $report_ports;
endmodule 

module child(input [4:1] a, input [1:2] b);
endmodule // child

c代码在这里

#include "vpi_user.h"

static int getExprValue(vpiHandle conn, int r) {
    vpiHandle expr = vpi_handle(r, conn);

    s_vpi_value val = {vpiIntVal};
    vpi_get_value(expr, &val);
    return val.value.integer;
}

void report_ports() {
    vpiHandle moduleInst = vpi_handle_by_name("pvpi.child_inst", 0);
    vpiHandle ports = vpi_iterate(vpiPort, moduleInst);
    vpiHandle port;

    vpi_printf("%s %s\n", vpi_get_str(vpiDefName, moduleInst), vpi_get_str(vpiFullName, moduleInst));

    while ((port = vpi_scan(ports))) {

        vpiHandle highConn = vpi_handle(vpiHighConn, port);
        vpiHandle lowConn = vpi_handle(vpiLowConn, port);

        vpi_printf("   %d %s [%d:%d]/[%d:%d]\n", vpi_get(vpiDirection, port),  vpi_get_str(vpiFullName, port),
                   getExprValue(highConn, vpiLeftRange), getExprValue(highConn, vpiRightRange),
                   getExprValue(lowConn, vpiLeftRange), getExprValue(lowConn, vpiRightRange)); 

    }
}

这是结果

child pvpi.child_inst
   1 pvpi.child_inst.a [3:0]/[3:0]
   1 pvpi.child_inst.b [7:6]/[1:2]

这应该适用于带有参数和文字的简单常量表达式。

于 2018-02-26T21:20:46.327 回答