Система Verilog typedef из typedef - PullRequest
       71

Система Verilog typedef из typedef

0 голосов
/ 07 февраля 2020

typedef enum s позволяют удобно описать набор пар имя-значение. Есть ли способ связать их, чтобы создать более глубокие структуры, используя enum на всех уровнях?

Например, у меня есть следующее:

typedef enum logic {ALPHA=0, BETA=1} a_t;
typedef enum logic {GAMMA=0, DELTA=1} b_t;
typedef enum logic {ZETA=0, ETA=1} c_t;
...

Я хочу создать переменную c, которая состоит из a_t и b_t. Возможно ли это?

Что-то вроде:

a_t b_t c;

, поэтому при каждом измерении c я могу иметь enum с.

РЕДАКТИРОВАТЬ: Некоторые пояснения - Предположим, что a_t, b_t и c_t являются неизменяемыми, поскольку они генерируются автоматически. И есть сотни таких разных перечислений. Я хочу создавать большие структуры по мере необходимости, потому что автоматическая генерация всех их комбинаций сделает код слишком большим и грязным.

Например, скажем, мой a_t описывает количество мастеров, а b_t описывает количество рабы. Я хочу создать структуру, в которой у меня есть эта иерархия в моем сигнале, и в то же время разрешить enum s для них, чтобы их было легко читать и использовать.

Итак, что-то вроде этого:

c[MASTER_0][SLAVE_0]
c[MASTER_0][SLAVE_1]
c[MASTER_1][SLAVE_0]
c[MASTER_1][SLAVE_1]

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Возможно, вы ссылаетесь на ассоциативный массив , например:

c[ALPHA] = BETA;

Если это так, вы можете просто сослаться на него как:

b_t c[a_t];

Что означает создание ассоциативного массива c, ключ которого имеет перечисления a_t, а значение имеет перечисления b_t. Вы можете продолжать, если хотите:)

typedef enum logic {ALPHA=0, BETA=1} a_t;
typedef enum logic {GAMMA=0, DELTA=1} b_t;
typedef enum logic {BAD_AT=0, GREEK_LETTERS=1} c_t;

c_t my_data_structure[a_t][b_t];

// Assigning a value
my_data_structure[ALPHA][GAMMA] = GREEK_LETTERS;

См. Пример на детской площадке EDA здесь .

Кроме того, я думаю, что вы немного неправильно понимаете использование typedef. Он точно не описывает набор пар имя-значение, а дает новое имя для типа данных. Это enum, который фактически создает «набор пар имя-значение», но я бы пояснил, что это, по сути, присвоение идентификаторов значениям. Было бы полезно, если бы вы могли объяснить заявление для более четкого ответа.

0 голосов
/ 07 февраля 2020

Вы не можете создать один enum typedef из другого или из группы других. Некоторые могут назвать это расширением перечисления. Вы также не можете иметь enum с несколькими именами для одного и того же значения.

Что вы можете сделать, это иметь ассоциативный массив с парами имя / значение и объединить эти массивы вместе.

int a[string], b[string], c[string];
initial begin
       a = '{"ALPHA":0, "BETA":1};
       b = '{"GAMMA":0, "DELTA":1};
       c = a;
       foreach(b[s]) c[s]=b[s];
end

Существуют способы сбора имен каждого перечислимого типа для инициализации ассоциативный массив, а также.

...