In verilog è legale implementare un ripristino utilizzando l'assegnazione?

Aug 25 2020

Sto cercando di aggiungere un reset a un contatore e ho questo codice, che sintetizza perfettamente:

module syncRX(clk, signal, detect);
    input clk, signal;
    output [7:0] detect;
    
    reg [7:0] detect_aux = 8'b0;
    reg rst;
    assign detect = detect_aux & ~rst;
    
    freq_div div(.clk(clk), .clk_1khz(clk_1khz));
    
    always @(posedge signal)
        rst <= 1;
        
    always @(posedge clk_1khz)
        detect_aux <= detect_aux + 1;
     
endmodule // top

module freq_div(input clk, output reg clk_1khz);
    reg [12:0] count = 0;
    always @(posedge clk)
     begin
        if(count == 6000)
            begin
                clk_1khz <= ~clk_1khz;
                count <= 0;
            end
        else
            count <= count + 1;
     end
endmodule

Il problema è che

    reg rst;
    assign detect = detect_aux & ~rst;

Le cuciture non fanno nulla. È legale quello che sto provando? Grazie

Risposte

1 schnedan Aug 25 2020 at 04:03

come già detto, non si cambia mai il valore da rst a '1'

poi, il tuo primo non è un reset in termini di progettazione del chip, ma un segnale chiaro, quindi rinominalo in clr.

"tutto" sui reset reali per i moduli:http://www.asic-world.com/tidbits/all_reset.html

3 ThePhoton Aug 25 2020 at 03:51

Come sottolineato nei commenti, nel tuo codice rstè sempre 0, quindi non influirà mai sul valore di detect. Se vuoi che il ripristino avvenga, dovresti dare rstun input al tuo modulo, e poi impostarlo alto ad un certo punto nel tuo banco di prova.

Ma dovresti anche notare che questo non è davvero un comportamento di ripristino. L'impostazione rstalta costringerà l' detectuscita del modulo ad andare a zero, ma non appena rsttorna bassa detecttornerà al suo valore precedente come memorizzato in detect_aux. Se si trattasse di un ripristino corretto, ci aspetteremmo che il conteggio ricominci da 0 dopo il rstrilascio.