Jump to content
    

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",

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

Share this post


Link to post
Share on other sites

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

 

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;

 

 

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

 

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.

Share this post


Link to post
Share on other sites

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

 

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

 

parameter ROM_DATA_FILE_NAME ="my_file.hex"

 

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

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

Share this post


Link to post
Share on other sites

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

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

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


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


module rommodule(...)

initial 
$readmem "datapath";
...
endmodule

вот...

Share this post


Link to post
Share on other sites

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

 

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

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

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

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

 

 

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

 

Share this post


Link to post
Share on other sites

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

 

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

 

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

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

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

 

 

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

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

Share this post


Link to post
Share on other sites

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

 

$readmemh ("datapath",ram);

 

и

parameter datapath = "ppp.txt";

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...