Порядок исполнения Verilog - PullRequest
3 голосов
/ 31 марта 2012

Я только начинаю изучать Verilog самостоятельно после прохождения курса по VHDL.У меня проблемы с пониманием порядка выполнения поведенческих утверждений.Вот код, о котором идет речь.

//This files is an experiment into the order in which verilog executes it's statements

module MainCircuit(clk, start);

    parameter cycles = 8;
    input clk;
    input start;
    //input [15:0] data;

    integer i;

    always @(posedge clk)
    begin
        if(start)
        begin
            i=0;

            repeat(cycles)
            begin
                @(posedge clk) $display("%d\ti = %d", $time, i);
                i = i + 1;
            end
        end
    end

endmodule

module tester;

    reg clk;
    wire start;

    assign start = 1'b1;
    initial clk = 1'b0;

    MainCircuit myMain(clk, start);
    initial repeat(40)
    begin
        #5 clk = 1'b1;
        #5 clk = 1'b0;
    end

endmodule

, а вот вывод

                  15    i =           0
                  25    i =           1
                  35    i =           2
                  45    i =           3
                  55    i =           4
                  65    i =           5
                  75    i =           6
                  85    i =           7
                 105    i =           0
                 115    i =           1
                 125    i =           2
                 135    i =           3
                 145    i =           4
                 155    i =           5
                 165    i =           6
                 175    i =           7
                 195    i =           0
                 205    i =           1
                 215    i =           2
                 225    i =           3
                 235    i =           4
                 245    i =           5
                 255    i =           6
                 265    i =           7
                 285    i =           0
                 295    i =           1
                 305    i =           2
                 315    i =           3
                 325    i =           4
                 335    i =           5
                 345    i =           6
                 355    i =           7
                 375    i =           0
                 385    i =           1
                 395    i =           2

Я не понимаю, почему меня не сбрасывают в ноль при каждом положительном фронте тактового сигнала.Помнит ли myMain, где он находится, и продолжает ли он каждый раз при вызове часов?Если так, то где это останавливается?И как все это будет синтезировано?

Два других второстепенных вопроса:

Я пытался написать start <= 1'b01;вместо присвоения start = 1'b01;во втором модуле, но это не сработает.Почему бы и нет? </p>

во-вторых, что странного пробела в выводе?

Спасибо за потраченное время.

1 Ответ

4 голосов
/ 31 марта 2012
  1. always @(posedge clk) не выполняется автоматически на каждом фронте такта. Блок Always может быть перезапущен только по достижении конца текущего выполнения (вы не можете одновременно иметь два потока, выполняющих блок). Ваш блок всегда не достигает end до 8 часов, потому что он застрял в цикле (повторяющихся циклов). Только после 8 часовых этапов он может завершить цикл, достичь конца блока всегда, а затем перезапустить следующий этап.

  2. start <= 1'b1 является неблокирующим назначением и может быть выполнено только внутри всегда блока.

  3. $ display, вероятно, резервирует достаточно места для печати максимального значения 32-разрядного десятичного числа. Если вам не нужны все лишние пробелы, попробуйте %0d вместо %d.

...