Fitc
Свой-
Постов
80 -
Зарегистрирован
-
Посещение
Весь контент Fitc
-
Я это обычно делаю удалением текущей библиотеки и созданием новой. Открыть окно "Library", щелкнуть правой кнопкой по библиотеке, в контекстном меню выбрать Delete, в окне "Delete library mappings" отметить "Delete physical library as well", нажать Yes. В окне "Library" щелкнуть правой кнопкой в области окна и в контекстном меню выбрать New->Library..., в окне Create New Library ввести Library Name (work), Library Physical Name (work). Нажать Ок.
-
внутри модуля интерфейс объявляется как обычно. В Quartus поддержка SystemVerilog всегда была не очень, сейчас не знаю как обстоят дела
-
Verilog $random
Fitc ответил likeasm тема в Языки проектирования на ПЛИС (FPGA)
автоматизированно проще всего это сделать средствами tcl-скрипта: в random передать в качестве аргумента параметр или макроопределение, значение которого передается в команде запуска моделирования, сгенерировать средствами tcl случайный seed и передать его в команду запуска моделирования, при этом не забыть сохранить значение seed, чтобы в случае ошибки воспроизвести random-последовательность -
Verilog $random
Fitc ответил likeasm тема в Языки проектирования на ПЛИС (FPGA)
random генерирует псевдослучайные значения в соответствии с алгоритмом генерации псевдослучаных значений, впервые определенном ЕМНИП в стандарте IEEE 1364-2001. Аргументом является начальное значение генератора псевдослучаных чисел (seed). Для одинакового seed последолвательность псевдослучайных значений между запусками моделирования не изменяется. -
Проблема с ModelSim
Fitc ответил jenya7 тема в Среды разработки - обсуждаем САПРы
Если абсолютный установочный путь содержит неанглийские или спец. символы, то можно попробовать переустановить по нормальному пути Попробуйте создать проект через командную строку, выполнив в окне transcript следующую команду: project new c:/my_new_proj my_new_proj1 где c:/my_new_proj - местоположение проекта, my_new_proj1 - имя проекта -
Да. В 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
-
Так и есть, поскольку макроопределение подставляется перед компиляцией, а generate выполняется во время линковки (elaboration) В вашем случае можно порт объявить в виде массива, разрядность которого определяется через список параметров модуля, а в generate обращаться к соответствующему элементу массива
-
Приведите полный код. По данному описанию ничего не понятно ////////////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 ////////////////////////////////
-
Не надо определять в одной области видимости интерфейсы с одинаковыми именами. Modelsim сначала распознал первый интерфейс bus_a, встретив второй интерфейс с тем же именем, он переопределил интерфейс bus_a. Если в разделе "TOP 1" везде поменять bus_a на bus_b все успешно скомпилится и запустится
-
Если сделать `include "<имя подпапки>/<имя файла>" для каждого файла в индивидуальную область видимости, например, в отдельный module или package (есть только в SystemVerilog), то можно обращаться через имя модуля/пакета к параметру, например, my_module::my_param. Только не понятно зачем так делать, если параметр можно сделать массивом и обращаться к определенному элементу по индексу.
-
Потому что assign и initial являются параллельными процессами, порядок выполнения которых не определен. В данном случае первым выполняется процесс initial, когда assign еще не выполнился и не присвоил значение wire. А inline-инициализация статических переменных ЕМНИП выполняется раньше выполнения процессов. Если в initial в начале добавить задержку, то вариант с wire также сработает.
-
Вы хотите в ходе работы тестбенча, т.е. во время непрерывного моделирования делать include файлов? Это невозможно. Так как `include это директива препроцессора, выполняемая во время препроцессинга/компиляции. Значения localparam во время моделирования также нельзя изменять, они устанавливаются на этапе линковки (elaboration). Если же нужно по очереди перезапускать моделирование с разными значениями localparam, то следует написать tcl-скрипт, который найдет все подпапки с нужными вам файлами, добавит incdir к нужной подпапке в команду vlog и запустит моделирование на заданный промежуток времени (или пока моделирование не завершится), далее добавит incdir к следующей подпапке и т.д., пока есть не обработанные файлы. Если нужны именно параметры, то рекомендую добавить список параметров к моделируемому/тестируемому модулю. В модуль верхнего уровня добавить параметры, значения которых устанавливаются в vsim с помощью параметра -g или -G. Другой вариант - это промоделить все варианты одновременно, тогда нужно создать массив параметров и в generate создать экземпляр с нужным набором параметров, далее все это параллельно промоделить.
-
Если используете $urandom_range, значит пишете на SystemVerilog. $urandom_range не лучший вариант генерации псевдослучайных воздействий в SystemVerilog из-за равномерного распределения. Лучше использовать классы со случайными переменными и констрейнтами (см.стандарт или SystemVerilog for Veriifcation). Но на начальных этапах можете и $urandom_range использовать. Что мешает присвоить сигналу readdatavalid результат $urandom_range(1,0)?
-
localparam Path = "D:/Sig0/test"; localparam Filename = "/ref.hex"; reg[7:0] Number; initial begin Number = "1"; $readmemh({Path, Number, Filename}, RefMem); end
-
localparam Path = "D:\\Path\\"; localparam Filename = "Filename.txt"; $readmemh({Path, Filename}, mem);
-
Компиляция в Riviera-PRO
Fitc ответил dde29 тема в Среды разработки - обсуждаем САПРы
Подраздел 9.2.2.4 стандарта 1800-2009 Подраздел 9.2.2.2.2 стандарта 1800-2009, третий пункт маркированного списка: В modelsim/questasim вносить неисправности можно через графический итерфейс в окне objects/local - неявно выполняются tcl-скрипты, включающие команды типа force. Можно явно вызывать данные команды через собственные tcl-скрипты. Думаю, также неисправности можно вносить с помощью PLI. -
defparam переопределяет значения параметров экземпляра модуля. Практически во всех своих старых примерах кода Altera использует defparam для переопределения параметров вместо списка параметров. Список параметров появился в стандарте Verilog 2001, в стандарте Verilog 1995 его еще не было, возможно поэтому во всех своих древних модулях, Altera использует defparam вместо списка параметров. Если хотите использовать старый Quartus - используйте defparam. Однако, у defparam есть ряд ограничений, а также в последних стандартах SystemVerilog не рекомендуют использовать defparam и сообщают, что, возможно, уберут defparam из языка в будущих стандартах
-
Компиляция в Riviera-PRO
Fitc ответил dde29 тема в Среды разработки - обсуждаем САПРы
Присваивайте начальное значение reset при объявлении, например: logic reset = 1'b1; -
Берете GTKWave, лезете в исходный код и меняете его как вам надо
-
Редакторы HDL
Fitc ответил zorromen тема в Среды разработки - обсуждаем САПРы
Если не установлен "Package control", то установить через "Tools"-> "Install package control ...". Далее нажать "Preferences" -> "Package control", ввести install Package, нажать enter, ввести SystemVerilog, нажать enter -
ссылка на библиотеку clue_logic
-
Можно было бы сделать класс-обертку для динамического массива следующего вида: 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.
-
Проверил, все работает, как написано. Вот пример, аналогичный вашему, который запускал с использованием 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, т.к. имеют сомнительные перспективы повторной используемости и лучше их не разделять с интерфейсом, статические переменные которого используются в классе), поэтому приведенный в ссылке способ определения класса в интерфейсе мне нравится больше.
-
Кроме того, что в класс можно не передавать необходимые только для итерфейса параметры, появляется возможножсть использовать на полную полиморфизм и наследование классов. Я обычно объявляю абстрактный класс, содержащий pure virtual методы, который я передаю вместо виртуального интерфейса в uvm-классы. Внутри интерфейса я объявляю класс или классы, унаследованные от абстрактного класса, которые реализуют методы различным образом, например есть вариант с использованием clocking блока и с использованием сигналов напрямую. От уже созданных реализаций классов также можно наследоваться и переопределять работу определенных методов, например для асинхронных интерфейсов переопределять методы, отвечающие за задержки, создавая реализации манимальных, максимальных и средних задержек и т.д. Чтобы переключаться между вариантами реализации нужно только указать экземпляр какого класса нужно создать. uvm классы менять не нужно, так как в них передан базовый класс. Также это позволяет вообще не указывать параметры для базового класса, если в данный базовый класс не помещать методы, которым необходимы параметры. Можно сделать еще один базовый класс, унаследованный от другого, расширив его методами, которым нужны параметры, тогда в драйвере и мониторе нужно будет один раз в build_phase привести к базовому классу с нужными параметрами (тут надо учесть, что это подходит, если использовать механизм переопределения компонентов uvm для преобразования базовых классов monitor и driver в заданные реализации классов monitor и driver, использующие базовый класс с конкретными параметрами). Вы не можете подключать в порты модуля сигналы через clocking блок, т.к. это эквивалентно непрерывному присваиванию и асинхронной логике, clocking блок предназначен для описания синхронной логики и присваивания и чтения сигналов через clocking блок можно делать только в последовательном блоке. Clocking блок предназначен для установки сигналов с задержкой со стороны тестбенча, если вы пытаетесь достигнуть того, чтобы my_module устанавливал сигналы с задержкой, то мне кажется clocking блок для этого не очень подходит. Если же вы напрямую подключите сигналы к модулю (например, как в примере, который я привел), все будет работать, кроме того, что my_module не будет создавать задержки при установке сигналов. а покажите как вызываете task
-
Я получил задержки установки сигналов относительно фронта и возможность считывания сигналов за определенное время до фронта. @(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