2013-06-14 3 views
-1

Из testbench мне нужно испортить дизайн шины. Я использую случайную переменную, чтобы выбрать немного места (bit_sel), заставляя бит в проводной системе verilog

bit_sel = $urandom_range(0,MAX_LENGTH-1); 

автобус находится где-то глубоко внутри RTL шириной MAXLENGTH.

wire [MAX_LENGTH-1:0] BUS_TO_BE_FORCED; 

В TB я использую следующую строку, чтобы повредить шину.

force TOP.DUT.....BUS_TO_BE_FORCED[bit_sel] = ~TOP.DUT.....BUS_TO_BE_FORCED[bit_sel]; 

Но я получаю ошибку компиляции. Каков наилучший способ сделать это. Я хочу перевернуть только один бит.

ответ

1

LHS должен быть постоянным бит-выбор векторной сети (между прочим). Так,

force TOP.DUT.....BUS_TO_BE_FORCED[0]

нормально, но

force TOP.DUT.....BUS_TO_BE_FORCED[bit_sel]

нет. Вы можете попробовать большое заявление случая, потому что селекторы не должны быть постоянными:

case(bit_sel) 
0: force TOP.DUT.....BUS_TO_BE_FORCED[0] = ... 
...etc 
+0

я думал то же самое, но мой MAX_LENGTH находится в 100-х и у меня есть несколько автобусов, как это. Я попробовал сгенерировать оператор. Но генерация не работает внутри процедурного блока. – user2268152

0

EDIT: первоначального ответ содержал мои догадки, наряду с совершенно неверной информацией. Я не должен был отвечать на этот вопрос в первую очередь, поэтому мне пришлось написать тестовые скамейки и подтвердить следующие утверждения, чтобы компенсировать беспорядок.

1) Выбор бита должен быть постоянным (во время компиляции). Даже следующий код (вполне разумно на мой взгляд) не будет проходить разработка:

integer bit_sel; 
initial begin 
    bit_sel = 0; 
    force BUS_TO_BE_FORCED[bit_sel] = 1'b1; 
end 

2) Если используется внутри "первоначального" блока, следующее утверждение прекрасно:

force BUS_TO_BE_FORCED[SOME_PARAM] = ~BUS_TO_BE_FORCED[some_index]; 
  • SOME_PARAM является параметром
  • some_index может быть переменной или чистый
  • SOME_PARAM = some_index

Однако одно и то же утверждение внутри блока «всегда» заставляет симуляцию висеть. Эта проблема может быть решена путем добавления задержки:

#1 force BUS_TO_BE_FORCED[SOME_PARAM] = ~BUS_TO_BE_FORCED[some_index]; 

3) Ответ Эрик является очень элегантный способ обойти ограничения языка, но также и с учетом ограничений, описанных выше в разделе 2 - вы должны добавить задержка, если вы хотите использовать его в блоке «всегда».

+1

Значение, используемое инструкцией force, оценивается только один раз, но непрерывно управляется.В отличие от '$ deposit', который однажды выпадает на Wire/Reg. «Force» используется в начальном или всегда блоке и соответствует стандартным правилам процедурной оценки (think regs или присваивание на непараллельном языке). – Morgan

+0

@morgan Спасибо за объяснение. – Vasiliy

+0

Я вижу, что в своем ответе я сделал очень неправильное утверждение. Исправление. – Vasiliy

2

Вы могли бы вместо того, чтобы перевернуть биты с помощью XOR маски:

wire [MAX_LENGTH-1:0] corrupt_bits = 1 << $urandom_range(0,MAX_LENGTH-1); 

force BUS_TO_BE_FORCED = corrupt_bits^BUS_TO_BE_FORCED; 
+0

Это не работает для меня. заявление о силе является частью какого-либо процессуального права блока. – user2268152