Domanda

Sono un po 'confuso su ciò che è considerato un input quando si utilizza il carattere jolly @ * in un elenco di sensibilità del blocco sempre. Ad esempio, nell'esempio seguente che i segnali vengono interpretati come ingressi che causano rivalutare il blocco sempre? Da ciò che capisco CLK e Reset non sono inclusi perché non appaiono sul lato destro di qualsiasi dichiarazione procedurale nel blocco sempre. A e B sono inclusi perché entrambi appaiono sul lato destro delle dichiarazioni procedurali nel blocco sempre. Ma da dove sono davvero confuso è it e mux . Perché vengono utilizzati come condizioni di prova nel se e le dichiarazioni sono considerate input? Il blocco è sempre rivalutato ogni volta IT e MUX Valore di modifica? Sono praticamente un noob, e nei 3 libri di Verilog ho trovato una spiegazione soddisfacente. Ho sempre trovato le spiegazioni qui per essere davvero disponibili. Grazie

module example
( 
    input wire clk, reset, en, a, b,
    input wire [1:0] mux,
    output reg x,y, z
);

always @*    
begin  
 x = a & b;    
  if (en)
    y= a | b;
  case(mux)
    2'b00: z = 0;
    2'b01: z = 1;
    2'b10: z = 1;
    2'b11: z = 0;
  endcase
end
endmodule
.

È stato utile?

Soluzione

Qualsiasi segnale che viene letto all'interno di un blocco e quindi può causare il risultato di un blocco per cambiare se le modifiche del valore, saranno incluse da @*. Qualsiasi modifica su un segnale di lettura utilizzato deve perché il blocco viene rivalutato, in quanto potrebbe causare la modifica delle uscite del blocco. Come sono sicuro che tu sappia, se non avessi usato @* che chiasti quei segnali a mano.

Nel caso del codice che hai fornito è un segnale che è:

    .
  • Valutato sul lato destro di un compito (a e b)
  • Valutato come parte di un condizionale (en e mux)

    ... ma è un segnale che verrebbe valutato per qualsiasi motivo. (Non riesco a pensare a nessun altro motivo in questo momento, ma forse qualcun altro può)

    clk e reset non sono sull'elenco di sensibilità perché non sono utilizzati. Semplice come quella. Non c'è niente di speciale per loro; Sono segnali come qualsiasi altro.

Altri suggerimenti

Nell'esempio, i seguenti segnali sono inclusi nell'elenco di sensibilità implicito:

a
b
en
mux
.

clk e reset non fanno parte dell'elenco di sensibilità.

Questo è descritto completamente nella STD IEEE per Verilog (1800-2009, per esempio).La specifica IEEE è la migliore fonte di informazioni dettagliate su Verilog.La documentazione per il tuo simulatore può anche descrivere come funziona @*.

La risposta più semplice dipende se stai scrivendo RTL, o un testbench.Se stai scrivendo RTL, dovresti provare a dimenticare il concetto di elenchi di sensibilità, in quanto non esistono davvero.Non c'è logica che si aggiorna solo quando viene attivato un elemento nell'elenco.Tutti gli elenchi di sensibilità possono fare in RTL è causare differire la simulazione e il circuito reale, non fanno nulla di buono.

Quindi, usa sempre "sempre @ *" o meglio ancora "sempre_comb" e dimentica il concetto di elenchi di sensibilità.Se l'elemento nel codice viene valutato, attiverà il processo.Semplice come quella.Un articolo è in un se / altro, un caso, assegnato a una variabile o qualsiasi altra cosa, sarà "valutato" e quindi causerà l'attivazione del processo.

Ma, basta ricordare, nei circuiti digitali, non c'è alcun elenco di sensibilità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top