Jump to content

    

Perdachillo

Участник
  • Content Count

    20
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Perdachillo

  • Rank
    Участник

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Да действительно вы правы, я обнулил массивы перед этим и, кажется, ошибка ушла.. Я предполагал, что массив будет содержать неопределённые значения 32'dx и постепенно наполнятся. Думал, что неопределённое значение не равно любому другому значению и нет смысла обнулять его в начале. А Quartus видимо считает, что неопределённое значение не может быть constant expressions. Всем спасибо за помощь!
  2. Чтобы сделать структуру неупакованной нужно делать массивы внутри неё неупакованными. И, следовательно, функции, которые достают значение из структуры тоже должны быть неупакованными. А функции могут быть неупакованными вообще? Quartus не дал сделать параметры wire. При этом parameter logic [31:0] - работает. Для того чтобы не приводить кучу строк кода, я задал параметры в чистом виде перед объявлением структуры, чтобы исключить тот факт что параметр рассчитывается не от параметра: parameter N_INST_A = 5; parameter N_INST_B = 6; parameter N_INST_C = 2; parameter integer POSITION_INST_B [N_INST_B-1:0] = '{5,4,32'hF01,32'hF00,32'hF00,0}; parameter integer POSITION_INST_C [N_INST_C-1:0] = '{4,32'hF01}; В результате все равно ошибка - value for parameter POSITION_INSTA_A must be constant expressions
  3. Вот они: typedef struct packed { logic [N_INST_A-1:0][31:0] inst_a; logic [N_INST_B-1:0][31:0] inst_b; logic [N_INST_C-1:0][31:0] inst_c; } st_POS; function st_POS bind_position(); logic [N_INST_A-1:0][31:0] inst_a_position_about_inst_x; logic [N_INST_B-1:0][31:0] inst_b_position_about_inst_a; logic [N_INST_C-1:0][31:0] inst_c_position_about_inst_a; logic [31:0] add_inst_a; logic inst_a_find; begin add_inst_a = 0; inst_a_find = 0; for (int i0=0; i0<N_INST_B; i0++) begin inst_a_find = 0; for (int j0=0; j0<N_INST_A; j0++) begin if (inst_a_position_about_inst_x[j0] == POSITION_INST_B[i0]) begin inst_b_position_about_inst_a[i0] = j0; inst_a_find = 1; end end if (inst_a_find == 0) begin inst_b_position_about_inst_a[i0] = add_inst_a; inst_a_position_about_inst_x[add_inst_a] = POSITION_INST_B[i0]; add_inst_a = add_inst_a + 1; end end inst_a_find = 0; for (int i1=0; i1<N_INST_C; i1++) begin inst_a_find = 0; for (int j1=0; j1<N_INST_A; j1++) begin if (inst_a_position_about_inst_x[j1] == POSITION_INST_C[i1]) begin inst_c_position_about_inst_a[i1] = j1; inst_a_find = 1; end end if (inst_a_find == 0) begin inst_c_position_about_inst_a[i1] = add_inst_a; inst_a_position_about_inst_x[add_inst_a] = POSITION_INST_C[i1]; add_inst_a = add_inst_a + 1; end end bind_position.inst_a = inst_a_position_about_inst_x; bind_position.inst_b = inst_b_position_about_inst_a; bind_position.inst_c = inst_c_position_about_inst_a; return bind_position; end endfunction function [N_INST_A-1:0][31:0] fun_get_inst_a_pos(); st_POS pos; pos = bind_position(); return pos.inst_a; endfunction function [N_INST_B-1:0][31:0] fun_get_inst_b_pos(); st_POS pos; pos = bind_position(); return pos.inst_b; endfunction function [N_INST_C-1:0][31:0] fun_inst_c_inst_b_pos(); st_POS pos; pos = bind_position(); return pos.inst_c; endfunction // parameter st_POS POS = bind_position(); parameter [N_INST_A-1:0][31:0] POSITION_INST_A = fun_get_inst_a_pos(); parameter [N_INST_B-1:0][31:0] POSITION_INST_B_ABOUT_INST_A = fun_get_inst_b_pos(); parameter [N_INST_C-1:0][31:0] POSITION_INST_C_ABOUT_INST_A = fun_inst_c_inst_b_pos(); Оперирую по сути только параметрами, входных/выходных аргументов у функций нет.. Кстати Quartus 17.1
  4. Добрый день. Модельсим съел все на ура. А вот Quartus меня захейтил и выдал кучу ошибок. Как оказалось, он считает, что нельзя писать: parameter A = PAR_AB.var_a; -- Error(10742): constant expressions cannot contains a heirarchical Identifier. Поэтому я решил сделать, как вы изначально предложили, через несколько функций. То есть одна рассчитывает структуру, а другие достают определённое значение. Но в результате получил: Error (10192) value for parameter must be constant expression. Если я правильно понял, получилось это потому что структура у меня содержит три массива logic. И соответственно, я в результате параметру присваиваю logic. Или причина в другом? Подскажите пожалуйста, как можно этот момент обойти и все таки рассчитать несколько массивов в одной функции?
  5. Не нашли в электронном виде? На складчине запись идет на эту книжку, но всего три человека (вместе со мной) пока что.
  6. Идею понял, спасибо! Проверил, даже последняя строка работает. Только не очень понял зачем дополнительные функции использовать, если можно написать в конце: parameter A = PAR_AB.var_a; Тогда и функция один раз выполнится и можно несколько значений выцепить. Или нет?
  7. Добрый день. Есть такая задача: на вход модуля поступает массив параметров. Необходимо этот массив обработать и на его основе получить другой массив параметров, который в свою очередь будет использоваться для generate блоков. Обычно, для этого я писал тело функции без входных/выходных сигналов, внутри которой производил расчет. А потом параметру присваивал эту функцию. Для простого примера: function [31:0] calculate_free_gbe ( ); begin calculate_free_gbe = '0; for (int i = 0; i < N_GBE; i++) begin if (FREE_GBE[i] == 1) calculate_free_gbe = calculate_free_gbe + 1; end return calculate_free_gbe; end endfunction parameter N_FREE_GBE = calculate_free_gbe(); Выглядит, как костыль, но на практике все считалось Квартусом перед синтезом и на основе результата уже синтезировалась логика. Но сейчас мне понадобилось вытащить из функции несколько значений (причем разных по размерам) и присвоить их параметрам. Как можно это реализовать? Я попытался сделать выходные сигналы у функции, но вот как их потом присвоить параметру? Может вообще есть какой то другой вариант области в которой можно производить вычисления и создавать новые параметры?
  8. Получается память будет двухпортовая? Один порт будет добавлять (или перезаписывать) записи во время поступления нового Mac адреса, а второй порт (параллельно этому) будет опрашивать последовательно все записи и декрементировать счётчики реализуя механизм устаревания? Попробую. Я почему-то думал, что generate сам по себе создаёт несколько отдельных модулей
  9. Хорошая идея, получится настраиваемый компромисс между количеством тактов для сброса и объёмом памяти. Да, надо весь механизм с устареванием сюда грамотно засунуть. Если использовать ram для хранения информации о валидности, а не регистры, то это несколько усложняет это дело По простому походу не выйдет) придётся засесть.. Смотрю ещё протокол RSTP, и он подразумевает такие случаи, когда необходимо не просто очистить таблицу, а очистить только записи маков, которые относятся к определённому порту назначения. Чувствую, что с этим тоже повожусь. Спасибо за помощь!
  10. То есть сделать массив регистров по количеству записей в таблице коммутации, где каждый регистр будет содержать флаг валидности записи в таблице? Если вы это имели в виду, то я держу в голове этот способ. Смущает, что он все таки прилично логики займёт.
  11. В любом случае, записи как то надо похерить, причём не одну конкретную, а все сразу
  12. Хорошо, спасибо. Этим и займусь.
  13. Я думал имеется в виду готовое решение. А почему cam очищать не нужно? Предположим мне пришёл сигнал, который говорит, что топология изменилась данные о местоположение узлов в сети недействительны (в таблице) . А затем пришёл пакет с данными с определённым MAC адресом назначения. Моё устройство начинает адрес назначения искать в таблице и находит запись, но она же недействительна и использовать её нельзя.
  14. CAM у меня нет, к сожалению, есть только ПЛИС) Предположим я добавлю флаг валидности у записей в таблице. При изменении топологии мне придётся у всех записей снимать этот флаг? Чем тогда это в корне отличается от обычного обнуления? То есть в одном случае я получается один бит в ноль сбрасываю, а в другом все. Или я что то не понял? Поскольку это таблица коммутации, то мне при чтении ячейки неизвестно понадобиться ли мне её ещё раз читать. Она там должна храниться, пока не придёт сигнал изменение топологии, либо пока таймер устаревания не закончится.
  15. Необходимо сделать, что то типа таблицы коммутации, которую при изменении топологии сети требуется очищать. Таблицу я сделал на основе трёхмерного массива. Запись в неё, и соответственно чтение, производится по хэшу, который считается на основе MAC адреса. Как раз для обработки коллизий память и сделана трехмерной. Другого варианта, как все это сделать я честно говоря не нашёл Спасибо, поищу там