Você pode obter o erro ao instauciar diretamente qualquer função de primeira página (FIFO) de módulos parametrizados (LPM). Se o buffer FIFO instaurou usar a célula e registra duas funções aritméticas, os parâmetros não podem ser passados pelo defparam argumento. O exemplo abaixo não funciona mesmo sendo codificado corretamente.
. . .
module fifo256x8 (data, rreq, wreq, clock, clockx2, aclr, threshlevel,
threshold, empty, full, usedw, q);
input [7:0] data;
input [7:0] threshlevel;
input rreq, wreq, clock, clockx2, aclr;
output [7:0] q;
output [7:0] usedw;
output threshold, empty, full;
sfifo inst_1 (.data (data),
.rreq (rreq), .wreq (wreq), .clock (clock), .clockx2 (clockx2),
.aclr (aclr), .q (q), .usedw (usedw), .threshold (threshold),
.empty (empty), .threshlevel (threshlevel), .full (full));
defparam inst_1.lpm_width = 8;
defparam inst_1.lpm_numwords = 256;
endmodule
. . .
A solução alternativa é instautar a função FIFO em um arquivo de design gráfico falso (.gdf) com todo o seu conjunto de parâmetros e dar-lhe um nome específico (por exemplo, my_fifo.gdf). Crie um arquivo incluir padrão (.inc) para o GDF. Instande o GDF no código HDL Verilog de alto nível sem qualquer parâmetro especificado. O exemplo abaixo funcionará (correspondente ao exemplo acima).
. . .
module fifo256x8 (data, rreq, wreq, clock, clockx2, aclr, threshlevel,
threshold, empty, full, usedw, q);
input [7:0] data;
input [7:0] threshlevel;
input rreq, wreq, clock, clockx2, aclr;
output [7:0] q;
output [7:0] usedw;
output threshold, empty, full;
my_fifo inst_1 (.data (data),
.rreq (rreq), .wreq (wreq), .clock (clock), .clockx2 (clockx2),
.aclr (aclr), .q (q), .usedw (usedw), .threshold (threshold),
.empty (empty), .threshlevel (threshlevel), .full (full));
endmodule
. . .
my_fifo.gdf contém uma instanência de SFIFO com e lpm_width = 8 lpm_numwords = 256. O mapeamento da porta acima refere-se ao my_fifo.gdf e não à SFIFO megafunção.