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

Verilog. Инициализация ROM в разных модулях

Есть вопрос. Как решить, не нашёл. Есть модуль, который многократно используется в проекте. Внутри него есть 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",

транзитом, через модуль более верхнего уровня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

описание РОМа очень простое

 

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;

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть другой вариант. Строку можно параметризировать, она не обязательно константа, как у вас.

Допустим, что у вас следующая иерархия:

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-ы имеют имена, написать для всех инициализирующие файлы не сложно, сразу понятно кто где находится.

Могу накидать небольшой пример, если не понятно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

описание РОМа очень простое

 

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А что не понятно то?

 

в файле пишите

 

parameter ROM_DATA_FILE_NAME ="my_file.hex"

 

его передаете в ром для инициализации, при инстанцировании модулей верхнего уровня задаете им параметры.

Ну или как предлагали вам выше один файл на все случаи жизни, и РОМы сами в нем ищут информацию

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть другой вариант. Строку можно параметризировать, она не обязательно константа, как у вас.

Задача оформить как-то так

module toplevel(...);
...
logicBlock LB0(...,datapath0);
logicBlock LB1(...,datapath1);
...
endmodule


module logicBlock(...,datapath);
...
rommodule prom(...,datapath);
...
endmodule


module rommodule(...)

initial 
$readmem "datapath";
...
endmodule

вот...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы параметрами что-ли пользоваться не умеете?

 

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 модуль объявляется аналогично с параметром, который в загрузку файла и идет

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы параметрами что-ли пользоваться не умеете?

В таком ключе не приходилось. Спасибо, щас попробую, всё ли правильно понял.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В таком ключе не приходилось. Спасибо, щас попробую, всё ли правильно понял.

В общем так, добрался до компа, стал разбираться. Сразу завис на определении.

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". Требует чтобы была строка литералов. Походу, что-то упускаю в пунктуации.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Требует чтобы была строка литералов. Походу, что-то упускаю в пунктуации.

 

Синтаксис этой функции:

 

$readmemb ("<file_name>", <reg_name>, <start_address>, end_address>),

 

где <file_name> - имя и путь к файлу, содержащему двоичные данные,

параметр <reg_name> - это 2-D массив регистров, в котором хранятся данные,

и, как опции, две цифры, которые указывают начальный и конечный адрес данных

 

 

$readmemb("../data/mem_file.dat", prom_data);

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Синтаксис этой функции:

 

$readmemb ("<file_name>", <reg_name>, <start_address>, end_address>),

 

где <file_name> - имя и путь к файлу, содержащему двоичные данные,

параметр <reg_name> - это 2-D массив регистров, в котором хранятся данные,

и, как опции, две цифры, которые указывают начальный и конечный адрес данных

 

 

$readmemb("../data/mem_file.dat", prom_data);

Если я поставлю туда "filename.txt", то проблем нет. Я хочу поставить туда имя, определяемое через параметр, чтобы извне модуля его переопределить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если я поставлю туда "filename.txt", то проблем нет. Я хочу поставить туда имя, определяемое через параметр, чтобы извне модуля его переопределить.

 

$readmemh ("datapath",ram);

 

и

parameter datapath = "ppp.txt";

 

Кавычки как раз и говорят компилятору, что между ними - текстовая строка...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

$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 подставляется его эквивалент, вместе с кавычками. Кстати, насчёт кавычек! Как в Верилоге со вложенными кавычками? Они сдваиваются или нет? Или нужен какой-то разделитель?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кстати, насчёт кавычек! Как в Верилоге со вложенными кавычками? Они сдваиваются или нет? Или нужен какой-то разделитель?

 

Фрагмент из "Краткого Курса"...

 

Строка - это последовательность символов, ограниченная слева и справа кавычками. Они должны быть расположены на одной строке. В строке могут быть использованы специальные ESC-символы, для чего необходимо применять следующим образом символ “\”:

 

•\n - печатать текст с новой строки. Аналогично применению клавиши RETURN.

 

•символ табуляции \t. Эквивалентно тому, что происходит при нажатии на клавишу табуляции.

 

•Применение двух символов \\ является эквивалентом применения символа \.

 

•\ ” является символом “

 

•\ddd - символ ASCII, определяющий цифру. (в этой записи использовано от одной до трех восьмеричных цифр)

 

•%% это печать знака %

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...