После того, как удалось переключить свой ГМ со схемотехнического, на логический образ мышления, что называется, попёрло.
За пару дней написал практически весь проект. Разумеется, ошибки исключать нельзя, они будут вылезать при симулировании (до этого еще не добрался), но каждый отдельный модуль компилируется без серьезных замечаний (без красного).
Проблемы начинаются, когда пытаюсь собирать отдельные *.v файлы в один. Так как модулей в проекте не много, и они все довольно простые, и занимают всего по несколько строк кода (максимум - не более 20-25 строк), решил просто скопировать коды отдельных модулей в файл топ-модуля. Разумеется, при этом указал и описал каждый модуль в списке модулей топ-модуля.
В основном, возникающие при этом ошибки ошибки связаны с портами, и линиями связи.
Вот типичные сообщениях:
Error (10206): Verilog HDL Module Declaration error at DDMV.v(12): top module port "s_phi" is not found in the port list,
Error (10663): Verilog HDL Port Connection error at DDMV.v(28): output or inout port "f_ft" must be connected to a structural net expression.
При том, что указанный в первом сообщении порт включен в соответствующий порт-лист в топ-модуле, и в нет-листы модулей, в которых он задействован, так же, как порт из второй ошибки вроде бы подключен, куда надо.
Предполагаю, что ошибки связаны с некорректным написанием нет-листов, хотя по отдельности (по-модульно) все нет-листы читаются компилятором без замечаний.
В связи с этим вопросы:
Важен ли порядок перечисления (очередность) используемых input wire и output reg в нет-листе топ-модуля, и вторичного модуля? У меня не всегда эта очередность соблюдается. Хотя исправление очередности одного порта (или его исключение из списков), как правило, влечет за собой появление аналогичной ошибки, но уже по другому порту.
Как корректно организовать линии связи, соединяющие разные модули, когда нужно выходной порт (output reg, или просто output) одного модуля соединить c входным портом (input wire, или просто wire) другого (других) модулей? Здесь же: когда нужно использовать output reg (или input wire), а когда просто output (или input)?
Я уже задавал подобный вопрос, но уважаемый umarsohod ответил, что не видит разницы. Так ли это?
Еще вопрос: в модуле А есть output reg [7:0]data. Нужно сигнал n-го бита этой шины передать в модуль В. Как правильно это сделать - "тянуть" всю шину data от модуля к модулю, и на приемной стороне выделить сигнал n-го бита шины data, или сразу в модуле А выделить нужный бит, назначить его дополнительной wire, и передать в модуль В только эту линию?
В принципе, data подается и в другие модули, т.е. уже гуляет внутри чипа, и компилятор сам найдет оптимальный вариант соединения?