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

Народ. Есть interface. В нем через typedef struct и typedef union задана куча регистров. Вопрос, как получить адрес поля в структуре?

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


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

Народ. Есть interface. В нем через typedef struct и typedef union задана куча регистров. Вопрос, как получить адрес поля в структуре?

а какой язык?

судя по вопросу напршивается ответ на язык С, а судя по разделу наверно речь про *HDL?

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


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

а какой язык?

судя по вопросу напршивается ответ на язык С, а судя по разделу наверно речь про *HDL?

Судя по вопросу - SV.

А в Си тоже interface есть? :)

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


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

а какой язык?

судя по вопросу напршивается ответ на язык С, а судя по разделу наверно речь про *HDL?

Вот. Хочется ofsetof, но для SV.

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


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

Вопрос, как получить адрес поля в структуре?

что значит 1) получить 2) адрес поля ?

ЗЫЖ может это наведёт на нужную мысль без постороннего вмешательства. про оператор bits помним?

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


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

что значит 1) получить 2) адрес поля ?

ЗЫЖ может это наведёт на нужную мысль без постороннего вмешательства. про оператор bits помним?

Помню, но перечислять все структуры перед нужной, крайне коряво.

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


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

Помню, но перечислять все структуры перед нужной, крайне коряво.

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

зыж вы помните надеюсь, что структуры даже в программистских языках не обязаны лежать в линейном отрезке памяти(т.е. запакованность структуры это искл., а не правило)?

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


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

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

зыж вы помните надеюсь, что структуры даже в программистских языках не обязаны лежать в линейном отрезке памяти(т.е. запакованность структуры это искл., а не правило)?

Если я пишу packed, что в Си что в SV, то обязаны. Я не могу понять, только, почему я не могу получить смещение. У меня есть имя, и я хочу знать как далеко это имя находится от начала структуры.

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


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

Если я пишу packed, что в Си что в SV, то обязаны.

я вам про что и говорю. вы в своём вопросе разве указали, что структура пакованная? почему постоянно приходится додумывать вопрос, а потом ещё клещами вытаскивать ответ, правильно ли угадана суть вопроса? может вы смещение в байтах ищите(для непакованой структуры,меж прочим, тоже работает).

 

по существу: самое простое, что в голову приходит, это определить для типа функцию или макрос, где вычислять через bits. простого решения, думаю нет, т.к. это всё-таки не си в котором речь идёт о разнице адресов в памяти, а об абстрактном моделистском языке не привязаном к реализации.

но я ещё подумаю - надо стандарт последний полистать.

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


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

я вам про что и говорю. вы в своём вопросе разве указали, что структура пакованная? почему постоянно приходится додумывать вопрос, а потом ещё клещами вытаскивать ответ, правильно ли угадана суть вопроса? может вы смещение в байтах ищите(для непакованой структуры,меж прочим, тоже работает).

Потому что я думал что это ОЧЕВИДНО.

 

по существу: самое простое, что в голову приходит, это определить для типа функцию или макрос, где вычислять через bits. простого решения, думаю нет, т.к. это всё-таки не си в котором речь идёт о разнице адресов в памяти, а об абстрактном моделистском языке не привязаном к реализации.

но я ещё подумаю - надо стандарт последний полистать.

Все плохо.

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


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

ОЧЕВИДНО.

для вопрошающего - да, а для читающего - приходится несколько раз перечитывать

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


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

Потому что я думал что это ОЧЕВИДНО.
Мне кажется, что после первого вопроса уважаемого CaPpuCcino, уже должно было стать понятно, что это не так.  :)

 

По теме:

Если не секрет - а зачем Вам это?

Может быть существуют более простые способы решения стоящей задачи.

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


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

Мне кажется, что после первого вопроса уважаемого CaPpuCcino, уже должно было стать понятно, что это не так.  :)

 

По теме:

Если не секрет - а зачем Вам это?

Может быть существуют более простые способы решения стоящей задачи.

Ок. Попытаюсь объяснить. На PCIe карточке я сделал несколько адресных пространств. Одно из них RW, другое RO (есть еще,но это мелочи).

У меня линейно идут регистры RW, потом начиная с границы 256КБ идет RO.

Каждое за IO операции отвечает один модуль (в терминах верилога). Он на входе получает interface, в котором через typedef struct заданы регистры отдельных переферийныйх устройств. Каждое адресное пространство периферийного устройства имеет размер кратный 64 бит. Это дает мне возможность завести структуру.

 

 

 

typedef struct {
  logic [63:0] start_day,
  logic [63:0] end_day
  logic [60:0] bad_days;
  logic [2:0]  good_days;
}counter_t

typedef struct {
   dooms_day_device_t    dooms_day_device[5],
   counter_t days_left
  итд
}

Когда мне нужен новый регистр, я просто его дописываю в структуру, и мне больше ничего нигде дописывать не нужно. Цикл for автоматически пройдет по ней и сгенерит нужный регистр.

 

Потом я захотел ловить момент записи в регистр. Вроде все просто, но мне нужно знать где находится good_days, относительно начала таблицы, чтбы я мог проанализировать адрес и бай-энейбл биты, и поймать момент записи.

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


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

typedef struct {
  logic [63:0] start_day,
  logic [63:0] end_day
  logic [60:0] bad_days;
  logic [2:0]  good_days;
}counter_t

typedef struct {
   dooms_day_device_t    dooms_day_device[5],
   counter_t days_left
  } pipa_t 
}

Потом я захотел ловить момент записи в регистр. Вроде все просто, но мне нужно знать где находится good_days, относительно начала таблицы, чтбы я мог проанализировать адрес и бай-энейбл биты, и поймать момент записи.

в случае упакованной структуры, он всегда будет в младших битах pipa_t. А если вы его сместите, то функция get_good_days_position и функция $bits спасут отца русской демократии %)

 

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


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

в случае упакованной структуры, он всегда будет в младших битах pipa_t. А если вы его сместите, то функция get_good_days_position и функция $bits спасут отца русской демократии %)

В старших адресах. И мне не нужна функция get_good_days_position. Мне нужна функция $offset(pipa.days_left.good_days)

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


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

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

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

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

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

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

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

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

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

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