Tsegorah
Участник-
Постов
14 -
Зарегистрирован
-
Посещение
Репутация
0 Обычный-
Очерёдность событий в systemverilog
Tsegorah опубликовал тема в Языки проектирования на ПЛИС (FPGA)
Здравствуйте. Есть функция интерфейса внутри блока program, которая возвращает значение данных, когда есть готовность и валидность. interface UDDCP_interface(input bit clk); logic [31:0] data; logic data_valid; logic message_start; logic read_ready; ... task automatic get_sample(ref int d, ref bit ms); forever begin @(posedge clk); if (read_ready && data_valid) begin d = data; ms = message_start; break; end end endtask endinterface Есть код, который приводит в действие сигнал готовности, делая его единицей каждый второй такт. ... class driver#(parameter p=11, c_settings_num=50); ... task main; ... fork forever begin @(posedge UDDCP_rout.clk); UDDCP_rout.read_ready = ~UDDCP_rout.read_ready; end join_none ... endtask ... endclass И есть класс, в котором я пытаюсь поймать данные. ... class monitor#(parameter c_settings_num=50); ... task main; ... fork ... fill_UDDCP_fifo(UDDCP_fifo); join_none ... endtask ... task automatic fill_UDDCP_fifo(ref UDDCP_transaction trans[$]); ... forever begin ... UDDCP_get_message(t); ... end endtask task automatic UDDCP_get_message(ref UDDCP_transaction trans); ... while(!mstart) UDDCP_rout.get_sample(data, mstart); ... endtask endclass Мне с тестируемого модуля приходят 2 сообщения. В первом из них data_valid переключается вместе с read_ready. Вопрос: почему для первого сообщения условие "read_ready && data_valid" не срабатывает, а со вторым всё ок? У меня предположение, что read_ready переключается позже, чем data_valid, а get_sample выполняется раньше. Тогда как это исправить? -
В VHDL рекурсия спокойно работает.
-
Вы имеете в виду uvm_transaction? Я не видел больше готовых транзакций в systemverilog. Возможно, я и так транзакции использую, о которых вы говорите. У меня другая проблема. Я передаю ссылку на объект через mailbox из генератора в драйвер. Теперь мне надо сгенерировать следующий объект, не удалив предыдущий. Если бы у меня был динамический массив в качестве поля объекта, я бы вызвал метод new(), и он вернул бы мне новый указатель, а старый указатель использовался бы предыдущим объектом. А у queue нет new(). Получается, её можно только удалить и создать заново, но на неё ссылается старый объект, который таким образом испортится.
-
Всем спасибо, я разобрался... Я получал неправильный размер t.transaction_full.size, потому что не удалял предыдущее содержимое массива. А в цикле действительно всё правильно работало. Подскажите тогда, пожалуйста, если я в N-й итерации цикла генерю массив объектов, а потом передаю его в другой объект, то как сгенерить следующий массив в N+1, чтобы предыдущий продолжил существовать? То есть, мне нужно в цикле передавать из генератора в драйвер объект, содержащий очередь. Если я в генераторе сделаю queue.delete(), то эта очередь исчезнет в драйвере?
-
Здравствуйте. Есть такой код: class driver... task main; automatic int sender_iterator; ... forever begin ... sender_iterator=0; while(sender_iterator<t.transaction_full.size) begin fork automatic int k = sender_iterator; begin $display("---transaction index automatic %d---", k); $display("---transaction index foreach %d---", sender_iterator); send_UDDCP_arr(t.transaction_full[k], UDDCP_inputs[k]); end join_none sender_iterator++; end ... wait fork; ... end endtask endclass Когда происходит первая итерация цикла forever begin, я вижу в консоли: # ---transaction index automatic 10--- # ---transaction index foreach 11--- # ---transaction index automatic 9--- # ---transaction index foreach 11--- # ---transaction index automatic 8--- # ---transaction index foreach 11--- # ---transaction index automatic 7--- # ---transaction index foreach 11--- # ---transaction index automatic 6--- # ---transaction index foreach 11--- # ---transaction index automatic 5--- # ---transaction index foreach 11--- # ---transaction index automatic 4--- # ---transaction index foreach 11--- # ---transaction index automatic 3--- # ---transaction index foreach 11--- # ---transaction index automatic 2--- # ---transaction index foreach 11--- # ---transaction index automatic 1--- # ---transaction index foreach 11--- # ---transaction index automatic 0--- # ---transaction index foreach 11--- Но во второй итерации я вижу: # ---transaction index automatic 21--- # ---transaction index foreach 22--- После этого я обращаюсь к несуществующему элементу, и программа падает. Почему не обнуляется sender_iterator?
-
У меня есть модель на питоне, которая генерит входные данные для ЦОС в 90 разных файлов. Я хочу подать эти данные на вход теста на systemverilog, чтобы получить результат обработки на VHDL и сравнить с другой моделью на питоне. И я не хочу вбивать названия файлов вручную. Насколько я читал, $system работает только в linux. А снаружи симулятора как делать?
-
Собственно, вопрос в заголовке. Мне нужно загрузить данные из всех файлов, содержащих определённую подстроку.
-
Здравствуйте. В пакете есть задача: task wait_one(inout logic c, s); while(1) begin @(posedge c); if(s) break; end endtask Я вызываю её внутри класса таким образом: task automatic send_UDDCP(UDDCP_transaction_full transaction, virtual UDDCP_interface intf); ... wait_one(intf.clk, intf.read_ready); ... endtask Проблема в том, что строчка @(posedge c); никогда не исполняется. Но, если заменить этот код на другой, без вызова задачи, всё работает: task automatic send_UDDCP(UDDCP_transaction_full transaction, virtual UDDCP_interface intf); ... while(1) begin @(posedge intf.clk); if(intf.read_ready) break; end ... endtask Насколько я понимаю, верилог копирует c и s только 1 раз при входе в задачу. Я попробовал другой вариант: task automatic wait_one(ref logic c, s); while(1) begin @(posedge c); if(s) break; end endtask Но, когда я пытаюсь запустить симуляцию, мне говорят, что "Actual argument expression for ref formal 'c' is not an equivalent type." Системверилог не умеет передавать ссылку на поле виртуального интерфейса, или в чём проблема?
-
Есть конструктор: function new (const ref UDDCP_header h, const ref int unsigned d[$], bit v[$], int b, int a); Так он работает: int be, aa; ... be = 100; aa = 250; trans_single = new(h[i],d[i],valids_single,be,aa); А так нет: trans_single = new(h[i],d[i],valids_single,100,250); Моделсим при компиле говорит, что "The expression "100" is illegal for use with ref argument "b"". Почему?
-
NCO в ПЛИС
Tsegorah ответил щещ тема в Языки проектирования на ПЛИС (FPGA)
Наверно, не актуально уже, но... Про какие параметры тебе непонятно конкретно? Смотри по картинке на второй вкладке, устраивает ли тебя итоговый спектр. clock rate и desired output frequency переключай, они ни на что не влияют, чисто на картинку, и подсказывают, какой инкремент фазы подать для нужной частоты. Наверно, где-то в каталоге сгенеренного ядра лежат файлы для симуляции, чтобы ты ещё в свою модель мог вставить. -
Вы говорите "все ушли". Есть какое-то сообщество системвериложников со своей модой и традициями? Как его найти?
-
Разобрался. Только написал на форум, как всё заработало. new.7z
-
Так было в примере. Насколько я понял, так сделано потому, что program исполняется в отдельном timing region, чтобы избежать гонок с тестируемым модулем. Исправил вложение, чтобы точно компилилось моделсимом. new.7z
-
Здравствуйте. У меня есть модуль с массивом интерфейсов в портах. Как передать этот массив в тест? Я создал ещё один параметризованный тип интерфейса, где параметр - число исходных интерфейсов. Всё компилится, но, когда я запускаю симуляцию, моделсим пишет, что "illegal assignment to type 'virtual UDDCP_interface_arr' from type 'interface UDDCP_interface_arr #(11)". Видимо, мне надо как-то передать параметр внутрь блока program, чтобы при этом параметр был виден уже в портах. Я попытался это сделать, но так не компилится, выдаёт ошибку из-за того, что рараметр объявлен позже, чем используется: program test(UDDCP_interface UDDCP_rout, UDDCP_interface_arr #(p) UDDCP_inputs, additional_ports add_ports); parameter p=11; ... Можно как-то сделать параметризованные порты у program? Я не нашёл примеров. Или вообще можно не городить огород, а просто как-то передавать массив интерфейсов через программу в объект класса? На всякий случай файлы исходников прикреплю. new.7z