Ich versuche, ein Modul zu erhalten, um die Syntaxprüfung in ISE 12.4 zu bestehen, und es gibt mir einen Fehler, den ich nicht verstehe. Zunächst wird ein Code-Schnipsel:Verilog generate/genvar in einem immer Block
parameter ROWBITS = 4;
reg [ROWBITS-1:0] temp;
genvar c;
generate
always @(posedge sysclk) begin
for (c = 0; c < ROWBITS; c = c + 1) begin: test
temp[c] <= 1'b0;
end
end
endgenerate
Wenn ich versuche, eine Syntaxprüfung, erhalte ich die folgende Fehlermeldung:
ERROR:HDLCompiler:731 - "test.v" Line 46: Procedural assignment to a non-register <c> is not permitted.
ich wirklich nicht verstehen, warum es zu beschweren. "c" ist kein Draht, es ist ein Genvar. Dies sollte das Äquivalent der völlig legal Syntax sein:
reg [3:0] temp;
always @(posedge sysclk) begin
temp[0] <= 1'b0;
temp[1] <= 1'b0;
temp[2] <= 1'b0;
temp[3] <= 1'b0;
end
Bitte keine Kommentare darüber, wie es einfacher sein würde, dies zu schreiben, ohne die zu erzeugen. Dies ist ein reduziertes Beispiel für einen viel komplexeren Code, der mehrere Wenns und nicht blockierende Zuweisungen an "temp" enthält. Sagen Sie mir auch nicht, dass es neuere Versionen von ISE gibt, das weiß ich schon. OTOH, wenn Sie wissen, es in einer späteren Version von ISE festgelegt ist, lassen Sie es mich wissen, welche Version Sie Werke kennen.
Danke für die schnelle Antwort. Ich hatte Angst, es wäre so etwas. Ein Teil des Problems bestand darin, eine Sequenz von if-Anweisungen oder Case-Selektoren mit der for-Schleife zu generieren, die nicht in separaten always-Blöcken ausgeführt werden kann. – user1684538
Gibt es eine Möglichkeit, den gesamten Code in einem einzigen Block zu erzeugen, oder ist Genvar einfach nicht dazu in der Lage? – user2569332