从我之前的问题(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) ...
我究竟做错了什么?
最佳答案
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
这会丢失您要实现的分组的一部分。
关于system-verilog - 使用复杂结构的Modport麻烦,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26304251/