Esempio minimo
Ecco un esempio di ciò Qiu menzionato.
In una RAM, la dimensione della memoria è una funzione delle dimensioni della parola e dell'indirizzo.
Quindi, se il modulo genitore specifica la dimensione della parola e dell'indirizzo, non dovrebbe essere in grado di specificare anche la dimensione della memoria.
module myram #(
parameter WORD_SIZE = 1,
parameter ADDR_SIZE = 1
) (
input wire [ADDR_SIZE-1:0] addr,
inout wire [WORD_SIZE-1:0] data,
// ...
);
localparam MEM_SIZE = WORD_SIZE * (1 << ADDR_SIZE);
// Use MEM_SIZE several times in block.
...
E sul modulo padre, questo va bene:
module myram_tb;
myram #(
.ADDR_SIZE(2),
.WORD_SIZE(2)
) top (
/* wires */
)
ma questo dovrebbe essere un errore:
module myram_tb;
myram #(
.ADDR_SIZE(2),
.WORD_SIZE(2),
.MEM_SIZE(2)
) top (
/* wires */
)
iverilog
non manca, e credo che questo è un bug: https://github.com/steveicarus/iverilog/issues/157
Incisivo dà un errore come previsto.