2015-01-07 2 views
-3

SLV_DCR_TIMEOUT_WAIT - это значение, запрограммированное в регистре, поэтому оно не является постоянным значением. Как я могу использовать то же самое в утверждении.Ошибка проверки системы: Неверное использование непостоянного выражения

assign DCR_CLK = testbench.sw_top_inst.DUT.megatron_x.megatron_cib.dcr_slave_cfg.DCR_clk; 
assign DCR_TIMEOUT_WAIT = testbench.sw_top_inst.DUT.megatron_x.megatron_cib.dcr_slave_cfg.dcr_timeout_wait[15:0]; 
assign SLV_DCR_TIMEOUT_WAIT = testbench.sw_top_inst.DUT.megatron_x.megatron_cib.dcr_slave_cfg.Sl_dcrTimeoutWait; 
assign SCRUB_INIT = testbench.sw_top_inst.DUT.megatron_x.megatron_cib.dcr_slave_cfg.scrub_init; 

// end 

//=================ASSERTION TO CHECK SLV_DCR_TIMEOUT_WAIT============================// 
property slv_dcr_timeout_wait; 
    @(posedge DCR_CLK) disable iff (!DCR_TIMEOUT_WAIT) 
     $rose(SCRUB_INIT) |-> $rose(SLV_DCR_TIMEOUT_WAIT) ##(DCR_TIMEOUT_WAIT) $fell(SLV_DCR_TIMEOUT_WAIT); 
endproperty: slv_dcr_timeout_wait 

assert property (slv_dcr_timeout_wait); 

Сообщение об ошибке:

error- [SVA-INCE] Незаконное использование непостоянной экспрессии
/БИС/конструкций/rsd_megatron/команда/Singhs/Мегатрон/SIM/TestBench/mss_tb /interfaces/mss_internal_signal_if.sv, 41
mss_internal_signal_if, «DCR_TIMEOUT_WAIT»

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

+2

Пожалуйста, отформатируйте свой вопрос и не ВСЕ ПРИВОДИТЕ ваш заголовок. – Raptor

ответ

1

Как вы заметили, проблема связана с ##(DCR_TIMEOUT_WAIT), SystemVerilog хочет, чтобы она была постоянной. Я использую локальные счетчики переменных, чтобы обойти это. См IEEE Std 1800-2012 § 16,10 Локальные переменные

с помощью локальных переменных создать общие проверки последовательности импульсов:

sequence pulse_seq(local logic sig, local int limit); 
    int cnt = limit; 
    $rose(sig) ##0 (sig && cnt>0, cnt--)[*] ##1 ($fell(sig) && cnt==0); 
endsequence 

Затем подключите его к утверждению:

property slv_dcr_timeout_wait; 
    @(posedge DCR_CLK) 
    $rose(SCRUB_INIT) && (DCR_TIMEOUT_WAIT>0) |-> 
    pulse_seq(SLV_DCR_TIMEOUT_WAIT,DCR_TIMEOUT_WAIT); 
endproperty : slv_dcr_timeout_wait 

assert property (slv_dcr_timeout_wait); 

Следует заметить, что я удалил disable iff (!DCR_TIMEOUT_WAIT) и к триггеру я изменил условие триггера на $rose(SCRUB_INIT) && (DCR_TIMEOUT_WAIT>0). Отключить - это асинхронное действие, которое должно использоваться для отмены последовательности, которая уже была запущена.

Доказательство концепции here (Примечание:. Riviera-PRO EDU 2014,10 не отображается должным образом поддерживать sequence списков портов, чтобы мне пришлось трудными закодированные сигналы должны работать в любом полном симуляторе, который поддерживает стандарт IEEE Std 1800-2005 или больше)