L'assegnazione di Verilog rompe la sintesi usando Icestorm
bene, ho questo codice che sta dando un avviso "Avviso: nessun orologio trovato nel design" e l'FPGA non sta facendo nulla dopo il flash:
module syncRX(clk, signal, detect);
input clk, signal;
output reg [7:0] detect = 0;
reg [7:0] detect_sig = 0;
always @(posedge signal)
begin
detect_sig <= detect_sig + 1;
end
assign detect = detect_sig;
endmodule // top
Risolve il problema nell'"assegnazione" perché con questa modifica funziona bene:
module syncRX(clk, signal, detect);
input clk, signal;
output reg [7:0] detect = 0;
//reg [7:0] detect_sig = 0;
always @(posedge signal)
begin
detect <= detect + 1;
end
//assign detect = detect_sig;
endmodule // top
Qualcuno sa cosa c'è che non va nella prima versione? Grazie!
Risposte
In Verilog, assign
può essere utilizzato solo con wire
variabili di tipo. Se l'avessi dichiarato come output [7:0] detect
o output wire [7:0] detect
funzionerebbe bene ( wire
è implicitamente dedotto nella prima dichiarazione). Anche questa domanda è rilevante.
Tieni inoltre presente che l'inizializzazione come quella che hai fatto qui non è garantita per essere sintetizzabile in un FPGA, e certamente non in un ASIC. Dovresti avere un input di ripristino e usarlo per reimpostare la tua detect_sig
variabile su 8'h00
. Nota anche che dovresti dare larghezze definite ai tuoi compiti, piuttosto che nude 0
o 1
; altrimenti lo strumento potrebbe lamentarsi delle larghezze troncate e il tuo intento è più chiaro.