Ошибка: управляется через соединение порта, является многократным - PullRequest
0 голосов
/ 02 ноября 2019

Я могу построить код в modelsim, но при симуляции получаю ошибку ниже:

  1. addr_x, driven via port connection, is multiply driven (44) Line :49
  2. addr_f, driven via port connection, is multiply driven (46) Line :49
  3. s_ready_x, driven via port connection, is multiply driven (44) Line :49
  4. s_ready_f, driven via port connection, is multiply driven (46) Line :49

Как я могу решить эту проблему? (система verilog)

Ответы [ 2 ]

4 голосов
/ 02 ноября 2019

Не существует простого * исправления: вы должны изменить свой дизайн. Возможно, вам даже придется вернуться «к чертежной доске» и кардинально изменить свой дизайн.

В каждом из ctrlpath.. модулей вы выводите адрес. Таким образом, вы управляете одной и той же сетью с разных выходов. Вы как-то должны различать, кто из них вам действительно нужен. Таким образом, вам нужно добавить мультиплексор, который «знает», какой из них выбрать.

«Многократная ошибка» - это повторяющийся вопрос, возникающий в переполнении стека и в электротехнике. Что вы сделали, это подключить несколько выходных портов вместе. В электротехнике мы называем это «замыкающими выходами вместе». Термин короткое замыкание важен, так как он фактически является коротким замыканием. Это эквивалентная схема:

enter image description here

Некоторые выходы будут высокими, а другие низкими. Высокие будут пытаться поднять высокий уровень на выходе, открывая путь тока от VCC к выходному выводу. Те, которые являются низкими, будут пытаться снизить производительность. Они открывают текущий путь от выхода к земле. Вместе они образуют короткое замыкание между вашим VCC и землей.

* Не думайте, что вы легко можете решить эту проблему с помощью драйверов с тремя состояниями. Теоретически это может показаться возможным, практически вы действительно, действительно не хотите этого.

3 голосов
/ 02 ноября 2019

Вот одно из сообщений из компиляции VCS:

Ошибка- [ICSD] Недопустимая комбинация драйверов design.sv, 38 Недопустимая комбинация структурных драйверов. Переменная " s_ready_x " управляется несколькими структурными драйверами. Эта переменная объявлена ​​в "design.sv", 38: logic s_ready_x;Первый драйвер находится в " design.sv", 50 : ctrlpatho c (.clk (clk), .reset (сброс), .wr_done_f (wr_done_f), .wr_done_x (wr_done_x), .addr_x (addr_x)), .addr_f (addr_f), .m_valid_y (m_valid_y), .c ... Второй драйвер находится в " design.sv", 45 : ctrlpathx x (.clk (clk), .reset (сброс), .s_ready_x (s_ready_x), .addr_x (addr_x), .wr_done_x (wr_done_x), .wr_en_x (wr_en_x), .s_valid_x (s_valid_x);модуля, но дает правильное расположение драйверов.

Проблема в том, что и ctrlpathf, и ctrlpatho передают один и тот же сигнал с портами output. Основное правило:

вы не можете использовать одну и ту же переменную с несколькими драйверами.

Система verilog просто добавляет это требование к стандарту и проверяется на наличие определенных системных блоков verilog.

Комуисправьте это

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

  2. verilog позволяет вам умножать диски net типов и определяет правила для результатов. Если вы действительно хотите иметь несколько драйверов, вам нужно объявить эти порты как wires или аналогичные и изменить код, чтобы отразить его. Их можно многократно управлять с помощью операторов assign.

...