显示未定义 (XX) 输出的 Vivado 行为仿真

Vivado Behavioral Simulations showing undefined (XX) output

我正在尝试 运行 在 Vivado 中对我的 Verilog 代码进行行为模拟。然而,在模拟 运行s 之后,它们没有得到输出,而是显示为带有 XX 的红线,我认为这意味着它们是未定义的。

我曾尝试更改 Verilog 文件顶部的时间刻度,如 Xilinx 论坛中所示 post,但这并没有解决我的问题。

这是我的 Verilog 程序:

module ctrl(
    input clk,
    input [5:0] A,
    input [5:0] B,
    input [3:0] C,
    output reg [6:0] led
    ); 
    always @(posedge clk)
    begin
        case(C)
            4'b0000:
                //A + B
                led <= A + B;
            4'b0001:
                //A - B
                led <= A - B;
            4'b0010:
                //A++
                led <= A + 1'b1;
            4'b0011:
                //A--
                led <= A - 1'b1;
            4'b0100:
                //B++
                led <= B + 1'b1;
            4'b0101:
                //B--
                led <= B - 1'b1;
            4'b0110:
                //A & B
                led = (A & B);
            4'b0111:
                //A | B
                led = (A | B);                
            4'b1000:
                //A ^ B
                led = (A ^ B);
            4'b1001:
                //~A
                led = {1'b0,~A[5:0]
            4'b1010:
                //~B
                led = {1'b0,~B[5:0]};
            4'b1011:
                //A << B
                led = A << B;
            4'b1100:
                //B << A
                led = B << A;
                
            4'b1101:
                //Light LED[0] if A > B
                if(A > B)
                    led = 7'b0000001;
                else
                    led = 7'b0000000;
            4'b1110:
                //Light LED[0] if A < B
                if(A < B)
                    led = 7'b00000001;
                else
                    led = 7'b0000000;
                    
            4'b1111:
                //Light LED[0] if A=B
                if(A == B)
                    led = 7'b0000001;
                else
                    led = 7'b0000000;          
            default: 
                //Unimplemented opcode
                led <= 7'b1111111;
        endcase
    end
endmodule

测试平台

module ctrl_testbench();


    reg[5:0] A;
    reg[5:0] B;
    reg[3:0] C;
    wire[6:0] led;
    
    ctrl dut (
        .A(A),
        .B(B),
        .C(C),
        .led(led)
    );
    
    initial begin
        A = 6'b000001;
        B = 6'b000001;
        C = 4'b0000;
        #100;
        A = 6'b000000;
        B = 6'b000000;
        C = 4'b0000;
        #100;
        A = 6'b000010;
        B = 6'b000010;
        C = 4'b0001;
    end
endmodule

行为模拟后的时序图是运行。如您所见,AC(输入)已正确填充,但 LED(输出)为红色并显示 XX。

我正在尝试显示实际输出。

您需要创建时钟信号并驱动 DUT 的 clk 输入:

module ctrl_testbench();
    reg[5:0] A;
    reg[5:0] B;
    reg[3:0] C;
    wire[6:0] led;
    reg clk;
    
    initial begin
        clk = 0;
        forever #5 clk = ~clk;
    end

    ctrl dut (
        .clk(clk),
        .A(A),
        .B(B),
        .C(C),
        .led(led)
    );

    initial begin
        A = 6'b000001;
        B = 6'b000001;
        C = 4'b0000;
        #100;
        A = 6'b000000;
        B = 6'b000000;
        C = 4'b0000;
        #100;
        A = 6'b000010;
        B = 6'b000010;
        C = 4'b0001;
        $finish;
    end
endmodule

我创建 2 个 initial 块很方便。由于 forever,第一个永远不会结束,第二个是 $finish 结束模拟所必需的。使用多个 initial 块分离出不同的功能是很常见的。