2015-12-28 3 views
2

Я хотел иметь параметризованное создание FIFO, чтобы я мог вызвать один экземпляр FIFO с изменением глубины (параметра).Параметрированный экземпляр FIFO в Verilog

например. Я написал код для FIFO с глубиной в качестве параметра.

Я буду знать глубину FIFO только по конфигурации от микропроцессора. На основании конфигурации регистра, могу ли я назвать этот FIFO с переменным параметром, например значением?

integer depth_param; 
if(config_reg[1]) 
    depth_param <= 128; 
else 
    depth_param <= 512; 

genfifo #(depth_param) (.din (din),.wr(wr)....); 

модуль ФИФО:

module gen_fifo #(depth = 128) 
(din,wr,rd,clk....); 

вы можете предложить, пожалуйста, есть ли способ я могу это сделать?

+1

Просто сделайте краном в своем положении fifo в позиции 128, затем создайте логику переключения, которая будет использовать данные из крана в случае config_reg [1] = 1, иначе используйте данные с конца fifo. –

+2

Параметр требует постоянного значения. Значение не может измениться после компиляции или синтеза. Имя 'config_reg' подразумевает регистр, то есть загрузку после компиляции/синтеза. Является ли 'config_reg' регистром или параметром? – Greg

+0

@Sergei: вы не можете этого сделать. Все меняется, когда вы изменяете FIFO глубину - адрес указателя обертывания, AE, EF, AF, FF флаги - вы не можете просто взять данные из середины. OP должен создать полный настраиваемый FIFO во время выполнения. – EML

ответ

0

Это то, что говорит LRM:

Параметры представляют собой константы; следовательно, во время выполнения запрещено изменять их значение . Тем не менее, параметры модуля могут быть изменены на времени компиляции, чтобы иметь значения, отличные от значений , указанных в объявлении декларации. Это позволяет настраивать экземпляры модулей . Параметр может быть изменен с помощью инструкции defparam или в инструкции экземпляра модуля. Типичное использование параметров - это указать задержки и ширину переменных.

«Время работы» означает во время моделирования, после разработки. Синтезатор ничего не запускает, но то, что вы делаете, эффективно «время выполнения», и поэтому является незаконным.

Это не значит, что вы не можете этого сделать. Перейдите в глубину FIFO в качестве порта модуля. Я предполагаю, что вы знаете, как кодировать FIFO с первых принципов. Если это так, у вас обычно будет константа для размера FIFO; просто замените эту константу на значение в порту и найдите способ установить размер памяти. Очевидно, что вам нужно быть осторожным при изменении размера FIFO - например, вам может потребоваться его сброс. Если вы не знаете, как закодировать FIFO, вы должны спросить с помощью FPGA или электронного тега.

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