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

SystemVerilog. индекс элемента в структуре.

Приветствую! Вопрос к знатокам SV.

Допустим есть структура отражающая карту регистров. Ширина каждого регистра кратна 32бит. 

typedef logic [32*3-1:0] reg3_t;
typedef logic [32*2-1:0] reg2_t;
typedef logic [32*2-1:0] reg1_t;
typedef logic [32*1-1:0] reg0_t;

typedef struct packed {
    reg3_t reg3; // 5 - позиция 32 разрядного reg3
    reg2_t reg2; // 3 - позиция 32 разрядного reg2
    reg1_t reg1; // 1 - позиция 32 разрядного reg1
    reg0_t reg0; // 0 - позиция 32 разрядного reg0
} regs_t;

parameter REGS_NUM =  $bits(regs_t)/32; // = 8;

В комментарии видно какое пословное  смещение (одно слово = 32бит ) у каждого регистра. Какиеми средствами языка вытащить позицию регистра? например

    regs_t regs;
    parameter REG1_IND = get_ind_word_f ( regs.reg1 ); // = 1

 

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


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

15 minutes ago, Darky777 said:

Что, даже дефайнами не наложить никак?

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

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


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

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

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


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

41 minutes ago, Nick_K said:

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

Ой, я не уточнял. Для синтеза мне не нужно. 

Спасибо всем за ответы

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


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

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

3 hours ago, des00 said:

никакими.

Ну не так уж и никаким :yes3:

Если тип структуры известен и она пакованная и вы хотите знать смещение конкретного поля то можно

typedef logic [32*3-1:0] reg3_t;
typedef logic [32*2-1:0] reg2_t;
typedef logic [32*2-1:0] reg1_t;
typedef logic [32*1-1:0] reg0_t;

typedef struct packed {
    reg3_t reg3; // 5 - позиция 32 разрядного reg3
    reg2_t reg2; // 3 - позиция 32 разрядного reg2
    reg1_t reg1; // 1 - позиция 32 разрядного reg1
    reg0_t reg0; // 0 - позиция 32 разрядного reg0
} regs_t;


localparam MAX_VEC =4096;

function int field_poz(input bit [MAX_VEC-1:0] vec);
  for (int ii=0; ii<MAX_VEC; ++ii) begin
    if (vec[ii]) begin
      return ii;
    end
  end
  return -1;
endfunction : field_poz

`define  F_POZ(st_type, field_name) field_poz(st_type'('{default:0, field_name:1'b1}))

localparam AA = `F_POZ(regs_t, reg2);

initial begin
  $display (">> F_POZ, reg0:%03d", `F_POZ(regs_t, reg0));
  $display (">> F_POZ, reg1:%03d", `F_POZ(regs_t, reg1));
  $display (">> F_POZ, reg2:%03d", `F_POZ(regs_t, reg2));
  $display (">> F_POZ, reg3:%03d", `F_POZ(regs_t, reg3));
end

Это может даже для синтеза работать если конечно tools поддерживает инициализацию структуры в '{..}.  Ну или можно явно создавать и инициализировать временную переменную  с типом структуры.  

Удачи! Rob.

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


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

45 minutes ago, RobFPGA said:

Ну не так уж и никаким :yes3:

Если тип структуры известен и она пакованная и вы хотите знать смещение конкретного поля то можно

вот только вопрос ТС не в смещении конкретного поля, а в индексе имени конкретного поля, а все поля у ТС разные) За сим, всеж никакими) 

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


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

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

4 hours ago, Darky777 said:

В комментарии видно какое пословное  смещение (одно слово = 32бит ) у каждого регистра. Какиеми средствами языка вытащить позицию регистра? например


    regs_t regs;
    parameter REG1_IND = get_ind_word_f ( regs.reg1 ); // = 1

IMHo все же  TC нужно именно позиция (индекс)  регистра по  имени поля. При условии что регистры у него все 32 битные то в моем примере эта задача решается 

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

Удачи! Rob.

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


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

3 minutes ago, RobFPGA said:

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

Все же  TC нужно именно позиция (индекс)  регистра по  имени поля. При условии что регистры у него все 32 битные то в моем примере эта задача решается 

вот только поля у него все разные, поэтому задача не решается.

ЗЫ. и вы забыли разделить в вашем коде результат на 32. 

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


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

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

3 minutes ago, des00 said:

ЗЫ. и вы забыли разделить в вашем коде результат на 32.

Ну это уж пусть сам делить :biggrin: Сама идея думаю понятна.

Удачи! Rob.

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


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

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

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

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

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

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

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

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

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

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