реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Verilog. Инициализация ROM в разных модулях
mse
сообщение Mar 27 2017, 19:23
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 703
Регистрация: 3-05-05
Пользователь №: 4 693



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

транзитом, через модуль более верхнего уровня.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 27 2017, 19:52
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 232
Регистрация: 17-02-06
Пользователь №: 14 454



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

Код
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;


Go to the top of the page
 
+Quote Post
Inanity
сообщение Mar 27 2017, 20:02
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 185
Регистрация: 6-07-12
Пользователь №: 72 653



Есть другой вариант. Строку можно параметризировать, она не обязательно константа, как у вас.
Допустим, что у вас следующая иерархия:
Код
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-ы имеют имена, написать для всех инициализирующие файлы не сложно, сразу понятно кто где находится.
Могу накидать небольшой пример, если не понятно.
Go to the top of the page
 
+Quote Post
mse
сообщение Mar 27 2017, 20:28
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 703
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(Golikov A. @ Mar 27 2017, 22:52) *
описание РОМа очень простое

Код
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.
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 27 2017, 20:34
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 4 232
Регистрация: 17-02-06
Пользователь №: 14 454



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

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

parameter ROM_DATA_FILE_NAME ="my_file.hex"

его передаете в ром для инициализации, при инстанцировании модулей верхнего уровня задаете им параметры.
Ну или как предлагали вам выше один файл на все случаи жизни, и РОМы сами в нем ищут информацию
Go to the top of the page
 
+Quote Post
mse
сообщение Mar 27 2017, 20:36
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 703
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(Inanity @ Mar 27 2017, 23:02) *
Есть другой вариант. Строку можно параметризировать, она не обязательно константа, как у вас.

Задача оформить как-то так
Код
module toplevel(...);
...
logicBlock LB0(...,datapath0);
logicBlock LB1(...,datapath1);
...
endmodule


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


module rommodule(...)

initial
$readmem "datapath";
...
endmodule

вот...
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Mar 27 2017, 20:59
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 232
Регистрация: 17-02-06
Пользователь №: 14 454



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

Код
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 модуль объявляется аналогично с параметром, который в загрузку файла и идет
Go to the top of the page
 
+Quote Post
mse
сообщение Mar 28 2017, 06:37
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 703
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(Golikov A. @ Mar 28 2017, 00:59) *
Вы параметрами что-ли пользоваться не умеете?

В таком ключе не приходилось. Спасибо, щас попробую, всё ли правильно понял.
Go to the top of the page
 
+Quote Post
mse
сообщение Mar 30 2017, 08:23
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 703
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(mse @ Mar 28 2017, 10:37) *
В таком ключе не приходилось. Спасибо, щас попробую, всё ли правильно понял.

В общем так, добрался до компа, стал разбираться. Сразу завис на определении.
Код
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". Требует чтобы была строка литералов. Походу, что-то упускаю в пунктуации.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 30 2017, 09:46
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 3 710
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(mse @ Mar 30 2017, 12:23) *
Требует чтобы была строка литералов. Походу, что-то упускаю в пунктуации.


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

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

где <file_name> - имя и путь к файлу, содержащему двоичные данные,
параметр <reg_name> - это 2-D массив регистров, в котором хранятся данные,
и, как опции, две цифры, которые указывают начальный и конечный адрес данных


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


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
mse
сообщение Mar 30 2017, 10:17
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 703
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(iosifk @ Mar 30 2017, 13:46) *
Синтаксис этой функции:

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

где <file_name> - имя и путь к файлу, содержащему двоичные данные,
параметр <reg_name> - это 2-D массив регистров, в котором хранятся данные,
и, как опции, две цифры, которые указывают начальный и конечный адрес данных


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

Если я поставлю туда "filename.txt", то проблем нет. Я хочу поставить туда имя, определяемое через параметр, чтобы извне модуля его переопределить.
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 30 2017, 10:29
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 3 710
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(mse @ Mar 30 2017, 14:17) *
Если я поставлю туда "filename.txt", то проблем нет. Я хочу поставить туда имя, определяемое через параметр, чтобы извне модуля его переопределить.


$readmemh ("datapath",ram);

и
parameter datapath = "ppp.txt";

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


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
mse
сообщение Mar 30 2017, 10:48
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 703
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(iosifk @ Mar 30 2017, 14:29) *
$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 подставляется его эквивалент, вместе с кавычками. Кстати, насчёт кавычек! Как в Верилоге со вложенными кавычками? Они сдваиваются или нет? Или нужен какой-то разделитель?
Go to the top of the page
 
+Quote Post
iosifk
сообщение Mar 30 2017, 11:09
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 3 710
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(mse @ Mar 30 2017, 14:48) *
Кстати, насчёт кавычек! Как в Верилоге со вложенными кавычками? Они сдваиваются или нет? Или нужен какой-то разделитель?


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

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

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

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

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

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

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

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



--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
mse
сообщение Mar 30 2017, 11:46
Сообщение #15


Знающий
****

Группа: Свой
Сообщений: 703
Регистрация: 3-05-05
Пользователь №: 4 693



Не помогло...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 15th December 2017 - 00:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01337 секунд с 7
ELECTRONIX ©2004-2016