Ich schreibe Verilog-Code aus einigen Tagen und eine Frage, die ich habe, ist 'Können wir schreiben Block innerhalb generieren Block' schreiben? Ich schreibe eine RTL etwas wie folgt aus:generate generieren verilog + error near generate (veri - 1137)
Where 'n' is a parameter.
reg [DATA_WIDTH:0] flops [n-1:0];
generate
if (n > 0) begin
always @(posedge clk) begin
if (en) begin
flops[0] <= mem[addr];
end
end
generate
genvar i;
for (i = 1; i <= n ; i = i + 1) begin
always @(posedge clk) begin
flops[i] <= flops[i-1];
end
end
endgenerate
always @(flops[n - 1])
douta = flops[n - 1];
else
always @(posedge clk) begin
if (en) begin
primary_output = mem[addr];
end
end
end
endgenerate
Während die oben genannten Code kompilieren, erhalte ich:
ERROR: syntax error near generate (VERI-1137)
nicht sicher, warum. Zweck dieser RTL ist es, eine Pipeline von 'n' Flops auf der Ausgangsseite des Designs zu erstellen.
Können sagen, n 2 ist, dann sollte Schaltung werden:
flop1-> flop2-> primary output of design
flop1 und flop2 sind neu Flops erstellt.
@Matther, ich sehe. Danke für die wundervolle Erklärung. –
FYI: SystemVerilog erlaubt mehrdimensionale Array-Zuweisung in einer einzelnen Anweisung. Daher könntest du die for-Schleife überspringen mit 'always @ (posedge clk) begin flop [0] <= dina; wenn (n> 1) Flop [n-1: 1] <= Flop [n-2: 0]; Ende – Greg