2015-11-11 7 views
0

Я новичок в verilog, и я понимаю, что это не последовательный язык. Итак, я хотел спросить, есть ли способ показать результаты в модуле после некоторого выполнения? Потому что отображение всегда должно быть внутри блока initial, и поэтому я не могу использовать отображение для целей отладки. Вот пример код, который может лучше объяснить мой проблемныйИспользование дисплея в verilog

module A(a,b,c); 
    input a,b; 
    output c; 

    assign c=a&b; 

    initial 
     $display("%b",c); 
endmodule 

module testbench11; 
    reg a,b; 
    wire c; 

    A a1(a,b,c); 

    initial 
     $monitor(,$time,"a=%b,b=%b,c=%b",a,b,c); 

    initial 
     begin 
     #0 a=1'b0;b=1'b0;   
     #3 a=1'b0;b=1'b0; 
     #3 a=1'b0;b=1'b0; 
     end 
endmodule 

Так что я хочу, чтобы отобразить результат c каждый экземпляр времени для того, чтобы проверить ли я получать желаемый результат. Может показаться, что в этом случае результаты отображаются в конце, но в некоторых сложных задачах я хотел использовать display для целей отладки, так же как я использую printf в C. Есть ли способ сделать это в verilog?

+0

В зависимости от того, как вы кодируете модуль, '$ display' может работать или не работать для того, что вы хотите сделать. Ваше текущее использование '$ monitor' обязательно сообщит вам, когда какие-либо из' a', 'b' или' c' (которые связаны с этими сигналами вашего модуля) меняются, что, вероятно, достаточно хорошо. Без лучшего примера точную форму печати лучше всего определить очень сложно. – Unn

ответ

3

Потому что дисплей всегда должен находиться внутри блока initial, поэтому я не могу использовать дисплей для целей отладки.

Я не знаю, где вы получили это от, это так же, как почти все, но assign в том, что он должен быть использован внутри блока, intial или always.

Чтобы использовать его для отладки внутри модуля:

module A(a,b,c); 
    input a,b; 
    output c; 

    assign c = a&b; 

    always @* 
    $display("%b",c); 
endmodule 

Лучше всего, чтобы показать и проверить с верхнего уровня, сохраняя код модуля в чистоте. использовать display в testench вы можете сделать:

Тот же формат, как внутри модуля:

always @* begin 
    $display("%b",c); 
end 

Или знать, что вы показываете после каждого шага стимула:

initial begin 
    #0 a=1'b0;b=1'b0;   
    #1 $display("%b",c); 

    #3 a=1'b0;b=1'b0; 
    #1 $display("%b",c); 

    #3 a=1'b0;b=1'b0; 
    #1 $display("%b",c); 
end 
2

Verilog/SystemVerilog содержит хорошо организованную очередь событий. Все утверждения в каждой метке времени выполняются в соответствии с этой очередью. Ниже приведены некоторые из различных задач системы отображения.

  • $ дисплей выполняется в активной области, так что если есть какое-либо неблокируемое задание (который выполняет в INACTIVE области), это не будет показано на $ дисплея. Это отображает одну выходную линию.

  • $ написать также выполняет в ACTIVE области, но явный вызов символа новой строки (\ п) требуется, чтобы вставить другую линию. Эта системная задача обычно используется, когда вы хотите отображать многомерный массив, используя для цикла. Это похоже на отображение, кроме символа (\ n).

  • $ строб выполняется в MONITOR/ОТЛОЖЕН области, то есть, в конце отметки времени. Следовательно, обновленное значение отображается строкой $.

  • $ monitor отображается каждый раз, когда изменяется один из параметров его отображения. Должен использоваться только один $ monitor для Simulation.Монитор, как следует из названия, постоянно отслеживает сигналы и выполняет, если любое значение значения.

Для вашего кода, для отображения в разных точках, может быть выполнено следующее изменение кода.

initial 
    #5 $display("%b",c); // display after some arbitrary time. 

    initial 
    begin 
    repeat(5) 
    begin 
    wait(c); 
    $display("%b",c); // display after change in c 5 times. 
    end 
    end 

    initial 
    begin 
    forever 
    begin 
    #1; 
    $display("%b",c); // display c at every timestamp 
    end 
    end 

    always @(c) 
    $display("%b",c); // display after any change in c 

    always @(a,b,c) 
    $display("%b",c); // display after any change in a or b or c 

Для отображения при каждом изменении, $ монитор полезно. $ display можно использовать, как указано выше, но это сделает ваш код грязным. Просто помните, что в вашем коде должен быть только один $ monitor. В $ display нет такого предела.

Это лишь некоторые из методов, многие другие доступны. Дополнительную информацию можно найти по адресу: this и this ссылки.

+0

'$ строб' и' $ monitor' находится в области событий ** мониторинга ** в Verilog. IEEE1364-1995 §5.3, IEEE1364-2001 §5.3 и IEEE1364-2005 §11.3. SystemVerilog регион был переименован в ** отложенную область событий **, [IEEE1800-2012] §4.4. ** Неактивная область событий ** для явной задержки '# 0' (цитата в тех же разделах, что и область монитора) – Greg

+0

@ Грег, я сделал ошибку здесь. Просто запутался в ** Неактивном ** и ** Отложенном ** регионе. Я отредактировал свой ответ соответственно. Спасибо за указатели. – sharvil111

Смежные вопросы