L'assegnazione di Verilog rompe la sintesi usando Icestorm

Aug 23 2020

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

4 awjlogan Aug 23 2020 at 21:59

In Verilog, assignpuò essere utilizzato solo con wirevariabili di tipo. Se l'avessi dichiarato come output [7:0] detecto output wire [7:0] detectfunzionerebbe 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_sigvariabile su 8'h00. Nota anche che dovresti dare larghezze definite ai tuoi compiti, piuttosto che nude 0o 1; altrimenti lo strumento potrebbe lamentarsi delle larghezze troncate e il tuo intento è più chiaro.