二进制到bcd的verilog输出始终为x

二进制到bcd的verilog输出始终为x,verilog,Verilog,我有一个二进制到bcd转换器模块,它使用shift-add 3算法,如下所示: module BCD( input wire [7:0] binary, output wire [3:0] Hundreds, output wire [3:0] Tens, output wire [3:0] Ones ); integer i; reg [11:0] bcd; initial begin bcd = 12'b000000000000; for(

我有一个二进制到bcd转换器模块,它使用shift-add 3算法,如下所示:

module BCD(
    input wire [7:0] binary,
    output wire [3:0] Hundreds, 
    output wire [3:0] Tens, 
    output wire [3:0] Ones
);
integer i;
reg [11:0] bcd;
initial begin
    bcd = 12'b000000000000;
    for(i=7;i>=0;i=i-1) begin
       bcd[11:0] = { bcd[10:0], binary[i] };
       if(bcd[3:0] >= 5) bcd[3:0] = bcd[3:0] + 2'b11;
       if(bcd[7:4] >= 5) bcd[7:4] = bcd[7:4] + 2'b11;
    end
end
assign Hundreds = bcd[11:8];
assign Tens = bcd[7:4];
assign Ones = bcd[3:0];
endmodule;
module BCD_Testbunch();
reg [7:0] binary;
wire [3:0] bcd_u;
wire [3:0] bcd_t;
wire [3:0] bcd_h;
integer i;
initial begin
    binary = 8'b00000000;
    $monitor("t = %g\t || Binary =%b (%d) BCD = %d %d %d",$time,binary,binary,bcd_h,bcd_t,bcd_u);
    for(i=1;i<=8'b11111111;i=i+1)
        #5 binary = binary + 1;
end
BCD B (binary,bcd_h,bcd_t,bcd_u);
endmodule;
以及一个试验台,如下所示:

module BCD(
    input wire [7:0] binary,
    output wire [3:0] Hundreds, 
    output wire [3:0] Tens, 
    output wire [3:0] Ones
);
integer i;
reg [11:0] bcd;
initial begin
    bcd = 12'b000000000000;
    for(i=7;i>=0;i=i-1) begin
       bcd[11:0] = { bcd[10:0], binary[i] };
       if(bcd[3:0] >= 5) bcd[3:0] = bcd[3:0] + 2'b11;
       if(bcd[7:4] >= 5) bcd[7:4] = bcd[7:4] + 2'b11;
    end
end
assign Hundreds = bcd[11:8];
assign Tens = bcd[7:4];
assign Ones = bcd[3:0];
endmodule;
module BCD_Testbunch();
reg [7:0] binary;
wire [3:0] bcd_u;
wire [3:0] bcd_t;
wire [3:0] bcd_h;
integer i;
initial begin
    binary = 8'b00000000;
    $monitor("t = %g\t || Binary =%b (%d) BCD = %d %d %d",$time,binary,binary,bcd_h,bcd_t,bcd_u);
    for(i=1;i<=8'b11111111;i=i+1)
        #5 binary = binary + 1;
end
BCD B (binary,bcd_h,bcd_t,bcd_u);
endmodule;
模块BCD_Testbunch();
reg[7:0]二进制;
导线[3:0]bcd_;
导线[3:0]bcd\t;
导线[3:0]bcd_h;
整数i;
初始开始
二进制=8'b00000000;
$monitor(“t=%g\t | | Binary=%b(%d)BCD=%d%d%d”,$time,Binary,Binary,BCD_h,BCD_t,BCD_);

对于(i=1;i正如@mkrieger1在评论中指出的那样,我将
首字母改为
始终(*)
在bcd模块中,现在一切都正常了

bcd
中的
初始
块对我来说很奇怪。我认为您不想在开始时只更新
bcd
的输出一次,但每次输入都会更改。我不能说这是否正确,但请尝试使用
始终(*)
而不是
initial
。感谢您的帮助,将bcd中的
initial
更改为
always@(*)
后,它就工作了