Jump to content

    

Perdachillo

Участник
  • Content Count

    22
  • 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. Спасибо! Почему от меня это скрывали?) Это прямо крутая фича. Попробовал в modelsim - работает.
  2. Добрый день. Возник вопрос, как в модельсим передать между модулями упакованную структуру одно поле которой параметризировано? Если пишу так, то он ругается на то что структура не определена (логично): module input_processing #( parameter WORK_WIDTH = 18 )( input logic ireset, input logic iclk, output st_TAG port_tag, ); typedef struct packed{ logic throw; logic R_pack; logic H_pack; logic [$clog2(WORK_WIDTH)-1:0] pad; logic [15:0] slice_len; } st_TAG; ** Error: near "port_tag": syntax error, unexpected IDENTIFIER, expecting ')'. Если так, то говорит, что не определен параметр (тоже логичо): typedef struct packed{ logic throw; logic R_pack; logic H_pack; logic [$clog2(WORK_WIDTH)-1:0] pad; logic [15:0] slice_len; } st_TAG; module input_processing #( parameter WORK_WIDTH = 18 )( input logic ireset, input logic iclk, output st_TAG port_tag, ); ** Error: (vsim-3043) Unresolved reference to 'WORK_WIDTH' in $root.WORK_WIDTH. На самом деле у меня уже возникала похожая проблема, только не со структурой, а с функцией. Возникала ошибка, когда я пытался рассчитать размерность порта с помощью функции определенной в теле модуля. Я нахожу логику в ошибках modelsim, но если он запрещает заходить в тело модуля при объявлении портов, то должна быть возможность определить структуру/функцию в описании портов, чтобы использовать их там. Или нет? Забавно, что Quartus ошибку не выдает (по крайней мере с функциями), то есть там получается другая область видимости. Вы не находите странным такую разницу в подходах Quartus 17 и Modelsim 10.4b? Да я в принципе могу определить выход просто как разрядность и в теле присвоить ему упакованную структуру, но потом при изменении структуры мне разрядность этого выхода придется постоянно менять.
  3. Да действительно вы правы, я обнулил массивы перед этим и, кажется, ошибка ушла.. Я предполагал, что массив будет содержать неопределённые значения 32'dx и постепенно наполнятся. Думал, что неопределённое значение не равно любому другому значению и нет смысла обнулять его в начале. А Quartus видимо считает, что неопределённое значение не может быть constant expressions. Всем спасибо за помощь!
  4. Чтобы сделать структуру неупакованной нужно делать массивы внутри неё неупакованными. И, следовательно, функции, которые достают значение из структуры тоже должны быть неупакованными. А функции могут быть неупакованными вообще? 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
  5. Вот они: 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
  6. Добрый день. Модельсим съел все на ура. А вот 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. Или причина в другом? Подскажите пожалуйста, как можно этот момент обойти и все таки рассчитать несколько массивов в одной функции?
  7. Не нашли в электронном виде? На складчине запись идет на эту книжку, но всего три человека (вместе со мной) пока что.
  8. Идею понял, спасибо! Проверил, даже последняя строка работает. Только не очень понял зачем дополнительные функции использовать, если можно написать в конце: parameter A = PAR_AB.var_a; Тогда и функция один раз выполнится и можно несколько значений выцепить. Или нет?
  9. Добрый день. Есть такая задача: на вход модуля поступает массив параметров. Необходимо этот массив обработать и на его основе получить другой массив параметров, который в свою очередь будет использоваться для 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(); Выглядит, как костыль, но на практике все считалось Квартусом перед синтезом и на основе результата уже синтезировалась логика. Но сейчас мне понадобилось вытащить из функции несколько значений (причем разных по размерам) и присвоить их параметрам. Как можно это реализовать? Я попытался сделать выходные сигналы у функции, но вот как их потом присвоить параметру? Может вообще есть какой то другой вариант области в которой можно производить вычисления и создавать новые параметры?
  10. Получается память будет двухпортовая? Один порт будет добавлять (или перезаписывать) записи во время поступления нового Mac адреса, а второй порт (параллельно этому) будет опрашивать последовательно все записи и декрементировать счётчики реализуя механизм устаревания? Попробую. Я почему-то думал, что generate сам по себе создаёт несколько отдельных модулей
  11. Хорошая идея, получится настраиваемый компромисс между количеством тактов для сброса и объёмом памяти. Да, надо весь механизм с устареванием сюда грамотно засунуть. Если использовать ram для хранения информации о валидности, а не регистры, то это несколько усложняет это дело По простому походу не выйдет) придётся засесть.. Смотрю ещё протокол RSTP, и он подразумевает такие случаи, когда необходимо не просто очистить таблицу, а очистить только записи маков, которые относятся к определённому порту назначения. Чувствую, что с этим тоже повожусь. Спасибо за помощь!
  12. То есть сделать массив регистров по количеству записей в таблице коммутации, где каждый регистр будет содержать флаг валидности записи в таблице? Если вы это имели в виду, то я держу в голове этот способ. Смущает, что он все таки прилично логики займёт.
  13. В любом случае, записи как то надо похерить, причём не одну конкретную, а все сразу
  14. Хорошо, спасибо. Этим и займусь.
  15. Я думал имеется в виду готовое решение. А почему cam очищать не нужно? Предположим мне пришёл сигнал, который говорит, что топология изменилась данные о местоположение узлов в сети недействительны (в таблице) . А затем пришёл пакет с данными с определённым MAC адресом назначения. Моё устройство начинает адрес назначения искать в таблице и находит запись, но она же недействительна и использовать её нельзя.