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

Память внутри Cyclone III

После успешной компиляции в 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, спасибо за советы.

 

В проекте память на 8192 адреса (М9К) в двух модулях RAM с шириной слова по 32 бита. Один модуль не хотел создаваться, хотя модули полностью идентичные. Почему-то RTL Viewer показывал оба модуля, а в отчете и дереве проекта (окошко Project Navigator) один из модулей не создавался, ни на регистрах, не в М9К. До этого я считал показания RTL Viewer истинными, теперь буду сомневаться, не пойму только почему это так в QII, вроде, должны показываться одно и то же. Вопрос остается….

 

В конце концов, опять же не без помощи дерева проекта, оба модуля созданы. Однако в проекте много 32-разрядныз мультиплексоров 2 в 1, управляемых одним сигналом, похоже, что нагрузочных входов у этого сигнала будет более 200. Манипуляции с эти сигналом почему-то влияют на создание одного из этих модулей RAM. Ситуация такая, что ставит под угрозу весь проект. Надо, видимо, этот сигнал управления мультиплексорами как-то разгрузить. Как в таких случаях поступают, когда у сигнала большой коэффициент разветвления?

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


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

До этого я считал показания RTL Viewer истинными

не, ему верить нельзя. смотрите Technology Map Viewer`ом

нагрузочных входов у этого сигнала будет более 200.

для этого есть глобальные сигналы. поищите в Assignment Editore глобальную опцию что-то-там "high fan-out signals". ну и отчет компиляции бы поглядеть не мешало

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


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

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

Чтобы память попала в проект, её содержимое должно меняться и использоваться.

Достаточно, чтобы сигнал write enable был всегда неактивным и память уже не нужна.

 

Покажите исходники, если есть возможность.

 

Если цель проекта не в нагреве микросхемы, то моделирование до и после place&route должны показать правильное функционирование, которому эта память необходима.

 

Как в таких случаях поступают, когда у сигнала большой коэффициент разветвления?

- используют специальные выделенные ресурсы разводки (глобальные сети), если есть

- если есть возможность определить значение сигнала на один или более тактов раньше, перед потребителями добавляется последовательно один или более регистров, что позволит P&R наделать дублей и построить дерево

- осмысливается схема, ищутся новые варианты реализации

 

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


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

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));

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


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

Пробовал для QII 7.2...

Попробуйте в 7-ой квартусе задать опции:

главное меню Assignments > пункт Settings > категория Analysis & Syntethesys settings > кнопка More settings > опции (Auto RAM replacement = ON, Auto RAM to logic cell conversion = OFF)

---

В 9-ом я их не нашёл...

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


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

Попробуйте в 7-ой квартусе задать опции..:
Спасибо, Евгений. Эти опции в QII7.2 были изначально заданы таковыми же. Однако это не помогает..

 

Разгрузил перегруженный сигнал через регистры, тоже не помогло...

 

Проект мой создан на основе уже существующего, с заменой ПЛИС, а также переносом RAM с внешних чипов во внутреннею память. Файлы перетягивались из старого в новый. Анализируя Warning-и, обнаружил, что эти файлы надо бы специфицировать, т.е. включать через Prpoject -> Add/Remove Files in Project. Сделал и это, но пока результат тот же. Один из модулей RAM может не создаваться, что видно по дереву проекта.

 

Очередной объект текущих исследований, это оператор casex, в который в итоге принимаются, а затем записываются в промежуточный регистр, коды с выходов этих обоих RAM... Перестановка местами выходов RAM в соседних операторах присваивания casex, и приводит к запрету/открытию одной из RAM. Вот так... Все перепроверил на подключение по несколько раз...

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


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

Ниже модуль памяти, хотя мега-функции 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:

 

 

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


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

Ой! Регистр 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, извините за такую неточность... Что-то много ошибок стал допускать...

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


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

На самом деле модуль RAM у меня такой:
Я не в курсе, как устроен RAM на Cyclone, но на Xilinx это в блочную память не ляжет - у нее синхронное чтение.

Проверьте по DS от Cyclone на синхронность чтения.

 

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


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

В cyclone есть асинхронный выход чтения, тут не подкопаешься.

 

PS: Есть один моментик, для точной модели нужно регистр адреса и на запись использовать, но писать не по фронту, а по уровню - сделать латч. А поскольку латчи лучше избегать при прочих равных, то должно синтезироваться без проблем.

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


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

2 Serhiy_UA вы можете выложить 2 отчета компилятора - когда модуль есть и когда нет? желательно с примерными пояснениями, что изменяете в проекте

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


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

... это в блочную память не ляжет - у нее синхронное чтение

Описанное чтение - синхронное:

always @ (posedge clk) addr_reg <= addr;

assign q = ram[addr_reg];

Изменено пользователем Leka

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


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

Описанное чтение - синхронное:

always @ (posedge clk) addr_reg <= addr;

assign q = ram[addr_reg];

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

 

PS. Но это не важно, т.к. (по информации от Shtirlits) асинхронное чтение RAM в Cyclone есть

 

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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