contador en verilog

quiero hacer un contador que aumente por el valor de sus entradas, pero hice el banco de pruebas y la salida es indeterminada, xxxx. ¿Alguien puede decirme si hay algo mal en este código?

    //Count

 module count(clk, 

 rst, val, coin


 );
//Declaración entradas y salidas

 input  clk, rst;
 input  [3:0] coin;
 output [3:0] val;

 reg [3:0] val;  
 reg [3:0] nval; 


 always @(posedge clk, negedge rst)
      if(rst == 0) val <= 4'b0000;
      else val <= nval;

    always @(val)
      nval <= val + coin ;
  endmodule
Principalmente uso VHDL, y mi verilog está muy oxidado, pero me parece extraño que declares una salida llamada val, y un registro llamado val también. Si eso es legal en Verilog, mis disculpas. Podría valer la pena usar un nombre diferente para mayor claridad de todos modos.
Aquí es donde aprendes a depurar.
@MAB entiendo tu punto. De hecho, lo que estaba tratando de hacer era declarar la salida como un registro, pero podría estar mal. Gracias de todos modos, voy a comprobarlo.

Respuestas (2)

No está asignando un valor inicial a nval en ninguna parte, por lo que todos los valores adicionales dependen de esto, por lo tanto, val no está determinado.

Difícil estar seguro sin probar que no hay nada más, pero creo que es esto

always @(val)
   nval <= val + coin ;

Como una asignación sin bloqueo, posiblemente tomará el valor antiguo de val (es decir, X) al reiniciar. Puede usar una asignación de bloqueo y completar la lista de sensibilidad correctamente:

always @(val or coin)
   nval = val + coin;

o use una asignación:

wire [3:0] nval;
assign nval = val + coin;

Es probable que hacer cualquier otra cosa cause problemas (si no aquí, con otro código).