Verilog: время последовательного блока

Почему время для всех инструкций в последовательном блоке (непараллельном) одинаковое?

i.e.

module abc;
     reg [31:0] r;

     initial
          begin
               r = 0;
               $display($time, " ", r);
               r = 1;
               $display($time, " ", r);
               r = r + 2;
               $display($time, " ", r);
               $finish;
          end
endmodule 

Выход:

               0          x
               0          0
               0          2

person NoName    schedule 19.06.2017    source источник


Ответы (2)


Описание оборудования Verilog состоит из процедурных блоков. Эти блоки выполняются псевдопараллельно друг относительно друга. Код внутри каждого блока моделируется последовательно в одном временном интервале.

такими процедурными блоками являются все блоки «всегда», начальный блок и последний блок. Вы тестируете начальный блок. Он особенный и выполняется, как следует из названия, в самом начале симуляции. Все операторы последовательно и в момент времени «0».

для блоков always время будет отличным от нуля, но все равно одинаковым для всех инструкций в одном блоке.

Если вы хотите увидеть разницу во времени в начальном блоке, вам нужно добавить задержки, т.е.

initial
      begin
           r = 0;
           $display($time, " ", r);
           #1 
           r = 1;
           $display($time, " ", r);
           #1 
           r = r + 2;
           $display($time, " ", r);
           $finish;
      end

в приведенном выше примере я добавил две задержки на 1 цикл. В вашем случае вы должны увидеть, как время увеличивается. Тем не менее, все инструкции выполняются последовательно, задержка просто останавливает выполнение на один цикл.

Чтобы увидеть параллельное поведение, вам понадобится реальное описание оборудования с всегда блоками, и вам нужно смоделировать его для нескольких циклов. Затем вы можете заметить, что порядок печати между разными блоками always будет различаться в зависимости от состояния моделирования. Однако даже в этом случае симулятор завершит симуляцию для всех блоков за время «a», прежде чем он начнет симуляцию для других блоков за время «b».

person Serge    schedule 20.06.2017
comment
... моделируются последовательно в одном и том же временном интервале. Имеет смысл. Мне было интересно, почему у нас есть блок fork-join, если кажется, что begin-end уже работает параллельно. - person NoName; 20.06.2017
comment
# 1 в этом случае останавливает последовательное выполнение операторов на 1 цикл. Все операторы после него будут выполнены в следующем цикле. $ time по умолчанию возвращает количество выполненных циклов. - person Serge; 20.06.2017

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

«время» относится не к реальному миру, в котором работает симулятор, а к смоделированному миру внутри симулятора. Грубо говоря, время в симулированном мире движется вперед только тогда, когда в текущий момент времени нечего делать.

person plugwash    schedule 19.06.2017
comment
Интересно, это объясняет, почему последовательный блок кода не отражается в его единице времени. - person NoName; 20.06.2017