Serhiy_UA 1 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба После успешной компиляции в 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 0 10 января, 2011 Опубликовано 10 января, 2011 · Жалоба посмотрите отчет компиляции, какие ресурсы этим модулем используется. м.б. синтезатор решил ее на регистрах сделать (небольшой размер), либо вообще выкинул - если ничего от нее не зависит. слева, где дерево проекта, можно посмотреть статистику модулей по занимаемым ресурсам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба vadimuzzz, спасибо за советы. В проекте память на 8192 адреса (М9К) в двух модулях RAM с шириной слова по 32 бита. Один модуль не хотел создаваться, хотя модули полностью идентичные. Почему-то RTL Viewer показывал оба модуля, а в отчете и дереве проекта (окошко Project Navigator) один из модулей не создавался, ни на регистрах, не в М9К. До этого я считал показания RTL Viewer истинными, теперь буду сомневаться, не пойму только почему это так в QII, вроде, должны показываться одно и то же. Вопрос остается…. В конце концов, опять же не без помощи дерева проекта, оба модуля созданы. Однако в проекте много 32-разрядныз мультиплексоров 2 в 1, управляемых одним сигналом, похоже, что нагрузочных входов у этого сигнала будет более 200. Манипуляции с эти сигналом почему-то влияют на создание одного из этих модулей RAM. Ситуация такая, что ставит под угрозу весь проект. Надо, видимо, этот сигнал управления мультиплексорами как-то разгрузить. Как в таких случаях поступают, когда у сигнала большой коэффициент разветвления? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба До этого я считал показания RTL Viewer истинными не, ему верить нельзя. смотрите Technology Map Viewer`ом нагрузочных входов у этого сигнала будет более 200. для этого есть глобальные сигналы. поищите в Assignment Editore глобальную опцию что-то-там "high fan-out signals". ну и отчет компиляции бы поглядеть не мешало Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shtirlits 0 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба Количество потребителей не может влиять на создание памяти, мысли про глюки в quartus не допускаем. Чтобы память попала в проект, её содержимое должно меняться и использоваться. Достаточно, чтобы сигнал write enable был всегда неактивным и память уже не нужна. Покажите исходники, если есть возможность. Если цель проекта не в нагреве микросхемы, то моделирование до и после place&route должны показать правильное функционирование, которому эта память необходима. Как в таких случаях поступают, когда у сигнала большой коэффициент разветвления? - используют специальные выделенные ресурсы разводки (глобальные сети), если есть - если есть возможность определить значение сигнала на один или более тактов раньше, перед потребителями добавляется последовательно один или более регистров, что позволит P&R наделать дублей и построить дерево - осмысливается схема, ищутся новые варианты реализации Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 11 января, 2011 Опубликовано 11 января, 2011 · Жалоба 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 0 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Пробовал для 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 1 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Попробуйте в 7-ой квартусе задать опции..:Спасибо, Евгений. Эти опции в QII7.2 были изначально заданы таковыми же. Однако это не помогает.. Разгрузил перегруженный сигнал через регистры, тоже не помогло... Проект мой создан на основе уже существующего, с заменой ПЛИС, а также переносом RAM с внешних чипов во внутреннею память. Файлы перетягивались из старого в новый. Анализируя Warning-и, обнаружил, что эти файлы надо бы специфицировать, т.е. включать через Prpoject -> Add/Remove Files in Project. Сделал и это, но пока результат тот же. Один из модулей RAM может не создаваться, что видно по дереву проекта. Очередной объект текущих исследований, это оператор casex, в который в итоге принимаются, а затем записываются в промежуточный регистр, коды с выходов этих обоих RAM... Перестановка местами выходов RAM в соседних операторах присваивания casex, и приводит к запрету/открытию одной из RAM. Вот так... Все перепроверил на подключение по несколько раз... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 12 января, 2011 Опубликовано 12 января, 2011 · Жалоба Ниже модуль памяти, хотя мега-функции 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 это выкинул :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Serhiy_UA 1 13 января, 2011 Опубликовано 13 января, 2011 · Жалоба Ой! Регистр addr_reg не используется, выход q вообще не подключен. Не удивительно, что Q это выкинул :rolleyes:На самом деле модуль 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, извините за такую неточность... Что-то много ошибок стал допускать... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 13 января, 2011 Опубликовано 13 января, 2011 · Жалоба На самом деле модуль RAM у меня такой:Я не в курсе, как устроен RAM на Cyclone, но на Xilinx это в блочную память не ляжет - у нее синхронное чтение. Проверьте по DS от Cyclone на синхронность чтения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shtirlits 0 13 января, 2011 Опубликовано 13 января, 2011 · Жалоба В cyclone есть асинхронный выход чтения, тут не подкопаешься. PS: Есть один моментик, для точной модели нужно регистр адреса и на запись использовать, но писать не по фронту, а по уровню - сделать латч. А поскольку латчи лучше избегать при прочих равных, то должно синтезироваться без проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vadimuzzz 0 13 января, 2011 Опубликовано 13 января, 2011 · Жалоба 2 Serhiy_UA вы можете выложить 2 отчета компилятора - когда модуль есть и когда нет? желательно с примерными пояснениями, что изменяете в проекте Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 13 января, 2011 Опубликовано 13 января, 2011 (изменено) · Жалоба ... это в блочную память не ляжет - у нее синхронное чтение Описанное чтение - синхронное: always @ (posedge clk) addr_reg <= addr; assign q = ram[addr_reg]; Изменено 13 января, 2011 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 13 января, 2011 Опубликовано 13 января, 2011 · Жалоба Описанное чтение - синхронное: always @ (posedge clk) addr_reg <= addr; assign q = ram[addr_reg]; Это синхронное защелкивание адреса, а само чтение асинхронное. При синхронном чтении любые изменения содержимого ram не попадут на выход q до ближайшего клока (clk), у вас же они проявляются немедленно. PS. Но это не важно, т.к. (по информации от Shtirlits) асинхронное чтение RAM в Cyclone есть Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться