Ошибка подтверждения 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 или выше)

Другие вопросы по тегам