Ошибка подтверждения SystemVerilog: незаконное использование неконстантного выражения
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);
Сообщение об ошибке:
Ошибка-[SVA-INCE] Незаконное использование непостоянного выражения
/lsi/designs/rsd_megatron/team/singhs/megatron/sim/testbench/mss_tb/interfaces/mss_internal_signal_if.sv, 41
mss_internal_signal_if, "DCR_TIMEOUT_WAIT"
Использование непостоянного выражения недопустимо в свойствах, последовательностях и утверждениях для таких случаев, как интервалы задержки и повторения.
Пожалуйста, замените оскорбительное выражение константой времени разработки.
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)
, Disable является асинхронным действием и должно использоваться для отмены уже запущенной последовательности.
Подтверждение концепции здесь (Примечание: Riviera-PRO EDU 2014.10 не поддерживает должным образом sequence
Списки портов, чтобы мне пришлось жестко закодировать сигналы. Должен работать в любом полном симуляторе, который поддерживает стандарт IEEE Std 1800-2005 или выше)