Полная версия этой страницы:
Память внутри Cyclone III
Serhiy_UA
Jan 10 2011, 06:33
После успешной компиляции в QII, появляется окно Compilation Report – Flow Summary, которое сообщает о том, что память внутри Cyclone III не используется: Total memory bits = 0%.
Хотя эта память описана в корневом модуле. В частности, после компиляции, эту память можно просмотреть через RTL Viewer, где она и отображается как блок памяти (синий прямоугольник).
Почему так может происходить, когда в одном месте сообщается, что памяти нет, а в другом она видна?
Пробовал для QII 7.2 и QII 9.1 – результат одинаков. Использоват память из шаблона Single port RAM with single read/write address.
Когда же создал короткий тест, то видел блок памяти и в RTL Viewer, и сообщение в Compilation Report – Flow Summary, т.е. память задействована. А для большого проекта – разночтение, с сообщением в Flow Summary, что памяти нет.
Какие могут быть соображения?
vadimuzzz
Jan 10 2011, 06:55
посмотрите отчет компиляции, какие ресурсы этим модулем используется. м.б. синтезатор решил ее на регистрах сделать (небольшой размер), либо вообще выкинул - если ничего от нее не зависит. слева, где дерево проекта, можно посмотреть статистику модулей по занимаемым ресурсам.
Serhiy_UA
Jan 11 2011, 10:41
vadimuzzz, спасибо за советы.
В проекте память на 8192 адреса (М9К) в двух модулях RAM с шириной слова по 32 бита. Один модуль не хотел создаваться, хотя модули полностью идентичные. Почему-то RTL Viewer показывал оба модуля, а в отчете и дереве проекта (окошко Project Navigator) один из модулей не создавался, ни на регистрах, не в М9К. До этого я считал показания RTL Viewer истинными, теперь буду сомневаться, не пойму только почему это так в QII, вроде, должны показываться одно и то же. Вопрос остается….
В конце концов, опять же не без помощи дерева проекта, оба модуля созданы. Однако в проекте много 32-разрядныз мультиплексоров 2 в 1, управляемых одним сигналом, похоже, что нагрузочных входов у этого сигнала будет более 200. Манипуляции с эти сигналом почему-то влияют на создание одного из этих модулей RAM. Ситуация такая, что ставит под угрозу весь проект. Надо, видимо, этот сигнал управления мультиплексорами как-то разгрузить. Как в таких случаях поступают, когда у сигнала большой коэффициент разветвления?
vadimuzzz
Jan 11 2011, 11:43
Цитата
До этого я считал показания RTL Viewer истинными
не, ему верить нельзя. смотрите Technology Map Viewer`ом
Цитата
нагрузочных входов у этого сигнала будет более 200.
для этого есть глобальные сигналы. поищите в Assignment Editore глобальную опцию что-то-там "high fan-out signals". ну и отчет компиляции бы поглядеть не мешало
Shtirlits
Jan 11 2011, 12:10
Количество потребителей не может влиять на создание памяти, мысли про глюки в quartus не допускаем.
Чтобы память попала в проект, её содержимое должно меняться и использоваться.
Достаточно, чтобы сигнал write enable был всегда неактивным и память уже не нужна.
Покажите исходники, если есть возможность.
Если цель проекта не в нагреве микросхемы, то моделирование до и после place&route должны показать правильное функционирование, которому эта память необходима.
QUOTE (Serhiy_UA @ Jan 11 2011, 16:41)

Как в таких случаях поступают, когда у сигнала большой коэффициент разветвления?
- используют специальные выделенные ресурсы разводки (глобальные сети), если есть
- если есть возможность определить значение сигнала на один или более тактов раньше, перед потребителями добавляется последовательно один или более регистров, что позволит P&R наделать дублей и построить дерево
- осмысливается схема, ищутся новые варианты реализации
Serhiy_UA
Jan 11 2011, 15:49
Shtirlits и vadimuzzz, спасибо за советы.
Буду разбираться. QII пока под презумпцией невиновности... А вот его оптимизатор, возможно, умничает...
Схема разветвления через регистры кажется проще, я сигнал разгружу пока этим способом...
Проект громоздкий, моделировать его сложно, только что отдельными модулям. Показывать тексты пока смысла нет...
Ниже модуль памяти, хотя мега-функции RAM вели себя подобно, т.е. на них как бы тоже влиял перегруженный сигнал:
module single_port_ram
(input [31:0] data, input [12:0] addr, input we, clk, output [31:0] q);
reg [31:0] ram[8191:0];
reg [12:0] addr_reg;
always @ (posedge clk)
begin if (we) ram[addr] = data; addr_reg <= addr; end
endmodule
и вызов модуля:
single_port_ram DD(.data(DDi), .addr(AD), .we(WE), .clk(CLK), .q(DDo));
EvgenyNik
Jan 12 2011, 08:04
Цитата(Serhiy_UA @ Jan 10 2011, 12:33)

Пробовал для QII 7.2...
Попробуйте в 7-ой квартусе задать опции:
главное меню Assignments > пункт Settings > категория Analysis & Syntethesys settings > кнопка More settings > опции (Auto RAM replacement = ON, Auto RAM to logic cell conversion = OFF)
---
В 9-ом я их не нашёл...
Serhiy_UA
Jan 12 2011, 11:18
Цитата(Евгений Николаев @ Jan 12 2011, 15:04)

Попробуйте в 7-ой квартусе задать опции..:
Спасибо, Евгений. Эти опции в QII7.2 были изначально заданы таковыми же. Однако это не помогает..
Разгрузил перегруженный сигнал через регистры, тоже не помогло...
Проект мой создан на основе уже существующего, с заменой ПЛИС, а также переносом RAM с внешних чипов во внутреннею память. Файлы перетягивались из старого в новый. Анализируя Warning-и, обнаружил, что эти файлы надо бы специфицировать, т.е. включать через Prpoject -> Add/Remove Files in Project. Сделал и это, но пока результат тот же. Один из модулей RAM может не создаваться, что видно по дереву проекта.
Очередной объект текущих исследований, это оператор casex, в который в итоге принимаются, а затем записываются в промежуточный регистр, коды с выходов этих обоих RAM... Перестановка местами выходов RAM в соседних операторах присваивания casex, и приводит к запрету/открытию одной из RAM. Вот так... Все перепроверил на подключение по несколько раз...
Цитата(Serhiy_UA @ Jan 11 2011, 21:49)

Ниже модуль памяти, хотя мега-функции RAM вели себя подобно, т.е. на них как бы тоже влиял перегруженный сигнал:
module single_port_ram
(input [31:0] data, input [12:0] addr, input we, clk, output [31:0] q);
reg [31:0] ram[8191:0];
reg [12:0] addr_reg;
always @ (posedge clk)
begin if (we) ram[addr] = data; addr_reg <= addr; end
endmodule
Ой! Регистр addr_reg не используется, выход q вообще не подключен. Не удивительно, что Q это выкинул
Serhiy_UA
Jan 13 2011, 03:33
Цитата(XVR @ Jan 12 2011, 19:08)

Ой! Регистр addr_reg не используется, выход q вообще не подключен. Не удивительно, что Q это выкинул

На самом деле модуль RAM у меня такой:
module single_port_ram
(input [31:0] data, input [12:0] addr, input we, clk, output [31:0] q);
reg [31:0] ram[8191:0];
reg [12:0] addr_reg;
always @ (posedge clk)
begin if (we) ram[addr] = data; addr_reg <= addr; end
assign q = ram[addr_reg];
endmodule
То есть, в предыдущих постах я был невнимателен и упустил вписать назначение: assign q = ram[addr_reg]; , хотя оно реально в проекте присутствует...
XVR, извините за такую неточность... Что-то много ошибок стал допускать...
Цитата
На самом деле модуль RAM у меня такой:
Я не в курсе, как устроен RAM на Cyclone, но на Xilinx это в блочную память не ляжет - у нее синхронное чтение.
Проверьте по DS от Cyclone на синхронность чтения.
Shtirlits
Jan 13 2011, 04:28
В cyclone есть асинхронный выход чтения, тут не подкопаешься.
PS: Есть один моментик, для точной модели нужно регистр адреса и на запись использовать, но писать не по фронту, а по уровню - сделать латч. А поскольку латчи лучше избегать при прочих равных, то должно синтезироваться без проблем.
vadimuzzz
Jan 13 2011, 04:55
2 Serhiy_UA вы можете выложить 2 отчета компилятора - когда модуль есть и когда нет? желательно с примерными пояснениями, что изменяете в проекте
Цитата(XVR @ Jan 13 2011, 11:11)

... это в блочную память не ляжет - у нее синхронное чтение
Описанное чтение - синхронное:
always @ (posedge clk) addr_reg <= addr;
assign q = ram[addr_reg];
Цитата(Leka @ Jan 13 2011, 10:59)

Описанное чтение - синхронное:
always @ (posedge clk) addr_reg <= addr;
assign q = ram[addr_reg];
Это синхронное защелкивание адреса, а само чтение асинхронное. При синхронном чтении любые изменения содержимого ram не попадут на выход q до ближайшего клока (clk), у вас же они проявляются немедленно.
PS. Но это не важно, т.к. (по информации от Shtirlits) асинхронное чтение RAM в Cyclone есть
Serhiy_UA
Jan 13 2011, 06:33
Цитата(vadimuzzz @ Jan 13 2011, 10:55)

2 Serhiy_UA вы можете выложить 2 отчета компилятора - когда модуль есть и когда нет? желательно с примерными пояснениями, что изменяете в проекте
В приложении фото двух экранов от двух проектов.
На одном экране, когда оба блока RAM есть, а на втором, когда один из RAM не создается.
При этом в проектах изменяются только места падключения шин DD4 и DD6 по двум соседним присваиваниям в операторе casex, что в модуле control_pci.v .
В приложение Doc3.zip есть краткое описание проблемы.
В Doc3_warning.zip тоже самое, что и в Doc3.zip, плюс еще warning после неуспешной компиляции.
vadimuzzz
Jan 13 2011, 06:43
Цитата(Serhiy_UA @ Jan 13 2011, 15:33)

В приложении фото двух экранов.
а где приложение?

интересуют именно warnings, главным образом синтезатора (вряд ли это фокусы фиттера)
Цитата(Serhiy_UA @ Jan 13 2011, 12:33)

В приложении фото двух экранов от двух проектов.
casex воспринимается не так как Вам надо. Он конечно синтезируется, но примеров на верилоге для синтеза я не видел.
А квартус сплошные предупреждения выдает.
Зачем он тут. Приоритетное мультиплексирование по нужным разрядам даст однозначную картинку. А по ресурсам будет меньше.
Serhiy_UA
Jan 13 2011, 12:30
Цитата(sazh @ Jan 13 2011, 14:12)

casex воспринимается не так как Вам надо. Он конечно синтезируется, но примеров на верилоге для синтеза я не видел.
А квартус сплошные предупреждения выдает.
Зачем он тут. Приоритетное мультиплексирование по нужным разрядам даст однозначную картинку. А по ресурсам будет меньше.
Оператор casex используется для работы с ядром pci_mt32 в моменты обращения к PCI-шине. Я оставил casex с предыдущего проекта, где он нормально работает после компиляции в MAX+plusII. Не задумывался пока его менять, но возможно придется: как, пока еще не определился...
Предупреждений от QII много, надо еще чистить проект, это понятно...
Цитата(XVR @ Jan 13 2011, 12:50)

Это синхронное защелкивание адреса, а само чтение асинхронное. При синхронном чтении любые изменения содержимого ram не попадут на выход q до ближайшего клока (clk), у вас же они проявляются немедленно.

Это да. Но именно так описывается синтезируемый "write-first" режим у Xilinx.
Цитата
PS. Но это не важно, т.к. (по информации от Shtirlits) асинхронное чтение RAM в Cyclone есть
У Altera вроде так-же, как и у Xilinx.
vadimuzzz
Jan 13 2011, 15:57
Обратите внимание на это:
Цитата
Verilog HDL warning at control_pci.v(64): overlapping case item expressions are non-constant or contain don't care bits - unable to check case statement for completeness
Из хелпа:
Verilog HDL warning at <location>: case statement has overlapping case item expressions with non-constant or don't care bits - unable to check case statement for completeness
CAUSE: In a case statement at the specified location in a Verilog Design File (.v), you used case item expressions that overlap or potentially overlap. The expressions may potentially overlap if they contain references to variables or nets. Otherwise, they overlap because of don't care bits. In either case, Quartus II cannot analyze your case statement for completeness and will assume it to be incomplete, unless otherwise instructed by a full_case pragma or a SystemVerilog unique/priority keyword.
ACTION: If you require a complete case statement, add an explicit default case item. You can force completeness without a default case item by adding a full_case pragma or a SystemVerilog unique/priority keyword.
и, соглашусь с
sazh, приоритетная схема тут больше подходит по смыслу
Цитата(sazh @ Jan 13 2011, 13:12)

casex воспринимается не так как Вам надо. Он конечно синтезируется, но примеров на верилоге для синтеза я не видел.
Ну, вот здесь, например. Кстати, в соответствии с выше приведенной цитатой
http://electronix.ru/forum/index.php?showt...st&p=851601
Цитата(ViKo @ Jan 14 2011, 18:01)

Кстати, в соответствии с выше приведенной цитатой
По мне так в соответствии с 21 сообщением.
Не все так просто с casex
Код
module case_full
(
input [3:0] data_a, data_b, data_c, data_d,
input [3:0] data_e,
input [3:0] sel,
output reg[3:0] rezult
);
always @(*)
begin
casex (sel) // synthesis full_case
4'b1xxx : rezult = data_e;
4'bx1xx : rezult = data_d;
4'bxx1x : rezult = data_c;
4'bxxx1 : rezult = data_b;
4'b0000 : rezult = data_a;
endcase
end
endmodule
Цитата(sazh @ Jan 14 2011, 17:54)

По мне так в соответствии с 21 сообщением.
его и имел в виду
Так, как у вас написано, и человек не сможет определиться с выбором. Можно сделать так, например
Код
casex (sel)
4'b1xxx : rezult = data_e;
4'b01xx : rezult = data_d;
4'b001x : rezult = data_c;
4'b0001 : rezult = data_b;
4'b0000 : rezult = data_a;
endcase
Serhiy_UA
Jan 17 2011, 13:00
Причину не включений в проект RAM обнаружил и устранил.
Еще раз подтвердилась аксиома: «…мысли про глюки в quartus не допускаем».
Суть моей ошибки в том, что в проекте не были еще проложены отдельные цепи к FSM, от которой зависела работа RAM, по этой причине оптимизатор эту RAM и не создавал. Когда подладил FSM и цепи между модулями, то начала компилироваться и RAM.
Вывод на будущее – надо продумывать наперед работу оптимизатора QII и учитывать его возможные действия.
В части casex все замечания принял и тоже устранил.
Еще раз всем спасибо за дельные советы!
Shtirlits
Jan 17 2011, 13:17
Постойте!
Я не согласен с выводом об ошибке.
Считаю, что причина в том, что нет моделирования проекта целиком. Как будто вам нужно, чтобы рядовой подметая ломом плац *устал*, а не чистоту навести. Я не шучу, когда говорю про цель проекта нагревать микросхему. Какой бы ни был размер схемы, системы на кристалле, мультичипового решения, всегда дешевле купить адекватный компьютер для моделирования и обустроить среду для верификации, чем тратить время на отладку. Кроме того, если хорошенько подумать, то можно устроить верификацию и уже имеющимися средствами.
Serhiy_UA
Jan 17 2011, 14:00
Цитата(Shtirlits @ Jan 17 2011, 17:17)

Какой бы ни был размер схемы, системы на кристалле, мультичипового решения, всегда дешевле купить адекватный компьютер для моделирования и обустроить среду для верификации, чем тратить время на отладку. Кроме того, если хорошенько подумать, то можно устроить верификацию и уже имеющимися средствами.
Этими словами можно было бы начать неплохую диссертацию.
К сожалению, мои навыки в верификации подобных вещей очень скромны, возразить нечем...
Советовал бы только создать отдельную ветку по проблематике верификации ПЛИС, а также больших проектов на них, и, далее, все аспекты верификации обсуждать в ней...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.