首页 > 解决方案 > 系统 Verilog 关联数组

问题描述

是否可以定义不同元素类型的关联数组 - 如下所示?

typedef enum {M1, M2} mod_t;
typedef struct {...} m1_reg_t;
typedef struct {...} m2_reg_t;

array[mod_t] = {
   M1: { string name;
         m1_reg_t cfg
       }
   M2: { string name;
         m2_reg_t cfg;
         int m2_indx;
       }
}

标签: associative-arraysystem-verilog

解决方案


不,所有数组必须具有相同的元素类型。

如果您真的想要一个只有两个不同类型元素的数组,请使用另一个结构而不是数组。

typedef struct { 
         string name;
         m1_reg_t cfg;
       } M1_t;
typedef struct { 
         string name;
         m2_reg_t cfg;
         int m2_indx;
       } M2_t;
struct { M1_t M1;
         M2_t M2;
} opcodes;

但是,如果您正在寻找一个包含许多元素的数组,其中每个元素可能包含不同的操作码,请考虑使用标记联合的动态数组。

typedef union tagged {
   struct { 
             string name;
             m1_reg_t cfg;
           } M1;
   struct { 
             string name;
             m2_reg_t cfg;
             int m2_indx;
           } M2;
} opcode_t;

opcode_t opcodes[];

访问标记的联合需要模式匹配语句。请参阅 1800-2017 LRM 中的第 12.6 节。


推荐阅读