在System verilog中使用复制初始化结构队列

时间:2018-06-12 06:59:23

标签: system-verilog

如果还存在非复制元素,我们如何初始化具有复制的结构队列?我尝试了以下方法但没有成功。它甚至可能吗?

typedef struct {
 A a;
 B b;
 C c;
 D d;
} lp_s;    //A,B,C,D : integer enums

lp_s var_name[$] = '{    
     '{a: A_VAL0, b: B_VAL1, default:0}
'{15{'{a: A_VAL1, b: B_VAL1, default:0}}},
     '{a: A_VAL2, b: B_VAL2, default:0}
};

这里的错误是:

  

分配模式是非法的,原因是:复制字段超出了   目标的大小

我从复制中删除了勾号。

lp_s var_name[$] = '{    
         '{a: A_VAL0, b: B_VAL1, default:0}
     {15{'{a: A_VAL1, b: B_VAL1, default:0}}},
         '{a: A_VAL2, b: B_VAL2, default:0}
    };

然后错误变成了:

  

未打包的类型'lp_s'的结构不能由多个分配   连接运算符{15 {'{a:A_VAL1,b:B_VAL1,默认值:0}}}
  但是,可以将赋值模式分配给解压缩的结构。加   '在连接运算符之前将其转换为有效的   任务模式。

或者有没有办法实现使用解压缩的数组连接?

1 个答案:

答案 0 :(得分:3)

您可以向分配模式添加显式类型,以便可以在自定义的上下文中使用。

typedef lp_s lp_sq[$];

lp_s vari[$] = { // unpacked array concatenation of struct assignment patterns
                lp_s'{a: A_ENUM, b: B_ENUM, C: J_ENUM, D: D_ENUM},
               lp_sq'{12{lp_s'{a: A_ENUM, b: B_ENUM, C: J_ENUM, D: D_ENUM}}},
                lp_s'{a: A_ENUM, b: B_ENUM, C: J_ENUM, D: D_ENUM }
};

注意,您无法在此使用default:0,因为0不是要分配给enum的有效值类型。