使用复杂结构的Modport问题

时间:2014-10-10 16:46:52

标签: system-verilog hdl

从我之前的问题(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) ...

我做错了什么?

1 个答案:

答案 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

这会失去你想要实现的部分分组。