【问题标题】:Vivado Behavioral Simulations showing undefined (XX) output显示未定义 (XX) 输出的 Vivado 行为模拟
【发布时间】:2019-08-31 07:02:24
【问题描述】:

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

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

这是我的 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

在运行行为仿真后,时序图给出了这一点。如您所见,A-C(输入)已正确填充,但 LED(输出)为红色并显示 XX。

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

【问题讨论】:

    标签: verilog simulation fpga vivado


    【解决方案1】:

    您需要创建时钟信号并驱动 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 块来分离不同的功能是很常见的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-05
      相关资源
      最近更新 更多