2015-09-28 6 views
4

В чем разница между дисплеемпротивстробоскопапротивмонитора в Verilog?дисплей против строба против монитора в verilog?

+8

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

+3

@ dave_59 Одной из причин строгих правил в SO является утверждение о том, что мы создаем базу данных вопросов и ответов. Этот вопрос кажется идеальным для такой базы данных. На самом деле, я просто Googled «строгальный экран verilog» (пытаясь быть справедливым и думая, на что может быть кто-то действительно Google), и Google пригласил меня добавить «монитор», и эта страница заняла второе место. –

+0

@mathew taylor, «Off-Topic» не имеет ничего общего с вопросом, является ли вопрос хорошим, плохим или идеальным. Это вопрос о том, подходит ли тема вопроса к сфере охвата сообщества, в которое он был помещен. –

ответ

9

Я буду красив и суммирую LRM (Справочное руководство по языку), но вы должны прочитать его. Все в IEEE Std 1800-2012 § 21,2 системы отображения задач (Технически SystemVerilog, но эти функции идентичны.)

  • $display: печатать непосредственные значения
    • § 21.2.1 Дисплей и писать задачи
  • $strobe: распечатать значения в конце текущего временного интервала
    • § 21.2.2 стробируется мониторинг
  • $monitor: печать значения в конце текущего временного шага, если какие-либо ценности изменились. $monitor можно вызвать только один раз; последовательный вызов будет отменять предыдущий.
    • § 21.2.3 Непрерывный мониторинг
  • $write: такой же, как $display, но не прекращается с новой строки (\n)
    • § 21.2.1 Дисплей и записи задач

Пример:

reg [3:0] a,b; 
integer i; 
initial begin 
    $monitor("monitor a:%h b:%h @ %0t", a, b, $time); 
    for(i=0; i<4; i=i+1) begin 
    $strobe("strobe a:%h b:%h @ %0t", a, b, $time); 
    $display("display a:%h b:%h @ %0t", a, b, $time); 
    case(i) 
     0 : a = 4; 
     1 : b = 1; 
     2 : begin end // do nothing 
     3 : {a,b} = 9; 
    endcase 
    $display("display a:%h b:%h @ %0t", a, b, $time); 
    #1; 
    end 
end 

Выходы: (обратите внимание на порядок печати и, что монитор не отображается в момент времени 2)

дисплея a: xb: x @ 0
дисплей a: 4 b: x @ 0
монитор а: 4 б: х @ 0
строб A: 4 B: X @ 0
дисплея: с 4 Ь: х @ 1
дисплея: 4 б: 1 @ 1
монитора A: 4 B: 1 @ 1
строб A: 4 B: 1 @ 1
дисплей: 4 б: 1 @ 2
дисплей: 4 б: 1 @ 2
строб A: 4 B: 1 @ 2
дисплея : 4 б: 1 @ 3
дисплеем: 0 B: 9 @ 3
монитора A: 0 B: 9 @ 3
строб A: 0 B: 9 @ 3

+0

Связанный документ больше недоступен. Я считаю, что теперь это можно получить из: http://ieeexplore.ieee.org/servlet/opac?punumber=6469138 – icktoofay

+0

@icktoofay, похоже, что IEEE изменил путь ссылки. Я обновил его до https://standards.ieee.org/findstds/standard/1800-2012.html – Greg

1

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

  • $ дисплея выполняется в активной области, так что если есть какое-либо неблокируемое задание (который выполняет в INACTIVE области), это не будет показано на $ дисплея.
  • $ write также выполняется в ACTIVE region, но для ввода другой строки требуется явный вызов символа новой строки (\ n). Эта системная задача обычно используется, когда вы хотите отображать многомерный массив, используя для цикла.
  • $ строб выполняется в MONITOR/POSTPONE регион, то есть в конце времени печать. Следовательно, обновленное значение отображается строкой $.
  • $ монитор отображается каждый раз, когда изменяется один из параметров его отображения. Должен использоваться только один $ monitor для Simulation.

Посмотрите на это изображение: VERILOG EVENT REGIONS

Пример кода доступна по адресу: Display/Strobe/Monitor

Надежда этот код становится ясно.

+1

Я думаю, что $ strbe и $ monitor выполняются в области _postponed_. –

+0

@Matthew Taylor. Спасибо за указатели. Я отредактировал ответ. – sharvil111