Simulazione semplice contatore con Verilog
Scusate, ho già pubblicato stamattina una domanda simile inerente ad un multiplexer. Purtroppo mi trovo in una situazione simile con un contatore, stavolta la simulazione parte subito, però è sbagliata, ma non riesco a trovare l'errore.
Quello che volevo realizzare era un semplice contatore non dotato di reset, che, ad ogni colpo di clock, cominciava a sommare 1, a partire da 000. (Il tutto solo quando abilitato, cioè con en=1, per en=0, non dovrebbe sommare nulla)
Ok, quindi scrivo il codice del contatore.
Poi scrivo il testbench
La simulazione si avvia, enable passa da 0 a 1 come richiesto, idem il clock, mentre cnt e cnt_nxt rimangono ad un valore di "don't care" x.
Non capisco quale sia l'errore. Potreste farmi capire dove sbaglio?
----
Siccome mi veniva peggio commentare troppo nel listato, scrivo qui:
- en (o enable, nel testbench) serve per abilitare il contatore, quando è a 0 non somma, quando è a 1, somma;
- ck (o clock, nel testbench) è il segnale di clock;
- cnt è il segnale di uscita della rete sequenziale che entra nella rete combinatoria, e se en=1, si incrementa di uno;
- cnt_nxt è il segnale in uscita dalla rete combinatoria (cioè, se en=1, cnt_nxt = cnt+1), che entra nella rete sequenziale.
Grazie per l'aiuto!
Quello che volevo realizzare era un semplice contatore non dotato di reset, che, ad ogni colpo di clock, cominciava a sommare 1, a partire da 000. (Il tutto solo quando abilitato, cioè con en=1, per en=0, non dovrebbe sommare nulla)
Ok, quindi scrivo il codice del contatore.
- Codice: Seleziona tutto
`timescale 1ns / 1ps
module counter(
input en, ck,
output reg [2:0]cnt
);
reg [2:0]cnt_nxt;
always @(posedge ck) //rete sequenziale (insieme di ffd)
cnt <= cnt_nxt;
always @(cnt) //rete combinatoria
if (en)
cnt_nxt = cnt + 3'b001;
else cnt_nxt = cnt;
endmodule
Poi scrivo il testbench
- Codice: Seleziona tutto
`timescale 1ns / 1ps
module tbcounter;
reg enable, clock;
reg [2:0]cnt_nxt;
wire [2:0]cnt;
counter dut(enable,clock,cnt);
initial
begin
$monitor($time,,"enable=%b clock=%b cnt_nxt=%d cnt=%d", enable,clock,cnt_nxt,cnt);
enable = 0;
clock = 0;
#10 enable = 1;
#30 $stop;
end
always #2 clock = ~clock;
endmodule
La simulazione si avvia, enable passa da 0 a 1 come richiesto, idem il clock, mentre cnt e cnt_nxt rimangono ad un valore di "don't care" x.
Non capisco quale sia l'errore. Potreste farmi capire dove sbaglio?
----
Siccome mi veniva peggio commentare troppo nel listato, scrivo qui:
- en (o enable, nel testbench) serve per abilitare il contatore, quando è a 0 non somma, quando è a 1, somma;
- ck (o clock, nel testbench) è il segnale di clock;
- cnt è il segnale di uscita della rete sequenziale che entra nella rete combinatoria, e se en=1, si incrementa di uno;
- cnt_nxt è il segnale in uscita dalla rete combinatoria (cioè, se en=1, cnt_nxt = cnt+1), che entra nella rete sequenziale.
Grazie per l'aiuto!