Цитата(acex2 @ Jul 20 2006, 20:57)

Ничего сложного в BILBO нет - это классическая регулярная DFT структура, которая может работать в 4 режимах:
- параллельного регистра
- сдвигового регистра
- генератора псевдослучайных последовательностей (LFSR)
- многоканального сигнатурного анализатора (MISR)
Выбор режима задается двумя битами. Работает все это примерно так: в штатном режиме BILBO используется как обычный параллельный регистр в схеме. Когда нужно провести тестирование, BILBO на входе (перед тестирумой подсхемой) переключается в режим LFSR, BILBO на выходе переключается в режим MISR. Во входную BILBO загоняется начальное значение генератора (путем его временного переключения в режим сдвигового регистра), прогоняется определенное число тактов, потом полученная сигнатура с выходного BILBO выводится наружу или в модуль BIST для проверки путем переключения в режим сдвигового регистра.
спасибо за сообщение. действительно теперь ясно. штука довольно интересная.
переложил на верилог модуль из ссылки-примера.
но есть две непонятки:
строчка в которой LFSR - непонятная вовсе конструкция (1й раз вижу в классическом LFSR XOR с тремя разными сигналами):
Код
aux = {aux[1] ^ flip_flops[0] ^ z[1], aux[0] ^ z[2], flip_flops[3] ^ z[3]};
непойму - зачем в реж.MISR XORить вдвигаемый разряд?!
Код
2'b01: flip_flops <= {flip_flops[2:0],aux[2] ^ z[0]}; // MISR mode
Цитата(acex2 @ Jul 20 2006, 20:57)

В теории примерно так. За счет того, что структура может выполнять все 4 основные операции, экономится место на кристалле.
да, действительно, поигрался с вышеприведенным примером - довольно компактно (и по трассам тоже - загрузка/выгрузка по последовательному интервейсу -одна линия сюда - одна обратно)
//============================================================
код полностью:
Код
// bilbo.v
module bilbo_test(
input rst,
input clk,
input scan_in,
output scan_out, // inout
input [1:0] b,
input [3:0] z,
output [3:0] q);
reg [3:0] flip_flops;
wire [2:0] aux;
always @ (posedge clk or negedge rst)
if (!rst)
flip_flops <= 0;
else //if (ce)
case(b) // synopsys full_case parallel_case
2'b00: flip_flops <= {flip_flops[2:0],scan_in}; // SHIFT mode
2'b01: flip_flops <= {flip_flops[2:0],aux[2] ^ z[0]}; // MISR mode
2'b10: flip_flops <= 4'b0000; // RESET mode
2'b11: flip_flops <= z; // PARALLEL LOAD mode
endcase
assign q = flip_flops;
assign q = flip_flops;
assign scan_out = flip_flops[3];
assign aux = {aux[1] ^ flip_flops[0] ^ z[1], aux[0] ^ z[2], flip_flops[3] ^ z[3]};
endmodule
Сообщение отредактировал Doka - Jul 25 2006, 21:37