Si simplemente escribo el siguiente código:
module TOP;
wire [31:0] a = 32'b11111111_11111111_11000000_00000000;
wire [31:0] b = 32'b00000000_00000000_00010000_00011111;
wire [4:0] shamt;
assign shamt = b[4:0];
wire signed [31:0] signed_a;
assign signed_a = a;
wire [31:0] output;
assign output = signed_a >>> b;
Esto da un resultado correcto que es 11111111_11111111_11111111_11111111
Sin embargo, si uso código que usa el módulo, siempre genera un resultado incorrecto:
module TOP;
reg [31:0] a = 32'b11111111_11111111_11000000_00000000;
reg [31:0] b = 32'b00000000_00000000_00010000_00011111;
wire [31:0] out;
ALU alu(
.A(a),
.B(b),
.C(out)
);
initial
begin
#10 $display("out: %b\n", out);
#10 $display("outout: %b\n", alu.outout);
#10 $display("C: %b\n", alu.C);
end
endmodule
module ALU (
input [31:0] A,
input [31:0] B,
output [31:0] C
);
wire signed [31:0] outout;
wire [31:0] signed_a;
assign signed_a = A;
wire [4:0] shamt;
assign shamt = B[4:0];
assign outout = signed_a >>> shamt;
assign C = outout;
endmodule
En el código anterior, todos los resultados de $ display muestran un valor incorrecto que es
00000000_00000000_00000000_00000001.
¿Por qué no genera un valor correcto como el primer código?