Перейти к содержанию
    

Tsegorah

Участник
  • Постов

    14
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный
  1. Здравствуйте. Есть функция интерфейса внутри блока 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 выполняется раньше. Тогда как это исправить?
  2. Вы имеете в виду uvm_transaction? Я не видел больше готовых транзакций в systemverilog. Возможно, я и так транзакции использую, о которых вы говорите. У меня другая проблема. Я передаю ссылку на объект через mailbox из генератора в драйвер. Теперь мне надо сгенерировать следующий объект, не удалив предыдущий. Если бы у меня был динамический массив в качестве поля объекта, я бы вызвал метод new(), и он вернул бы мне новый указатель, а старый указатель использовался бы предыдущим объектом. А у queue нет new(). Получается, её можно только удалить и создать заново, но на неё ссылается старый объект, который таким образом испортится.
  3. Всем спасибо, я разобрался... Я получал неправильный размер t.transaction_full.size, потому что не удалял предыдущее содержимое массива. А в цикле действительно всё правильно работало. Подскажите тогда, пожалуйста, если я в N-й итерации цикла генерю массив объектов, а потом передаю его в другой объект, то как сгенерить следующий массив в N+1, чтобы предыдущий продолжил существовать? То есть, мне нужно в цикле передавать из генератора в драйвер объект, содержащий очередь. Если я в генераторе сделаю queue.delete(), то эта очередь исчезнет в драйвере?
  4. Здравствуйте. Есть такой код: 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?
  5. У меня есть модель на питоне, которая генерит входные данные для ЦОС в 90 разных файлов. Я хочу подать эти данные на вход теста на systemverilog, чтобы получить результат обработки на VHDL и сравнить с другой моделью на питоне. И я не хочу вбивать названия файлов вручную. Насколько я читал, $system работает только в linux. А снаружи симулятора как делать?
  6. Собственно, вопрос в заголовке. Мне нужно загрузить данные из всех файлов, содержащих определённую подстроку.
  7. Здравствуйте. В пакете есть задача: 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." Системверилог не умеет передавать ссылку на поле виртуального интерфейса, или в чём проблема?
  8. Есть конструктор: 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"". Почему?
  9. Наверно, не актуально уже, но... Про какие параметры тебе непонятно конкретно? Смотри по картинке на второй вкладке, устраивает ли тебя итоговый спектр. clock rate и desired output frequency переключай, они ни на что не влияют, чисто на картинку, и подсказывают, какой инкремент фазы подать для нужной частоты. Наверно, где-то в каталоге сгенеренного ядра лежат файлы для симуляции, чтобы ты ещё в свою модель мог вставить.
  10. Вы говорите "все ушли". Есть какое-то сообщество системвериложников со своей модой и традициями? Как его найти?
  11. Так было в примере. Насколько я понял, так сделано потому, что program исполняется в отдельном timing region, чтобы избежать гонок с тестируемым модулем. Исправил вложение, чтобы точно компилилось моделсимом. new.7z
  12. Здравствуйте. У меня есть модуль с массивом интерфейсов в портах. Как передать этот массив в тест? Я создал ещё один параметризованный тип интерфейса, где параметр - число исходных интерфейсов. Всё компилится, но, когда я запускаю симуляцию, моделсим пишет, что "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
×
×
  • Создать...