2014-10-10 58 views
2

从我以前的问题(Groups inside structs),创建typedef结构后,我尝试从5个不同的通道信号声明(结构)形成一个接口。使用复杂结构的Modport故障

结构体的形式是:

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) ... 

什么我做错了吗?

回答

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 

这会失去您尝试实现的部分分组。

+0

对不起,我的例子中有一个错字(我使用'as_X'而不是'axi_X_ch')。我尝试了解决方案,并且得到了'ncvlog:* E,MODPXE(test.sv,177 | 30):端口标识符为'X_IN'的不支持的modport表达式。如果我无法用这些结构来解决这个问题,还有另一种方法来重建我的AXI通道,所以我整合了一个漂亮整洁的接口? – user2692669 2014-10-10 18:54:02

+0

哇,与axi,这意味着10组... ...矫枉过正? – user2692669 2014-10-10 19:08:19

+0

你可以把它们放在数组中 – Ari 2014-10-10 19:13:24