Перейти к содержанию
    

Обращение к struct на SystemVerilog

Доброго времени, уважаемые.

В процессе написания кода возникла необходимость сделать user-френдли компонент с упрощенным редактированием. В чём основная суть: создаётся в начале файла несколько структур, в которые "пользователь" (человек, далее работающий с кодом) может добавлять одномерные векторы (рандомной длинны), нужное количество. В упрощённом варианте первая структура несёт все елементы, во второй указано только то, что подлежит сбросу по определённому ивенту.

module component_1(...);
typedef struct packed{
  logic [1:0] first;
  logic [0:0] second;
  logic [2:0] third;
} t_elements;
t_elements common_elements;

typedef struct packed{
  logic [0:0] second;
} t_reset;
t_reset reset_elements;

always_ff @(posedge clk)
  if (reset == 1)
    for(int i=0; i < $size(t_elements); i++)	// тут пошла отсебятина ибо не представляю как реализовать
      if (reset_elements.i == common_elements.i)
        common_elements.i <= '0;

Как сделать референс/перечисление/другой вариант, чтобы автоматизировать задачу и не заставлять юзера лезть в дебри кода, для правки сбрасываемых компонентов? Возможно есть вариант с одной структурой и какими-то указателями. Я уже и через enum пробовал вытащить имена и думал за union. Всё какое-то громоздкое и неработающее.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

Вы не можете задавать имя поля структуры через какую-либо переменную, имя поля это идентификатор и должно задаваться явно. 

В вашем случае можно попробовать упростить задачу пользователю через macro:  

`define  RST_STRUCT_FIELD(st_name, fld_name) \
  if (rst) begin : a_rst_``fld_name \
    st_name.fld_name <= '0; \
  end \
  
typedef struct packed {
  logic [1:0] f_0;
  logic [1:0] f_1;
  logic [1:0] f_2;
} st_TEST_t;

st_TEST_t  st_test;

`define RESET_FOR_LAZY_USER \
  `RST_STRUCT_FIELD(st_test, f_0) \
  `RST_STRUCT_FIELD(st_test, f_2) \

always_ff @(posedge clk) begin
  st_test.f_0 <= st_test.f_0+1;
  st_test.f_1 <= st_test.f_1+2;
  st_test.f_2 <= st_test.f_2+3;
  // ...

  `RESET_FOR_LAZY_USER
end

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Благодарю за столь развёрнутый ответ. Попробую сделать так.

Вдруг появятся другие варианты реализации (возможно не через структуру, но с сохранением словесного присвоения) буду благодарен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 minutes ago, Nick_K said:

Вдруг появятся другие варианты реализации (возможно не через структуру, но с сохранением словесного присвоения) буду благодарен. 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, des00 said:

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

Тоже верно. У меня тут возникла "больная" идея... А можно ли всё запихнуть в BD? Чтобы юзеру только блочёк перетащить и сконфигурировать в окошке. Я знаю, что это реально, вопрос где более детально про это почитать можно, или с примерами лучше даже. Там по идее будет скриптование на TCL работать и всех делов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приветствую!

29 minutes ago, Nick_K said:

У меня тут возникла "больная" идея... А можно ли всё запихнуть в BD?

Вы озвучите основную идею  какой сервис вы хотите сделать юзеру?   Чтобы он мог и RTL-ить  и при этом про reset не думать :scratch_one-s_head:

BD  в  Vivado это tcl скрипт. Там можно такого наворотить - что юзеру  будет достаточно только подумать и глазами посмотреть, а вареники сами в рот полезут BD сама сгенерируется :biggrin:  Но все же кому-то вареники надо будет лепить...

Удачи! Rob.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, RobFPGA said:

Приветствую!

Вы озвучите основную идею  какой сервис вы хотите сделать юзеру?   Чтобы он мог и RTL-ить  и при этом про reset не думать :scratch_one-s_head:

BD  в  Vivado это tcl скрипт. Там можно такого наворотить - что юзеру  будет достаточно только подумать и глазами посмотреть, а вареники сами в рот полезут BD сама сгенерируется :biggrin:  Но все же кому-то вареники надо будет лепить...

Удачи! Rob.

В общем то вы правы отчасти. Нужно иметь возможность реконфигурировать на разные порты и вопрос не только в ресете, там куча других функций может быть встроена.

з.ы. Под юзером, кстати, я понимаю и себя через год-два. Когда уже забыл что писал, но при этом есть лёгкая возможность редактировать, ибо это та часть проекта в которой основные конфиги прописаны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...