Jump to content

    

Fitc

Свой
  • Content Count

    80
  • Joined

  • Last visited

Everything posted by Fitc


  1. Я это обычно делаю удалением текущей библиотеки и созданием новой. Открыть окно "Library", щелкнуть правой кнопкой по библиотеке, в контекстном меню выбрать Delete, в окне "Delete library mappings" отметить "Delete physical library as well", нажать Yes. В окне "Library" щелкнуть правой кнопкой в области окна и в контекстном меню выбрать New->Library..., в окне Create New Library ввести Library Name (work), Library Physical Name (work). Нажать Ок.
  2. внутри модуля интерфейс объявляется как обычно. В Quartus поддержка SystemVerilog всегда была не очень, сейчас не знаю как обстоят дела
  3. автоматизированно проще всего это сделать средствами tcl-скрипта: в random передать в качестве аргумента параметр или макроопределение, значение которого передается в команде запуска моделирования, сгенерировать средствами tcl случайный seed и передать его в команду запуска моделирования, при этом не забыть сохранить значение seed, чтобы в случае ошибки воспроизвести random-последовательность
  4. random генерирует псевдослучайные значения в соответствии с алгоритмом генерации псевдослучаных значений, впервые определенном ЕМНИП в стандарте IEEE 1364-2001. Аргументом является начальное значение генератора псевдослучаных чисел (seed). Для одинакового seed последолвательность псевдослучайных значений между запусками моделирования не изменяется.
  5. Если абсолютный установочный путь содержит неанглийские или спец. символы, то можно попробовать переустановить по нормальному пути Попробуйте создать проект через командную строку, выполнив в окне transcript следующую команду: project new c:/my_new_proj my_new_proj1 где c:/my_new_proj - местоположение проекта, my_new_proj1 - имя проекта
  6. Да. В verilog двумерные массивы в портах к сожалению не поддерживаются. Нужно писать что-то типа: input[pWORDS_CNT*pWORD_LENGTH-1:0] arr; genvar geni; for(geni=0; geni<pWORDS_CNT; ++geni) begin wire[pWORD_LENGTH-1:0] my_word; assign my_word = arr[geni*pWORD_LENGTH+pWORD_LENGTH-1:geni*pWORD_LENGTH]; end
  7. Так и есть, поскольку макроопределение подставляется перед компиляцией, а generate выполняется во время линковки (elaboration) В вашем случае можно порт объявить в виде массива, разрядность которого определяется через список параметров модуля, а в generate обращаться к соответствующему элементу массива
  8. Приведите полный код. По данному описанию ничего не понятно ////////////TB////////////// module tb(); logic reset = 'b0; top1 m1( .reset(reset) ); top2 m2( .reset(reset) ); endmodule ////////////TOP1//////////////////// module top1(input logic reset); interface bus_a(input logic reset); logic clk; logic clk_b; endinterface module m1(input logic reset); bus_a bus_a(.reset(reset)); m1_1 m1_1(.bus_a(bus_a)); endmodule module m1_1(bus_a bus_a); logic m1_1_clk = 'b0; assign bus_a.clk = m1_1_clk; assign bus_a.clk_b = ~ m1_1_clk; always #10 m1_1_clk <= ~m1_1_clk; endmodule m1 m1_instance( .reset(reset) ); endmodule /////////////TOP2///////////////// module top2(input logic reset); interface bus_a(input logic reset); logic clk; logic clk_a; endinterface module m2(input logic reset); bus_a bus_a(.reset(reset)); m2_1 m2_1(.bus_a(bus_a)); endmodule module m2_1(bus_a bus_a); logic m2_1_clk = 'b0; assign bus_a.clk = m2_1_clk; assign bus_a.clk_a = ~ m2_1_clk; always #20 m2_1_clk <= ~m2_1_clk; endmodule m2 m2_instance( .reset(reset) ); endmodule ////////////////////////////////
  9. Не надо определять в одной области видимости интерфейсы с одинаковыми именами. Modelsim сначала распознал первый интерфейс bus_a, встретив второй интерфейс с тем же именем, он переопределил интерфейс bus_a. Если в разделе "TOP 1" везде поменять bus_a на bus_b все успешно скомпилится и запустится
  10. Если сделать `include "<имя подпапки>/<имя файла>" для каждого файла в индивидуальную область видимости, например, в отдельный module или package (есть только в SystemVerilog), то можно обращаться через имя модуля/пакета к параметру, например, my_module::my_param. Только не понятно зачем так делать, если параметр можно сделать массивом и обращаться к определенному элементу по индексу.
  11. Потому что assign и initial являются параллельными процессами, порядок выполнения которых не определен. В данном случае первым выполняется процесс initial, когда assign еще не выполнился и не присвоил значение wire. А inline-инициализация статических переменных ЕМНИП выполняется раньше выполнения процессов. Если в initial в начале добавить задержку, то вариант с wire также сработает.
  12. Вы хотите в ходе работы тестбенча, т.е. во время непрерывного моделирования делать include файлов? Это невозможно. Так как `include это директива препроцессора, выполняемая во время препроцессинга/компиляции. Значения localparam во время моделирования также нельзя изменять, они устанавливаются на этапе линковки (elaboration). Если же нужно по очереди перезапускать моделирование с разными значениями localparam, то следует написать tcl-скрипт, который найдет все подпапки с нужными вам файлами, добавит incdir к нужной подпапке в команду vlog и запустит моделирование на заданный промежуток времени (или пока моделирование не завершится), далее добавит incdir к следующей подпапке и т.д., пока есть не обработанные файлы. Если нужны именно параметры, то рекомендую добавить список параметров к моделируемому/тестируемому модулю. В модуль верхнего уровня добавить параметры, значения которых устанавливаются в vsim с помощью параметра -g или -G. Другой вариант - это промоделить все варианты одновременно, тогда нужно создать массив параметров и в generate создать экземпляр с нужным набором параметров, далее все это параллельно промоделить.
  13. Если используете $urandom_range, значит пишете на SystemVerilog. $urandom_range не лучший вариант генерации псевдослучайных воздействий в SystemVerilog из-за равномерного распределения. Лучше использовать классы со случайными переменными и констрейнтами (см.стандарт или SystemVerilog for Veriifcation). Но на начальных этапах можете и $urandom_range использовать. Что мешает присвоить сигналу readdatavalid результат $urandom_range(1,0)?
  14. localparam Path = "D:/Sig0/test"; localparam Filename = "/ref.hex"; reg[7:0] Number; initial begin Number = "1"; $readmemh({Path, Number, Filename}, RefMem); end
  15. localparam Path = "D:\\Path\\"; localparam Filename = "Filename.txt"; $readmemh({Path, Filename}, mem);
  16. Подраздел 9.2.2.4 стандарта 1800-2009 Подраздел 9.2.2.2.2 стандарта 1800-2009, третий пункт маркированного списка: В modelsim/questasim вносить неисправности можно через графический итерфейс в окне objects/local - неявно выполняются tcl-скрипты, включающие команды типа force. Можно явно вызывать данные команды через собственные tcl-скрипты. Думаю, также неисправности можно вносить с помощью PLI.
  17. defparam переопределяет значения параметров экземпляра модуля. Практически во всех своих старых примерах кода Altera использует defparam для переопределения параметров вместо списка параметров. Список параметров появился в стандарте Verilog 2001, в стандарте Verilog 1995 его еще не было, возможно поэтому во всех своих древних модулях, Altera использует defparam вместо списка параметров. Если хотите использовать старый Quartus - используйте defparam. Однако, у defparam есть ряд ограничений, а также в последних стандартах SystemVerilog не рекомендуют использовать defparam и сообщают, что, возможно, уберут defparam из языка в будущих стандартах
  18. Присваивайте начальное значение reset при объявлении, например: logic reset = 1'b1;
  19. Если не установлен "Package control", то установить через "Tools"-> "Install package control ...". Далее нажать "Preferences" -> "Package control", ввести install Package, нажать enter, ввести SystemVerilog, нажать enter
  20. Можно было бы сделать класс-обертку для динамического массива следующего вида: class #(type atom_t=bit, int ITEM_LENGTH=8) my_class; //параметр нужен для определения является ли тип знаковым parameter UITEM_MAX_VALUE = 2**ITEM_LENGTH-1; parameter MAX_VALUE = ...; parameter MIN_VALUE = ...; typedef atom_t[ITEM_LENGTH-1:0] item_t; typedef item_t dynamic_array_t[]; ... endclass в качестве atom_t можно указывать bit, bit signed, logic,... В случае signed для вычисления MAX_VALUE и MIN_VALUE нужно добавить функцию, которая бы определяла, знаковый тип или нет путем присвоения UITEM_MAX_VALUE переменной типа item_t и сравнения результата с UITEM_MAX_VALUE. Если они равны - тип беззнаковый. Данную функцию использовать для вычисления параметров MAX_VALUE и MIN_VALUE. Можно пойти и другим путем -urandom_range вызвать для беззнаковой версии элемента массива, результат привести к signed и присвоить элементу массива. Ну или вместо urandom_range использовать randomize. Также, если интересуют всяческие удобные контейнеры и не только, советую взглянуть на библиотеку clue_logic.
  21. Проверил, все работает, как написано. Вот пример, аналогичный вашему, который запускал с использованием Questasim 10.4b. interface my_if(input clk); logic a, b, c; default clocking cb_env @(posedge clk); default input #1step output #2ns; output a; output b; output c; endclocking task set; ##0; a <= 1; ##1; b <= 1; ##1; c <= 1; ##2; a <= 0; b <= 0; c <= 0; endtask endinterface module top; bit clk; my_if intf(clk); initial begin clk = 0; fork forever begin clk = ~clk; #5; end begin for(int i = 0; i < 10; i++) begin for(int j = 0; j< 10; j++) intf.set(); #100; end end join end endmodule Вот полученная диаграмма: Возможно ваши ошибки связаны со средой моделирования, которую используете? Можно было бы делать наоборот - засовывать виртуальный интерфейс в класс, но зависимость от интерфейса никуда не исчезает, кода становится немного больше, и такой класс нужно еще куда-то вставить (такие классы, по моему мнению не заслуживают вставки в package, т.к. имеют сомнительные перспективы повторной используемости и лучше их не разделять с интерфейсом, статические переменные которого используются в классе), поэтому приведенный в ссылке способ определения класса в интерфейсе мне нравится больше.
  22. Кроме того, что в класс можно не передавать необходимые только для итерфейса параметры, появляется возможножсть использовать на полную полиморфизм и наследование классов. Я обычно объявляю абстрактный класс, содержащий pure virtual методы, который я передаю вместо виртуального интерфейса в uvm-классы. Внутри интерфейса я объявляю класс или классы, унаследованные от абстрактного класса, которые реализуют методы различным образом, например есть вариант с использованием clocking блока и с использованием сигналов напрямую. От уже созданных реализаций классов также можно наследоваться и переопределять работу определенных методов, например для асинхронных интерфейсов переопределять методы, отвечающие за задержки, создавая реализации манимальных, максимальных и средних задержек и т.д. Чтобы переключаться между вариантами реализации нужно только указать экземпляр какого класса нужно создать. uvm классы менять не нужно, так как в них передан базовый класс. Также это позволяет вообще не указывать параметры для базового класса, если в данный базовый класс не помещать методы, которым необходимы параметры. Можно сделать еще один базовый класс, унаследованный от другого, расширив его методами, которым нужны параметры, тогда в драйвере и мониторе нужно будет один раз в build_phase привести к базовому классу с нужными параметрами (тут надо учесть, что это подходит, если использовать механизм переопределения компонентов uvm для преобразования базовых классов monitor и driver в заданные реализации классов monitor и driver, использующие базовый класс с конкретными параметрами). Вы не можете подключать в порты модуля сигналы через clocking блок, т.к. это эквивалентно непрерывному присваиванию и асинхронной логике, clocking блок предназначен для описания синхронной логики и присваивания и чтения сигналов через clocking блок можно делать только в последовательном блоке. Clocking блок предназначен для установки сигналов с задержкой со стороны тестбенча, если вы пытаетесь достигнуть того, чтобы my_module устанавливал сигналы с задержкой, то мне кажется clocking блок для этого не очень подходит. Если же вы напрямую подключите сигналы к модулю (например, как в примере, который я привел), все будет работать, кроме того, что my_module не будет создавать задержки при установке сигналов. а покажите как вызываете task
  23. Я получил задержки установки сигналов относительно фронта и возможность считывания сигналов за определенное время до фронта. @(cb) позволяет не писать явно фронт частоты, по которому я хочу выполнить действие. Вне program-блока не стоит пытаться считывать значения переменных через clocking block (например, cb.data) после event control конструкции (например, @(posedge clk)) или другого события, отличного от @(cb), т.к. возникают гонки между старым значением переменной и новым. Об этом явно написано в стандарте 1800-2009 (под рисунком 14-1). Для меня это важно, т.к. я по множесту причин не использую блок program, а также это создает мне неудобство при взаимодействии sequence и драйвера в uvm, но это все решаемо путем слежения за другими событиями. Где пруфы? Всегда так делаю и все работает, благо в стандарте аналогичные примеры есть (см. подраздел 14.8). Не знаю, как у вас я использую подход, описанный в ссылке в моем первом посте, где вместо виртуальных интерфейсов используются классы, а функции и таски, в представленном мною примере в предыдущем посте, содержатся в классах и они хорошо инкапсулируют подробности реализации интерфейса, что хорошо сказывается на повторной используемости и мне неважно используется ли clocking блок при установке/чтении сигналов или нет, я просто вызываю методы. Никто вас не заставляет писать также. А плюсы в clocking блоке в том, что фронт частоты (posedge, negedge) и задержки задаются в одном месте, а дальше используется только событие clocking (например, @cb) и идентификаторы (например, cb.data). А можете рассказать, что именно вы хотите написать и какой результат вам нужен? Также не понятно, что вам мешает обращаться к сигналам только через clocking block