mse 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба Есть вопрос. Как решить, не нашёл. Есть модуль, который многократно используется в проекте. Внутри него есть ROM. Собственно, модули и отличаются только содержимым ROM. Альтеровская LPM содержит внутри инстанса ROM путь к файлу. Но этот механизм не подходит для моего случая. Т.к. придётся отказаться от многократного использования модуля и написания уникальных модулей с конкретной прошивкой ROM. Как можно передать в вериложный модуль описания ROM, путь к файлу прошивки из верхнего иерархического уровня, как параметр/переменную для модуля? Вот сюда: // megafunction wizard: %ROM: 2-PORT% // GENERATION: STANDARD // VERSION: WM1.0 // MODULE: altsyncram defparam ... altsyncram_component.init_file = "my_file_0.mif", транзитом, через модуль более верхнего уровня. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба описание РОМа очень простое reg [SIZE - 1 : 0] Rom [LENGTH - 1 : 0]; initial begin //заполнить значениями из файла, путь передаем параметром //$readmemh(....) //или просто сразу из массива переданного параметром, если ромки небольшие end assign rom_data_out = Rom[Adr]; always @(posedge clk) Adr <= rom_adr_in; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Inanity 1 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба Есть другой вариант. Строку можно параметризировать, она не обязательно константа, как у вас. Допустим, что у вас следующая иерархия: top_module { module1 { rom0 rom1 rom2 ... romN } module2 { rom0 rom1 rom2 ... romM } } Суть в том, что каждый ROM должен иметь уникальное имя, которое будет зависеть от имени модуля верхнего уровня и своего порядкового номера в этом модуле. У rom0 из module1 должно получиться имя rom_module1_0 У rom1 из module1 должно получиться имя rom_module1_1 .... У rom34 из module2 должно получиться имя rom_module2_34 и тд. Остаётся сделать так, чтобы в имени инициализирующего файла каждого rom-а была параметр-строка "module1" и порядковый номер, которым будет переменная из generate-а. Теперь, когда все ROM-ы имеют имена, написать для всех инициализирующие файлы не сложно, сразу понятно кто где находится. Могу накидать небольшой пример, если не понятно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба описание РОМа очень простое reg [SIZE - 1 : 0] Rom [LENGTH - 1 : 0]; initial begin //заполнить значениями из файла, путь передаем параметром //$readmemh(....) //или просто сразу из массива переданного параметром, если ромки небольшие end assign rom_data_out = Rom[Adr]; always @(posedge clk) Adr <= rom_adr_in; Это понятно. Когда ROM инициализируется внутри модуля, проблем нет. Можно так, можно прямо в модуле ROM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба А что не понятно то? в файле пишите parameter ROM_DATA_FILE_NAME ="my_file.hex" его передаете в ром для инициализации, при инстанцировании модулей верхнего уровня задаете им параметры. Ну или как предлагали вам выше один файл на все случаи жизни, и РОМы сами в нем ищут информацию Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба Есть другой вариант. Строку можно параметризировать, она не обязательно константа, как у вас. Задача оформить как-то так module toplevel(...); ... logicBlock LB0(...,datapath0); logicBlock LB1(...,datapath1); ... endmodule module logicBlock(...,datapath); ... rommodule prom(...,datapath); ... endmodule module rommodule(...) initial $readmem "datapath"; ... endmodule вот... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 27 марта, 2017 Опубликовано 27 марта, 2017 · Жалоба Вы параметрами что-ли пользоваться не умеете? module #(parameter datapath = "default.hex") logicBlock(...); ... rom_module #(.datapath(datapath)) rom_inst(...); ... endmodule или module logicBlock(...); parameter datapath = "default.hex"; ... rom_module #(.datapath(datapath)) rom_inst(...); ... endmodule А при инстанце главного модуля logicBlock #(.datapath("my_file1.hex")) my_inst1 (...); logicBlock #(.datapath("my_file2.hex")) my_inst2 (...); .... rom модуль объявляется аналогично с параметром, который в загрузку файла и идет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 28 марта, 2017 Опубликовано 28 марта, 2017 · Жалоба Вы параметрами что-ли пользоваться не умеете? В таком ключе не приходилось. Спасибо, щас попробую, всё ли правильно понял. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба В таком ключе не приходилось. Спасибо, щас попробую, всё ли правильно понял. В общем так, добрался до компа, стал разбираться. Сразу завис на определении. module smallROM (addr,clk,q_a); input [7:0] addr; input clk; output [7:0]q_a; parameter datapath = "ppp.txt"; reg [7:0] ram[255:0]; initial $readmemh (datapath,ram); wire [7:0]addr; reg [7:0] q_a; always @ (posedge clk) q_a <= ram[addr]; endmodule readmemh не воспринимает, что datapath="ppp.txt". Требует чтобы была строка литералов. Походу, что-то упускаю в пунктуации. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба Требует чтобы была строка литералов. Походу, что-то упускаю в пунктуации. Синтаксис этой функции: $readmemb ("<file_name>", <reg_name>, <start_address>, end_address>), где <file_name> - имя и путь к файлу, содержащему двоичные данные, параметр <reg_name> - это 2-D массив регистров, в котором хранятся данные, и, как опции, две цифры, которые указывают начальный и конечный адрес данных $readmemb("../data/mem_file.dat", prom_data); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба Синтаксис этой функции: $readmemb ("<file_name>", <reg_name>, <start_address>, end_address>), где <file_name> - имя и путь к файлу, содержащему двоичные данные, параметр <reg_name> - это 2-D массив регистров, в котором хранятся данные, и, как опции, две цифры, которые указывают начальный и конечный адрес данных $readmemb("../data/mem_file.dat", prom_data); Если я поставлю туда "filename.txt", то проблем нет. Я хочу поставить туда имя, определяемое через параметр, чтобы извне модуля его переопределить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба Если я поставлю туда "filename.txt", то проблем нет. Я хочу поставить туда имя, определяемое через параметр, чтобы извне модуля его переопределить. $readmemh ("datapath",ram); и parameter datapath = "ppp.txt"; Кавычки как раз и говорят компилятору, что между ними - текстовая строка... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба $readmemh ("datapath",ram); и parameter datapath = "ppp.txt"; Кавычки как раз и говорят компилятору, что между ними - текстовая строка... Так тоже делал module smallROM (addr,clk,q_a); input [7:0] addr; input clk; output [7:0]q_a; parameter datapath = "ppp.txt"; reg [7:0] ram[255:0]; initial $readmemh ("datapath",ram); wire [7:0]addr; reg [7:0] q_a; always @ (posedge clk) q_a <= ram[addr]; endmodule Так говорит, что не может найти файла "datapath". Мож у меня какой раритетный Квартус? 7.1? Но синтаксис V-2001 понимает... Логичен именно первый вариант. Вместо datapath подставляется его эквивалент, вместе с кавычками. Кстати, насчёт кавычек! Как в Верилоге со вложенными кавычками? Они сдваиваются или нет? Или нужен какой-то разделитель? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба Кстати, насчёт кавычек! Как в Верилоге со вложенными кавычками? Они сдваиваются или нет? Или нужен какой-то разделитель? Фрагмент из "Краткого Курса"... Строка - это последовательность символов, ограниченная слева и справа кавычками. Они должны быть расположены на одной строке. В строке могут быть использованы специальные ESC-символы, для чего необходимо применять следующим образом символ “\”: •\n - печатать текст с новой строки. Аналогично применению клавиши RETURN. •символ табуляции \t. Эквивалентно тому, что происходит при нажатии на клавишу табуляции. •Применение двух символов \\ является эквивалентом применения символа \. •\ ” является символом “ •\ddd - символ ASCII, определяющий цифру. (в этой записи использовано от одной до трех восьмеричных цифр) •%% это печать знака % Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mse 0 30 марта, 2017 Опубликовано 30 марта, 2017 · Жалоба Не помогло... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться