Jump to content

    

Fitc

Свой
  • Content Count

    80
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Fitc

  • Rank
    Частый гость

Контакты

  • ICQ
    Array
  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);