Поведенческие симуляции Vivado, показывающие неопределенный (XX) вывод

#verilog #simulation #fpga #vivado

#verilog #Симуляция #fpga #vivado

Вопрос:

Я пытаюсь запустить поведенческое моделирование в моем коде Verilog в Vivado. Однако после запуска моделирования вместо получения выходных данных они отображаются в виде красных линий с 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 amp; B
                led = (A amp; 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 (входные данные) заполнены правильно, однако светодиод (выходной сигнал) горит красным и показывает XX.

введите описание изображения здесь

Я пытаюсь показать фактические результаты.

Ответ №1:

Вам необходимо создать тактовый сигнал и управлять 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 блоков.