Darky777 0 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба Приветствую! Вопрос к знатокам 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба никакими. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darky777 0 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба Что, даже дефайнами не наложить никак? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба 15 minutes ago, Darky777 said: Что, даже дефайнами не наложить никак? ну это же просто забитая константа, если на константах то можно и через макросы и константы и функции с забитыми константами. Но вы же про другое спрашиваете. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба Для синтеза никак точно. Может есть способ сделать подобную структуру для моделирования и тогда получится вытащить. Но Вам правильно сказали - никак. Нужно просто подойти с другой стороны - задавать в тайпдеф какие-то параметры и константы, тогда через эти значения можно вытащить позицию Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darky777 0 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба 41 minutes ago, Nick_K said: Для синтеза никак точно. Может есть способ сделать подобную структуру для моделирования и тогда получится вытащить. Ой, я не уточнял. Для синтеза мне не нужно. Спасибо всем за ответы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба Приветствую! 3 hours ago, des00 said: никакими. Ну не так уж и никаким Если тип структуры известен и она пакованная и вы хотите знать смещение конкретного поля то можно : 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба 45 minutes ago, RobFPGA said: Ну не так уж и никаким Если тип структуры известен и она пакованная и вы хотите знать смещение конкретного поля то можно : вот только вопрос ТС не в смещении конкретного поля, а в индексе имени конкретного поля, а все поля у ТС разные) За сим, всеж никакими) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба Приветствую! 4 hours ago, Darky777 said: В комментарии видно какое пословное смещение (одно слово = 32бит ) у каждого регистра. Какиеми средствами языка вытащить позицию регистра? например regs_t regs; parameter REG1_IND = get_ind_word_f ( regs.reg1 ); // = 1 IMHo все же TC нужно именно позиция (индекс) регистра по имени поля. При условии что регистры у него все 32 битные то в моем примере эта задача решается Обратная же задача - получить номер позиции поля в описании структуры или имя поля по индексу автоматом действительно невозможна, в чем и я недавно в очередной раз убеждался. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба 3 minutes ago, RobFPGA said: Приветствую! Все же TC нужно именно позиция (индекс) регистра по имени поля. При условии что регистры у него все 32 битные то в моем примере эта задача решается вот только поля у него все разные, поэтому задача не решается. ЗЫ. и вы забыли разделить в вашем коде результат на 32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 7 августа, 2020 Опубликовано 7 августа, 2020 · Жалоба Приветствую! 3 minutes ago, des00 said: ЗЫ. и вы забыли разделить в вашем коде результат на 32. Ну это уж пусть сам делить Сама идея думаю понятна. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться