2015-06-03 1 views
2

Сценарий: Сигнал active может быть либо 1 цикл, 2 цикла, 3 цикла или 4 цикла в ширину в зависимости от config[1:0] входа в модульКак писать импульса ширина SystemVerilog утверждение, когда ширина настраивается

Самый простой способ напишите, что это:

property p_PropA; 
    @(posedge clk) $rose active ##config ~active; 
endproperty 

Но это синтаксически неправильно. Каков правильный способ написания этого утверждения?

ответ

2

Вы должны использовать локальную переменную, см IEEE Std 1800-2012 § 16,10 Локальные переменные

Вот простой пример:

property p_PropA; 
    int count; 
    @(posedge clk) 
    ($rose(active),count=config) |-> 
    (active,count--)[*] ##1 (~active && count==0); 
endproperty 
+0

Спасибо, Как [\ *] используется? Насколько я понимаю, [\ *] означает seq [* 0] или seq [* 1: $]. Это будет уменьшаться каждый цикл до тех пор, пока актив не будет истинным. Но тогда активный может отключить 6 часов позже, и счет будет отрицательным, который не будет выполнен с ошибкой count == 0. Это верно? И мне нужно будет убедиться, что моя симуляция не закончится до тех пор, пока последняя активность не будет отменена. – wisemonkey

+0

'seq [*]' равнозначен 'seq [* 0: $]' (см. 16.9.2 в [lrm] (http://standards.ieee.org/getieee/1800/download/1800-2012. PDF)). Да, счетчик может пойти отрицательно. Чтобы длительный импульс дал сообщения об ошибках раньше, вы можете использовать: '(active && count> 0, count -) [*] ## 1 (~ active && count == 0)'. Вы можете закодировать его и другими способами (мой пример), но все они потребуют локальных переменных. – Greg

+0

Спасибо за объяснение :) – wisemonkey

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