2015-01-26 3 views
0

У меня возникли проблемы с созданием экземпляра модуля в verilog. Я использую платформу Altera Quartus для разработки и моделирования кода verilog.Создание экземпляра модуля Verilog

Я следовал этому примеру (среди нескольких других): http://www.asic-world.com/verilog/verilog_one_day4.html

Я написал модуль (максимум), который находит максимум между двумя подписанными входами.

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

Это мой код до сих пор:

module maximum (a, b, out); 
input signed [15:0] a; 
input signed [15:0] b; 
output reg signed [15:0] out; 
    always @* begin 
    if (a>b) 
     assign out = a; 
    else 
     assign out = b; 
    end 
endmodule 

и я создаю экземпляр в другом модуле systolic_PE (все это находится в том же файле seqalign.v)

maximum m0(.a(tempB), .b(diag), .out(tempA)); 

И я получаю ошибку :

«Синтаксическая ошибка Verilog HDL по seqalign.v (139) около текста« m0 »; ожидая «< =» или «=»»

Я проверил все, что я сделал до сих пор, и я не могу показаться, чтобы увидеть что-то я пропустил .. кто-то может быть достаточно любезен, чтобы вести меня?

Также на стороне записки: Instantiation of a module in verilog

Я пытался создать экземпляр моего модуля в случае заявление, так что я пытался за пределами, если оператор в всегда @ (posedge CLK) блок, и я получаю ошибка

ошибка синтаксиса HDL в seqalign.v (88) рядом с текстом «(», ожидая «»

+1

Прежде всего, не используйте 'assign' внутри всегда блока: http://stackoverflow.com/q/23687172/1959732 – Greg

+0

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

+0

Спасибо, Грег, я изменил его сейчас. – Melvin

ответ

0

Глядя на код, который вы публикуемый в своем комментарии, вопрос от инстанцирования вашего модуля я nside your always @(posedge clk) блок в строке 70. Вы никогда не создаете модули внутри процедурных блоков (всегда, начальные и т. д.).

Как Verilog является аппаратным описательным языком, вы должны быть в разработке аппаратного обеспечения при написании кода. Реализация модуля похожа на пайку микросхемы на печатную плату, во время разработки, которую вы либо выполняете, или нет, и этот компонент остается там на все время. Вы не говорите, ну, я хочу этот чип здесь некоторое время, но снимите его с печатной платы, когда система попадет в эти состояния. В вашем коде вы условно создаете экземпляр своего модуля, если состояние равно 3. Однако состояние изменяется со временем. Так что это похоже на высказывание, когда регистр, содержащий состояние, читает 3, поместите этот чип в систему, иначе он не существует и не вытащит его. На уровне кода подумайте о создании экземпляров модулей как их собственных процедурных блоков, так же, как вы всегда ставите всегда внутри другого, не ставьте модули всегда в блоки (конечно, определения/объявления модулей могут всегда блокировать внутри них).

Модули являются постоянными и постоянными времени компиляции, поэтому вы можете использовать для генерации условных экземпляров модулей во время компиляции (т. Е. Решить, включать или не включать модуль в проект при создании системы).Но в вашем коде вы условно создаете экземпляр во время моделирования, что не допускается, как описано выше.

Вы можете сделать одну из двух вещей, чтобы решить вашу проблему. Можно было бы переместить вашу задачу из вашего подмодуля maximum в модуль systolic_PE и использовать его для получения максимального количества ваших переменных tby, вызывающих его (строка 123 станет чем-то вроде tempA <= convert(.a(0), .b(diag+match)); с a и b добавлены в качестве исходных данных для вашей задачи). Или, создайте экземпляр модуля вне всегда блока, но вам нужно будет изменить свою задачу как процедурный блок, как у вас на самом деле.

+0

Спасибо Unn! Очень полезно и информативно. Я следил за вашим советом и переместил подмодуль в мой систолический модуль. Я столкнулся с ошибкой, что вложенные подмодули являются признаком SystemVerilog. Хорошо. Итак, я вернул изменения и попытался выполнить преобразование задачи в строке123, но получаю ссылку «can not resolve to object» convert ». – Melvin

+0

Игнорируйте приведенное выше. Я понял, что вы имели в виду, перемещая задачу внутри systolic_PE.Это решило мою проблему, однако ваше предложение для line123 было для функции. Тем не менее, большое вам спасибо за вашу помощь! Мой обновленный код для любого, кто смотрит в будущее: http://pastebin.com/Vyyv3cYW – Melvin

+0

Ты прав, я думал о функции, когда писал это, а не задание. Ты тоже должен использовать задачу, она просто выглядела бы иначе :) – Unn

Смежные вопросы