Minimal Beispiel
Hier ist ein Beispiel dafür, was Qiu erwähnt.
In einem RAM ist die Speichergröße eine Funktion der Wort- und Adressgrößen.
Wenn also das übergeordnete Modul die Wort- und Adressgröße angibt, sollte es nicht in der Lage sein, die Speichergröße ebenfalls anzugeben.
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.
...
Und auf Elternmodul, das ist in Ordnung:
module myram_tb;
myram #(
.ADDR_SIZE(2),
.WORD_SIZE(2)
) top (
/* wires */
)
aber sollte ein Fehler sein:
module myram_tb;
myram #(
.ADDR_SIZE(2),
.WORD_SIZE(2),
.MEM_SIZE(2)
) top (
/* wires */
)
iverilog
nicht scheitern, und ich glaube, dass diese ist ein Fehler: https://github.com/steveicarus/iverilog/issues/157
Einschneiden gibt einen Fehler wie erwartet.