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

10-11 10:40