1 votos

El código Verilog muestra resultados desconocidos (X) por alguna razón

He escrito este código y no da un valor para la suma. ¿Por qué?

diseño:

module fourBitAdder (input [3:0] A, B, input cin, output [3:0] S, output cout);
  wire [4:0] c;
  wire [4:0] S0;
  assign c[0] = cin;
  assign cout = c[4];
  assign S0 = A + B + cin;
  assign {cout, S} = (S0>9)? S0+6 : S0;
endmodule

module fourBitAdder11 (input [15:0] A, B, input cin, output [15:0] S, output cout);
  wire [16:0] c;
  fourBitAdder FB0 [3:0] (A[3:0], B[3:0], c[3:0], c[4:1], S[3:0]);
  fourBitAdder FB1 [7:4] (A[7:4], B[7:4], c[7:4], c[8:5], S[7:4]);
  fourBitAdder FB2 [11:8] (A[11:8], B[11:8], c[11:8], c[12:9], S[11:8]);
  fourBitAdder FB3 [15:12] (A[15:12], B[15:12], c[15:12], c[16:13], S[15:12]);
endmodule

banco de pruebas:

module Test_fourBitAdder;
  reg [15:0] A, B;
  reg cin;
  wire [15:0] S;
  wire cout;
  wire [16:0] c;

  fourBitAdder FB0 [3:0] (A[3:0], B[3:0], c[3:0], c[4:1], S[3:0]);
  fourBitAdder FB1 [7:4] (A[7:4], B[7:4], c[7:4], c[8:5], S[7:4]);
  fourBitAdder FB2 [11:8] (A[11:8], B[11:8], c[11:8], c[12:9], S[11:8]);
  fourBitAdder FB3 [15:12] (A[15:12], B[15:12], c[15:12], c[16:13], S[15:12]);

  initial begin
    $dumpfile("dump.vcd");
    $dumpvars;
    A = 16'h1234; B = 16'h4567; cin = 0;
    #20 $finish;
  end
endmodule

The output

0voto

Zach Martin Puntos 8

Te salen las X porque tienes problemas con las conexiones de los puertos de la instancia del módulo.

Está utilizando conexiones por orden, lo que puede dar lugar a errores.
En la definición de su módulo, S es antes de cout , pero en sus líneas de instancia cout es antes de S . Se podría cambiar el orden, pero es mejor utilizar conexiones por nombre para evitar este error común de Verilog.

Otro problema es que utiliza una matriz de 4 instancias para un total de 16 instancias de fourBitAdder sin embargo, sólo necesitas un total de 4 instancias. Puedes omitir las matrices.

Sólo necesitas 5 bits de acarreo, no 17, y tienes que conectar el cin señal. Estos son los cambios:

module Test_fourBitAdder;
  reg [15:0] A, B;
  reg cin;
  wire [15:0] S;
  wire [4:0] c;

assign c[0] = cin;

  fourBitAdder FB0 (.A(A[ 3: 0]), .B(B[ 3: 0]), .cin(c[0]), .S(S[ 3: 0]), .cout(c[1]));
  fourBitAdder FB1 (.A(A[ 7: 4]), .B(B[ 7: 4]), .cin(c[1]), .S(S[ 7: 4]), .cout(c[2]));
  fourBitAdder FB2 (.A(A[11: 8]), .B(B[11: 8]), .cin(c[2]), .S(S[11: 8]), .cout(c[3]));
  fourBitAdder FB3 (.A(A[15:12]), .B(B[15:12]), .cin(c[3]), .S(S[15:12]), .cout(c[4]));

  initial begin
    $dumpfile("dump.vcd");
    $dumpvars;
    A = 16'h1234; B = 16'h4567; cin = 0;
    #20 $finish;
  end
endmodule

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X