从我之前的问题(Groups inside structs)开始,在创建了typedef结构后,我试图从5个不同的通道信号声明(结构)中形成一个接口。
结构的形式是:
typedef struct {
struct {
logic [1:0] a;
logic [2:0] b;
} in;
struct {
logic [4:0] d;
} out;
} axi_X_ch;
然后我尝试了以下代码:
interface axi_interface ();
//as = axi slave
axi_X_ch as_X;
axi_Y_ch as_Y; //similar to struct axi_X_ch
modport slave ( input as_X.in, as_Y.in,
output as_X.out, as_Y.out);
endinterface
但是我收到error
消息(忽略坐标):
modport slave ( input as_X.in, as_Y.in, output as_X.out, as_Y.out);
|
ncvlog: *E,ILLHIN (demo.sv,177|30): illegal location for a hierarchical name (as_X).
modport slave ( input as_X.in, as_Y.in, output as_X.out, as_Y.out);
|
ncvlog: *E,ILLHIN (demo.sv,177|30): illegal location for a hierarchical name (as_Y).
... (same for the next two output declarations) ...
我做错了什么?
答案 0 :(得分:1)
Modport项目应该是界面内的变量,而不仅仅是其中的一部分。此外,您将modport项目称为类型,而不是变量:
modport slave ( input axi_X_ch.in, axi_Y_ch.in, output axi_X_ch.out, axi_Y_ch.out);
axi_X_ch
是一种类型,而不是变量。
您想要实现的目标可以通过名为“modport expressions”的东西来完成(不确定所有综合工具是否支持它)。
因此,使用modport表达式,您可以创建名为X_IN, Y_IN, X_OUT, Y_OUT
的新端口名称:
modport slave ( input .X_IN(as_X.in), .Y_IN(as_Y.in),
output X_OUT(as_X.out), output .Y_OUT(as_Y.out));
修改强>
如果不支持modport表达式,我能想到的最接近的是:
typedef struct {
logic [1:0] a;
logic [2:0] b;
} t_in;
typedef struct {
logic [4:0] d;
} t_out;
interface axi_interface ();
t_in as_X_in;
t_out as_X_out;
t_in as_Y_in;
t_out as_Y_out;
modport slave ( input as_X_in, as_Y_in,
output as_X_out, as_Y_out);
endinfterface
这会失去你想要实现的部分分组。