В качестве альтернативы ...
недвижимости/последовательности, хотя они кажутся небольшим кодом, в этом случае для каждого REQ (который до сих пор не получил RSP) отдельный процесс со своим собственным счетчиком раздвоенным. Это приводит к тому, что многие счетчики выполняют очень схожую работу. В случае, если в полете много (и/или многих экземпляров свойства или последовательности), он начнет добавлять в симуляцию во время выполнения [хотя это всего лишь небольшой блок кода]
так что другой подход держите триггер проще, и мы стараемся, чтобы обработка была линейной.
int counter=0; // you can use a larger variablesize to avoid the roll-over issue
int arr1[int] ; // can use array[MAX_SIZE] if you know the max request id is small
always @(posedge clk) counter <= counter + 1 ; // simple counter
function int latency (int type_set_get , int a) ;
if (type_set_get == 0) arr1[a] = counter; // set
//DEBUG $display(" req id %d latency %d",a,counter-arr1[a]);
// for roll-over - if (arr1[a] > counter) return (MAX_VAL_SIZE - arr1[a] + counter) ;
return (counter - arr1[a]); //return the difference between captured clock and current clock .
endfunction
property ps();
@(posedge clk)
disable iff (~rst)
##[0:$]((req,latency(0,req_id)) or (rsp,cg_inst.sample(latency(1,rsp_id))));
endproperty
assert property (ps);
выше свойство срабатывает только тогда, когда REQ/RSP видно и только один поток активен ищет его. При необходимости в функцию могут быть добавлены дополнительные проверки, но для подсчета латентности это должно быть хорошо.
Анекдот:
Mentor AE - Дэн обнаружил утверждение, которое было замедляя наши моделирования на целых 40%. Плохо написанное утверждение было частью нашего блока tb, и его эффекты остались незамеченными там, так как наш тест уровня блока, время выполнения было ограничено.Затем он пробирался в наш верхний уровень tb, что приводило к невыносимым потерям во время выполнения, пока он не был обнаружен через год :). [предположим, что мы должны были профилировать наши симуляции раньше)
Скажем, например, если вышеприведенный протокол реализовал прерывание позднее, то поток req-rsp будет продолжать обрабатывать и ждать (до окончания моделирования) для прерванная транзакция, хотя она не повлияет на функциональность, она будет скрытно продолжать обрабатывать ресурсы процессора, ничего не делая ничего полезного взамен. Пока, наконец, продавец AE не заберет день :)
** Не работает ** означает что? Ошибка компилятора? нет покрытия? Пожалуйста, предоставьте тестовый файл. –
Извините. Я хочу знать, правильно ли это было? Будет ли это покрывать мою латентность? – user1978273