Альтернатива поиску по упакованному+распакованному массиву в systemverilog

У меня есть эта странная ситуация, когда я сейчас делаю это:

if (!this.randomize(delay) with {delay inside {strm};}) 
......

куда

rand bit [2:0] delay;
bit [15:0] strm [bit [15:0]];

Теперь я хочу, чтобы эта задержка шла по кругу от 0->....->7->0 и так далее, но она должна удовлетворять условию, что она должна присутствовать в strm. Поэтому я хочу что-то вроде

while (delay not in strm) begin
delay+=1;
end 

Помимо просмотра каждого индекса (2 ^ 16-1), есть ли другой способ узнать, существует ли он в этом упакованном + неупакованном массиве? Заранее спасибо!


person silentNinJa    schedule 10.05.2012    source источник
comment
если вы уже нашли решение, опубликуйте его как самостоятельный ответ. Если опубликованный ответ помог вам сделать это правильно, проголосуйте за него или дайте хотя бы отзыв о вопросе dwikle, размещенном внутри его ответа.   -  person ZF007    schedule 05.03.2018


Ответы (1)


Если вы не знаете, вы объявляете strm как ассоциативный массив (он же хеш), где ключ и данные являются 16-битными значениями.

Если вы хотите, чтобы strm был массивом 2^16 записей фиксированного размера из 16-битных значений, объявление будет таким:

bit[15:0] strm [2**16];

С ассоциативными массивами вы можете использовать array.exists(key), чтобы определить, находится ли ключ в массиве. Но, похоже, это может быть не то, что вы пытаетесь сделать.

С распакованными массивами вы можете использовать оператор inside для проверки членства в наборе. Но моему симулятору (Incisive) не нравится такое использование вне вызова рандомизации. Так что, возможно, вам придется искать его самостоятельно. Однако вам не нужно перебирать весь массив, если вы сначала отсортируете его. И вы можете сделать это с помощью array.sort().

Я также хотел бы указать, что вы ищете 3-битное значение в каком-то массиве 16-битных значений. Это на самом деле не имеет смысла, поэтому вы можете уточнить свой вопрос.

person dwikle    schedule 11.05.2012