Моделирование Verilog DFF Создание x для вывода

Это должна быть самая простая проблема, которую нужно решить, но по какой-то причине я просто не могу понять это. В настоящее время я изучаю Verilog и в качестве упражнения разрабатываю очень простые модули и тестовые стенды для этих модулей. Одним из таких модулей является D-триггер (DFF). Вот модуль DFF (без сброса):

module DFF( clk, D, Q );
    parameter n = 1;    // DFF width
    input clk;
    input [n-1:0]  D;
    output [n-1:0] Q;
    reg [n-1:0] Q;

    always @( posedge clk ) begin
        Q <= D;
    end
endmodule

А вот и тестовый стенд:

module DFF_tb;
    reg clk, D;
    reg Q;

    DFF #(1) DUT ( clk, D, Q );

    initial begin
        clk = 1'b0;
        forever #10 clk = ~clk;     // Generate clock
    end

    initial begin   
        D = 0;                          // Check D = 0
        if ( Q !== 0 ) $display( "[FAIL] Q = 0" );

        #40 D = 1;                      // Check D = 1
        #40
        if ( Q !== 1 ) $display( "[FAIL] Q = 1" );

        $finish;                            // Complete test
    end
endmodule

А вот и симуляция: введите здесь описание изображения

Тестовый стенд reg Q остается x на время моделирования (хотя Q[0] не...).

Есть идеи, почему? Спасибо!


person nslogan    schedule 21.04.2014    source источник


Ответы (1)


Вы не сбрасываете свой флоп, поэтому до первого такта Q не имеет никакого известного значения.

Обычно флоп имеет асинхронный сброс, который должен быть установлен в начале симуляции на вашем тестовом стенде. Блок Always в вашем FF должен быть:

always @( posedge clk or posedge reset ) begin
  if (reset)
     Q <= '0;
  else
     Q <= D;
end

Кроме того, вам не нужно определять Q как reg. Это может быть провод. Рабочий код на edaplayground.com

person Ari    schedule 21.04.2014
comment
Так что это то, что мне, вероятно, все еще нужно узнать о FPGA, но почему, когда D установлен, Q не установлен, независимо от значения Q на первом фронте тактового сигнала? Разве Q не должен быть установлен на известное значение, D? - person nslogan; 22.04.2014
comment
@nslogan: когда D изменяется, Q не изменится до следующего положения часов, в котором производится выборка D. В вашем тестовом стенде D изменяется точно в положении часов, которое не сэмплируется до следующего фронта часов. Обратите внимание, что на реальном оборудовании вы хотите, чтобы D был стабильным на всем протяжении тактовой частоты. Вы можете имитировать это в тестовом стенде, немного отложив назначение D, например, вы можете изменить первый # 40 на # 45. - person Ari; 22.04.2014
comment
А, забыл еще проверить на стабильность по краю часов, именно так и было. Я модифицировал свою задержку, чтобы D был стабильным и все работало правильно. Спасибо! - person nslogan; 22.04.2014