Jump to content

    

Обращение к 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. Всё какое-то громоздкое и неработающее.

Share this post


Link to post
Share on other sites

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

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

В вашем случае можно попробовать упростить задачу пользователю через 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.

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
15 minutes ago, Nick_K said:

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

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

Share this post


Link to post
Share on other sites
1 hour ago, des00 said:

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

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

Share this post


Link to post
Share on other sites

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

29 minutes ago, Nick_K said:

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

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

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

Удачи! Rob.

Share this post


Link to post
Share on other sites
2 hours ago, RobFPGA said:

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

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

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

Удачи! Rob.

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this