Доступ к ресурсам верхнего уровня за пределами иерархии

есть ли способ синтезировать архитектуру в verilog, чтобы глубоко вложенная конечная точка могла получить доступ к некоторым контактам верхнего уровня (из .ucf) без явной маршрутизации контактов через каждый модуль иерархии.

В моем случае у меня есть блок PCIe с глубоко вложенной конечной точкой. В конечной точке есть декодер адреса, который должен предоставить некоторую информацию о сигнале от контактов на верхнем уровне.

Я бы не хотел модифицировать каждый промежуточный модуль для проведения необходимых проводов.

мои поиски в Интернете не увенчались успехом, потому что термины «сеть» и «шина» уже имеют альтернативные значения в verilog.

Я пробовал конкретные иерархические имена, такие как (например) top.button и top.LED, но мне удалось получить доступ только к читаемым контактам, но не к контактам для записи, что заставило меня предположить, что я упускаю здесь что-то фундаментальное.

ОБНОВЛЕНИЕ Я могу смоделировать это http://www.edaplayground.com/x/AAq

и синтезировать (аналогичная конструкция) без ошибок (Xilinx XST), но на светодиоде нет вывода, когда он работает на реальном оборудовании, поэтому мне интересно, не поддерживается ли ссылка вверх по имени для синтеза?


person david binette    schedule 05.07.2014    source источник
comment
Я предполагаю, что нет, это невозможно для синтеза, но даже если бы вы могли, я бы настоятельно не советовал идти по этому пути. Хотя вам может понадобиться быстрый ярлык, чтобы избавить себя от необходимости добавлять правильные списки портов в модули, в долгосрочной перспективе это может стать головной болью при обслуживании и отладке, если зайти слишком далеко. Когда вы смотрите на модуль, вы действительно хотите видеть, какие сигналы поступают в этот модуль через список портов, чтобы легче понять структуру. Это действительно плохая идея для всего, кроме самых маленьких и тривиальных проектов.   -  person Tim    schedule 06.07.2014


Ответы (3)


Вы пытались явно назвать полный иерархический путь контакта, к которому вы хотите получить доступ?

Например, предположим, что имя вашего верхнего экземпляра модуля — top, а затем на пять уровней вниз по иерархии вам нужно получить доступ к контакту x top и назначить его локальной переменной y:

//At level 5:
assign y = top.x

Некоторые инструменты синтеза поддерживают $top. В этом случае вы можете попробовать:

//At level 5:
assign y = $top().x

Вот рабочий пример на edaplayground.com (синтез не пробовал).

Дополнительную информацию см. в разделе "Ссылки на имена вверх" в Раздел 23.8 IEEE 1800-2012

person Ari    schedule 07.07.2014
comment
Фрагмент в edaplayground интересен, но он читает из порта верхнего уровня, я пытаюсь писать в сетевой пин верхнего уровня с нижнего уровня. - person david binette; 29.08.2014
comment
Метод ничем не отличается. Почему бы вам не попробовать что-то вроде assign top.net=xxx на более низком уровне? - person Ari; 29.08.2014

Да, это возможно и синтезируется с помощью некоторых инструментов. Единственный известный мне механизм — использовать статическую переменную в функции для создания соединения, вызывая функцию один раз для установки значения и один раз для получения значения.

В качестве примера см. мое доказательство концепции на Github.

SystemVerilog — доказательство концепции использования статических переменных внутри функций для связи между модулями.

Это позволяет выполнять соединения без добавления проводки через иерархию. Возможные приложения включают вывод сигналов на логический анализатор, запись в глобальные ресурсы (журнал событий, статистика, UART и т. д.).

Это правильно синтезируется в Quartus 13, я не пробовал это с другими инструментами, поэтому YMMV.

ОБНОВЛЕНИЕ: в настоящее время Xilinx Vivado не поддерживается, см. эту тему для получения подробной информации.

person Chiggs    schedule 06.07.2014
comment
Очень интересно! Если синтез не вызывает беспокойства, можно сделать это и с помощью статических переменных класса, верно? - person Ari; 07.07.2014
comment
@ Ари Ага, наверное, есть много способов добиться того же результата, если вам не нужно синтезировать. Также возможно, что некоторые инструменты синтеза будут правильно синтезировать переменные статического класса - см. также этот ответ: stackoverflow.com/a/22711967/579887 для использования функций статического класса, чтобы разрешить параметризацию функций. К сожалению, в настоящее время у меня есть доступ только к инструментам Altera/Xilinx, поэтому я не могу экспериментировать с синтезируемыми возможностями классов. - person Chiggs; 07.07.2014

Если известно об использовании интерфейсов SystemVerilog на момент реализации, разделы 3.5 и 25 IEEE 1800-2012 может решить эту проблему.

Интерфейс представляет собой именованный набор цепей, поэтому, если все на пути соединяется с интерфейсом, добавление дополнительной сети к интерфейсу означает, что все экземпляры этого интерфейса получают дополнительный провод.

Добавление сигналов к интерфейсу позволяет модулям нижнего уровня мгновенно подключаться ко всему остальному (верхнему уровню) с помощью этой шины, без каких-либо дополнительных операций с портами для подключения после того, как интерфейс подключен через иерархию.

Интерфейсы и структуры обсуждались ранее.
Учебник Дулоса по интерфейсам.

Для более полного ответа я включаю пример, приведенный в 25.3.3 IEEE 1800, показывающий модули, подключенные через интерфейс:

// memMod and cpuMod can use any interface
module memMod (interface a, input logic clk);
  ...
endmodule

module cpuMod(interface b, input logic clk);
  ...
endmodule

interface simple_bus; // Define the interface
  logic req, gnt;
  logic [7:0] addr, data;
  logic [1:0] mode;
  logic start, rdy;
endinterface: simple_bus

module top;
  logic clk = 0;

  simple_bus sb_intf(); // Instantiate the interface
  // Reference the sb_intf instance of the simple_bus
  // interface from the generic interfaces of the
  // memMod and cpuMod modules
  memMod mem (.a(sb_intf), .clk(clk));
  cpuMod cpu (.b(sb_intf), .clk(clk));
endmodule

Используя модпорты (Раздел 25.5 IEEE 1800), вы можете указать разделы master-slave интерфейса для определения направлений портов.

Как упомянул Тим, я избегаю этого, так как его очень сложно отлаживать. Я работал над одним проектом, где активно использовались интерфейсы. Связи были не один к одному, а распространялись повсюду по иерархии. Представьте, что запись в регистр происходит через LBUS, используя шину WiredOR или тройное состояние для обратного считывания. Инструменты, которые у нас были в то время, не позволяли увидеть, какой модуль управляет шиной. Поэтому, если он пошел X с нескольких дисков, это была игра в догадки о том, что его вызвало.

Мы использовали интерфейсы не только для стандартных протоколов, таких как LBUS, но и новые, которые изменялись на лету, что означало, что модули, которые не были исправлены для изменений протокола, портили шину. Использование интерфейсов значительно ускорило реализацию, поскольку дополнительный сигнал можно было быстро интегрировать. Стоимость отладки была почти невозможна, поскольку источник проблем в интерфейсе не мог быть отслежен.

person Morgan    schedule 07.07.2014
comment
звучит как проблема с инструментами/командой, а не с интерфейсами как таковыми. Для типичных двухточечных шин без нескольких драйверов интерфейсы определенно должны быть улучшением, а если инструментальная поддержка интерфейсов неполная, то структуры являются хорошим компромиссом. Я до сих пор не уверен, что это отвечает на OP, хотя, как вы предполагаете, между модулями уже есть проводка на основе интерфейса. - person Chiggs; 07.07.2014
comment
@Chiggs, не предполагая, что интерфейс существует, а скорее они будут готовы выполнить работу, необходимую для упрощения его работы в будущем. Или ищете подход, когда вам нужна эта функциональность. - person Morgan; 07.07.2014
comment
Спасибо за комментарии. Требуются некоторые пояснения. 1) Я использую verilog, а не SystemVerilog, поэтому у меня нет некоторых из этих тонкостей 2) «глубоко вложенная конечная точка», которую я использую, является частью пакета IP, который может быть «регенерирован», что приводит к перезаписыванию любых модификаций. Если я добавлю интерфейсы или структуры или каким-либо образом изменю IP для передачи дополнительных сигналов, они будут хрупкими и могут быть потеряны. - person david binette; 29.08.2014
comment
@user3637453 user3637453 Спасибо за отзыв, надеюсь, он поможет кому-то еще, кто хочет автоматизировать подключение. Работа с IP-адресами, созданными другими, ограничивает возможности, надеюсь, некоторые другие ответы больше подходят для вашей ситуации. Удачи в ваших поисках (всегда приветствуются голоса, если вы нашли их полезными). - person Morgan; 29.08.2014