Jump to content

    

Search the Community

Showing results for tags 'systemverilog'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Сайт и форум
    • Новости и обсуждения сайта и форума
    • Другие известные форумы и сайты по электронике
    • В помощь начинающему
    • International Forum
    • Образование в области электроники
    • Обучающие видео-материалы и обмен опытом
  • Cистемный уровень проектирования
    • Вопросы системного уровня проектирования
    • Математика и Физика
    • Операционные системы
    • Документация
    • Разработка цифровых, аналоговых, аналого-цифровых ИС
    • Электробезопасность и ЭМС
    • Управление проектами
    • Neural networks and machine learning (NN/ML)
  • Программируемая логика ПЛИС (FPGA,CPLD, PLD)
    • Среды разработки - обсуждаем САПРы
    • Работаем с ПЛИС, области применения, выбор
    • Языки проектирования на ПЛИС (FPGA)
    • Системы на ПЛИС - System on a Programmable Chip (SoPC)
  • Цифровая обработка сигналов - ЦОС (DSP)
    • Сигнальные процессоры и их программирование - DSP
    • Алгоритмы ЦОС (DSP)
  • Микроконтроллеры (MCs)
    • Cредства разработки для МК
    • ARM
    • AVR
    • MSP430
    • Все остальные микроконтроллеры
    • Отладочные платы
  • Печатные платы (PCB)
    • Разрабатываем ПП в САПР - PCB development
    • Работаем с трассировкой
    • Изготовление ПП - PCB manufacturing
  • Сборка РЭУ
    • Пайка, монтаж, отладка, ремонт
    • Корпуса
    • Вопросы надежности и испытаний
  • Аналоговая и цифровая техника, прикладная электроника
    • Вопросы аналоговой техники
    • Цифровые схемы, высокоскоростные ЦС
    • Rf & Microwave Design
    • Метрология, датчики, измерительная техника
    • АВТО электроника
    • Умный дом
    • 3D печать
    • Робототехника
  • Силовая Электроника - Power Electronics
    • Силовая Преобразовательная Техника
    • Обратная Связь, Стабилизация, Регулирование, Компенсация
    • Первичные и Вторичные Химические Источники Питания
    • Высоковольтные Устройства - High-Voltage
    • Электрические машины, Электропривод и Управление
    • Индукционный Нагрев - Induction Heating
    • Системы Охлаждения, Тепловой Расчет – Cooling Systems
    • Моделирование и Анализ Силовых Устройств – Power Supply Simulation
    • Компоненты Силовой Электроники - Parts for Power Supply Design
  • Интерфейсы
    • Форумы по интерфейсам
  • Поставщики компонентов для электроники
    • Поставщики всего остального
    • Компоненты
  • Майнеры криптовалют и их разработка, BitCoin, LightCoin, Dash, Zcash, Эфир
    • Обсуждение Майнеров, их поставки и производства
  • Дополнительные разделы - Additional sections
    • Встречи и поздравления
    • Ищу работу
    • Предлагаю работу
    • Kуплю
    • Продам
    • Объявления пользователей
    • Общение заказчиков и потребителей электронных разработок

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


AIM


MSN


Сайт


ICQ


Yahoo


Jabber


Skype


Город


skype


Facebook


Vkontakte


LinkedIn


Twitter


G+


Одноклассники

Found 7 results

  1. Доюрый день! Столкнулся с необходимостью работы с массивом констант в виде упакованно-неупакованных конструкций. вот пример того, что мне необходимо: localparam int N = 5; localparam int W = 18; const logic [ADDR_W-1 : 0] hard_point [N] = '{16, 17, 18, 19, 20}; на такую запись Квартус вываливает предупреждения: Warning (10030): Net "hard_point.data_a" at mem_reader.sv(61) has no driver or initial value, using a default initial value '0' Warning (10030): Net "hard_point.waddr_a" at mem_reader.sv(61) has no driver or initial value, using a default initial value '0' Warning (10030): Net "hard_point.we_a" at mem_reader.sv(61) has no driver or initial value, using a default initial value '0' Код работает исправно, но эти варнинги мне непонятны и хотелось бы с ними разобраться, но не совсем понятно, что от меня требует Квартус. Я понимаю, что необходимо указывать конкретную размерность данных, но затрудняюсь с синтаксисом. Прошу помощи.
  2. Доброго времени суток! Для облегчения жизни при сборке модулей в готовую систему решил сделать свой модуль как отдельное IP ядро с всеми необходимыми настройками параметров, включая размножение внутренних компонентов обработки, которые состоят из входного сигнала, логики+БРАМ, и выходной порт AXI. Всё написано на SystemVerilog и "выходной" порт AXI запихнут в отдельный интерфейс. Правдами и неправдами сумел собрать IP и договорится с bd что это и вправду компонент с AXI шинами (пришлось перегенерировать кучу портов и создать массу ненужных параметров, те которые с ID и USER). Для удобства создал параметр, который говорит сколько внутри размножено модулей и соответственно сколько входных сигналов и выодных AXIшин должно быть прокинуто. С помощью настройки Interface presence указал когда должны появляться порты (коих 32 штуки) по условию ($P_COMPONENT_NUM >N) для входных сигналов и AXI. Входные порты конфигурируются нормально без каких бы то ни было вопросов, все неиспользующиеся подвешиваются на 0. Но вот AXI начинает творить чудеса. BDувидел, что это AXI и что у него сконфигурированы все порты в соответствии с проприетарным интерфейсом "aximm", да вот только он пытается подключить все 32 AXI порта к несуществующим сигналам. В коде интерфейс сгенерированного топ файла IPядра выглядит где-то так: Тут ничего неординароного, а вот дальше генератор пытается создать и подключить все AXI порты: aximm S_AXI_0(); // Порт 0 присутствует assign S_AXI_0.WLAST = s_axi_0_s_axi_wlast; assign S_AXI_0.BREADY = s_axi_0_s_axi_bready; assign S_AXI_0.AWLEN = s_axi_0_s_axi_awlen; ... aximm S_AXI_1(); // Порт 1 присутствует assign S_AXI_1.WLAST = s_axi_1_s_axi_wlast; assign S_AXI_1.BREADY = s_axi_1_s_axi_bready; assign S_AXI_1.AWLEN = s_axi_1_s_axi_awlen; ... aximm S_AXI_2(); // Порт 2 отсутствует (не сконфигурирован) assign S_AXI_2.WLAST = s_axi_2_s_axi_wlast; assign S_AXI_2.BREADY = s_axi_2_s_axi_bready; assign S_AXI_2.AWLEN = s_axi_2_s_axi_awlen; ... aximm S_AXI_3(); // Порт 3 отсутствует (не сконфигурирован) assign S_AXI_3.WLAST = s_axi_3_s_axi_wlast; assign S_AXI_3.BREADY = s_axi_3_s_axi_bready; assign S_AXI_3.AWLEN = s_axi_3_s_axi_awlen; ... // И так все 32 порта из которых реально входит только 2 первых Ну и дальше идёт подключение к моему сгенерированному IP ядру. top_component inst ( .i_clk(i_clk), .s_axi_aclk(s_axi_aclk), .s_axi_aresetn(s_axi_aresetn), .s00_axi_0_s00_axi_araddr(s00_axi_0_s00_axi_araddr), .s00_axi_0_s00_axi_arprot(s00_axi_0_s00_axi_arprot), .s00_axi_0_s00_axi_arready(s00_axi_0_s00_axi_arready), ... // Конфигурация AXI Lite. Здесь всё нормально .S_AXI_0(S_AXI_0), // Подключён существующий порт .S_AXI_1(S_AXI_1), // Подключён существующий порт .S_AXI_2(S_AXI_2), // Подключён несуществующий порт. Который просто объявлен в топе .S_AXI_3(S_AXI_3), // Подключён несуществующий порт. Который просто объявлен в топе ... // И так далее до 31-го порта .i_signal_0(i_signal_0),// Подключён существующий вход .i_signal_1(i_signal_0),// Подключён существующий вход .i_signal_2(1'B0), // Подключён несуществующий вход. Который просто объявлен в топе .i_signal_3(1'B0), // Подключён несуществующий вход. Который просто объявлен в топе ... // И так далее до 31-го порта ); Как избежать такой ситуации? Нужно дополнительно указать какие-то параметры или вручную создать порты AXI? Этот файл генерируется автоматические и Xilinxпредупреждает: // DO NOT MODIFY THIS FILE.
  3. Доброго всем пятничного! Либо уже устал к концу недели, либо ещё что, но не могу понять в чём дело: module tb; logic clk; initial begin clk = 0; forever #10ns clk = !clk; end; task process_zone; input logic [7:0] size; output logic process_zone_end; enum {ST_ZONE_IDLE, ST_ZONE, ST_END_ZONE} state_zone; integer i; i = 0; forever @(posedge clk) begin case (state_zone) ST_ZONE_IDLE : state_zone <= ST_ZONE; ST_ZONE : state_zone <= i == size ? ST_END_ZONE : ST_ZONE; ST_END_ZONE : state_zone <= ST_END_ZONE; default : state_zone <= ST_ZONE_IDLE; endcase i = state_zone == ST_ZONE ? i + 1 : 0; process_zone_end = state_zone == ST_END_ZONE; end endtask : process_zone logic state_next_zone; initial #10ns process_zone (8'd5, state_next_zone); endmodule : tb state_next_zone остаётся в третьем состоянии, невзирая на process_zone_end: ЧЯДНТ? Проект на всякий случай также прилагаю. test.zip
  4. Здравствуйте, настал тут у меня момент отупения (всю неделю). Нужно реализовать асинхронный энкодер для параметризируемого регистра сдвига. Нужно контролировать фронт сигнала - то есть перепад подряд идущих единиц, пока не встретится стабильный ноль. Я написал такую функцию для преобразования входного потока, но она синтезируется в какую-то ерунду: function logic my_encoder( input logic [6 : 0] i_encode ); casez (i_encode) // приоритетный выбор "до первого ноля" 7'b??????1: return 3'b000; 7'b?????10: return 3'b001; 7'b????100: return 3'b010; 7'b???1000: return 3'b011; 7'b??10000: return 3'b100; 7'b?100000: return 3'b101; 7'b1000000: return 3'b110; default: return 3'b111; endcase Так как функции не параметризируются, а входной регистр может быть разной длинны, приходится по-рагульному встраивать в код: parameter p_length = 3; // анализ 3-х бит данных logic [3 : 0] r_data; // иходной вектор wire logic [1 : 0] r_data_encoded; // выходные декодированные данные assign {r_data_encoded} = my_encoder(r_data[p_length - 1 : 0]); Приоритетный перебор "менял местами" - ничего не помогло (перечисление наоборот). Подскажите возможное решение. А лучше почему данный Кейс финтезируется в какой-то бред (у меня всегда 1-й бит r_data_encoded подтянут на землю). З.Ы. Так же пробовал абстрагироваться от остальных значений и детектировать только наиболее раннее значение фронта, результат таков же: casez (i_encode) 7'b??????1: return 3'b000; 7'b?????10: return 3'b001; 7'b????10?: return 3'b010; 7'b???10??: return 3'b011; 7'b??10???: return 3'b100; 7'b?10????: return 3'b101; 7'b10?????: return 3'b110; default: return 3'b111; endcase
  5. Доброго времени, уважаемые. В процессе написания кода возникла необходимость сделать user-френдли компонент с упрощенным редактированием. В чём основная суть: создаётся в начале файла несколько структур, в которые "пользователь" (человек, далее работающий с кодом) может добавлять одномерные векторы (рандомной длинны), нужное количество. В упрощённом варианте первая структура несёт все елементы, во второй указано только то, что подлежит сбросу по определённому ивенту. module component_1(...); typedef struct packed{ logic [1:0] first; logic [0:0] second; logic [2:0] third; } t_elements; t_elements common_elements; typedef struct packed{ logic [0:0] second; } t_reset; t_reset reset_elements; always_ff @(posedge clk) if (reset == 1) for(int i=0; i < $size(t_elements); i++) // тут пошла отсебятина ибо не представляю как реализовать if (reset_elements.i == common_elements.i) common_elements.i <= '0; Как сделать референс/перечисление/другой вариант, чтобы автоматизировать задачу и не заставлять юзера лезть в дебри кода, для правки сбрасываемых компонентов? Возможно есть вариант с одной структурой и какими-то указателями. Я уже и через enum пробовал вытащить имена и думал за union. Всё какое-то громоздкое и неработающее.
  6. Приветствую! Многие кто пишет на SystemVerilog/Verilog знаком с оператором для динамического выбора нужных кусков вектора/переменной/массива_регистров. +: -: Больше часа ломал голову, как применить его в моем случае, может под вечер устал и не соображаю. Вот то, что мне нужен сделать (если бы стандарт верилога поддерживал такую запись для варьируемого индекса) data_o <= {buffer[4+shift_size-1:4],tmp[4:shift_size-1]}; Подскажите, пожалуйста, как описать такую конструкцию? ведь в ней варьируемая ширина вектора, а не фиксированная часть. Поддерживает ли верилог подобные штуки? Вот весь код. Сразу отвечаю, что пока не симулил, т.к. смысла нет (синтаксическая ошибка range must be bounded by constant expressions), и обычно планирую это делать следующим этапом, пока что я уперся в это. Если есть желающие, то прошу оставить обратную связь касательно кода. Буду рад любой аргументированной критике. Под Vivado 2018.2 module frame_aligner ( input clk_i , // Clock input arst_n , // Asynchronous reset active low input sync_i , input [3:0] data_i , output logic [5:0] data_o , output logic valid_o , // duty cycle = 2/3 output logic synced_o ); localparam SYNC_PATT = 12'b111111_000000; localparam SYNC_PATT_MR = ~SYNC_PATT; /*------------------------------------------------------------------------------ -- Functions ------------------------------------------------------------------------------*/ function automatic int unsigned clogb2_pure_f( input [31:0] value ); int unsigned i ; int unsigned temp ; begin temp = 32; for (i=31; i>0; i=i-1) begin if (2**i >= value) begin temp = i; end end return temp ; end endfunction function automatic logic [11:0] dynamic_shift_f ( input [11:0] data_i, input [clogb2_pure_f(12) - 1:0] ss); dynamic_shift_f = data_i; for (int i = 0; i < ss; i++) begin dynamic_shift_f = {dynamic_shift_f[0],dynamic_shift_f[11:1]}; end return dynamic_shift_f; endfunction /*------------------------------------------------------------------------------ -- Signals declaration ------------------------------------------------------------------------------*/ logic sync_ff,sync_fr,sync_cdc; typedef enum logic [1:0] { INIT, FIND_PATTERN, SYNC_MODE_SHIFT,SYNC_MODE_ZERO } fsm_t; fsm_t state, state_next; logic [ 1:0] cnt ; logic [11:0] buffer ; logic strb ; logic [11:0] shifted_data; logic [ 4:0] tmp ; logic match; logic [2:0] shift_size,shift_size_event; /*------------------------------------------------------------------------------ -- Clock Domain crossing ------------------------------------------------------------------------------*/ synchronize_ff #(.FF_CNT(3)) i_synchronize_ff (.clk_i(clk_i), .rstn_i(arst_n), .data_i(sync_i), .data_o(sync_cdc)); always_ff @(posedge clk_i or negedge arst_n) begin : proc_sync_ff if(~arst_n) begin sync_ff <= 0; end else begin sync_ff <= sync_cdc; end end assign sync_fr = !sync_ff && sync_cdc; /*------------------------------------------------------------------------------ -- Functional ------------------------------------------------------------------------------*/ always_ff @(posedge clk_i or negedge arst_n) begin : proc_cnt if(~arst_n) begin cnt <= 0; end else begin cnt <= cnt < 2 ? cnt + 1'b1 : '0; end end assign strb = cnt == 2; always_ff @(posedge clk_i or negedge arst_n) begin : proc_buffer if(~arst_n) begin buffer <= 0; end else begin buffer <= {data_i,buffer[7:4]}; end end always_ff @(posedge clk_i or negedge arst_n) begin : proc_shift_size if(~arst_n) begin shift_size <= 0; end else if ( strb ) begin if( state == FIND_PATTERN ) begin if( !match ) begin shift_size <= shift_size < 5 ? shift_size + 1'b1 : '0 ; end else begin shift_size <= shift_size < 5 ? shift_size + 1'b1 : '0 ; end end end end assign shift_size_event = ( shift_size != 0 ) ? ( 5 ) : ( shift_size - 1 ); always_ff @(posedge clk_i or negedge arst_n) begin : proc_shifted_data if(~arst_n) begin shifted_data <= 0; end else if (strb) begin shifted_data <= dynamic_shift_f(buffer,shift_size); end end assign match = ( shifted_data == SYNC_PATT ) || ( shifted_data == SYNC_PATT ); /*------------------------------------------------------------------------------ -- FSM ------------------------------------------------------------------------------*/ always_ff @(posedge clk_i or negedge arst_n) begin : proc_state if(~arst_n) begin state <= INIT; end else begin state <= state_next; end end always_comb begin : proc_state_next state_next = state; case (state) INIT : state_next = ( sync_fr ) ? ( FIND_PATTERN ): ( state ); FIND_PATTERN : state_next = ( match ) ? ((shift_size_event != 0 ) ? (SYNC_MODE_SHIFT) : (SYNC_MODE_ZERO)): ( state ) ; SYNC_MODE_SHIFT : state_next = state; SYNC_MODE_ZERO : state_next = state; default : state_next = INIT ; endcase end /*------------------------------------------------------------------------------ -- data to output ------------------------------------------------------------------------------*/ always_ff @(posedge clk_i or negedge arst_n) begin : proc_data_o if(~arst_n) begin data_o <= '0; valid_o <= 1'b0; tmp <= '0; end else begin case (state) SYNC_MODE_SHIFT : begin case (cnt) 1 : begin data_o <= {buffer[4+shift_size-1:4],tmp[4:shift_size-1]}; // ВОТ ТУТ! valid_o <= 1'b1; end 2 : begin data_o <= buffer[shift_size +:6]; tmp <= buffer[11:7]; valid_o <= 1'b1; end default : begin data_o <= data_o; valid_o <= 1'b0; end endcase end SYNC_MODE_ZERO : begin case (cnt) 1 : begin data_o <= buffer[7:2]; end 2 : begin data_o <= buffer[5:0]; end default : begin data_o <= data_o; valid_o <= 1'b0; end endcase end default : data_o <= data_o; endcase end end always_ff @(posedge clk_i or negedge arst_n) begin : proc_synced_o if(~arst_n) begin synced_o <= 1'b0; end else if ( match ) begin synced_o <= 1'b1; end end endmodule
  7. Добрый день! Подскажите, пожалуйста, простой и доступный способ реализации на SV функции генерации единичной матрицы. Вот набросок моего видения этой функции: function automatic logic[size-1:0][size-1:0] eye (input int size); for (int i = 0; i < size; i++) for (int j = 0; j < size; j++) eye[i][j] = (i == j); endfunction Понятно, что компилятор не видит size в шапке объявляемой функции. Не понятно, как описать функцию, у которой размерность выходного аргумента зависит входного аргумента.