如何使用 PLI 例程获取 Verilog 矢量端口的维度?
How to get dimensions of a verilog vector port using PLI routines?
如何使用 vpi PLI 例程获取向量端口的维度?例如,对于向量端口声明"output [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。我的代码有什么错误吗?
您的问题是 vpiLeftRange 和 vpiRightRange return 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-code 在这里
#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]
这应该适用于带有参数和文字的简单常量表达式。
如何使用 vpi PLI 例程获取向量端口的维度?例如,对于向量端口声明"output [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。我的代码有什么错误吗?
您的问题是 vpiLeftRange 和 vpiRightRange return 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-code 在这里
#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]
这应该适用于带有参数和文字的简单常量表达式。