[an error occurred while processing this directive]
|
итак. Имеем post place&route модель микроконтроллера, верификация проводится на FPGA Xilinx, САПР ISE 6.3i.
Два основных куска: ядро процессора работающее на частотах до 33 Мгц. и ядро контроллера USB работающего на частотах 48 или 8 Мгц. Внутри кристалла необходимо обеспечить передачу данных между блоками.
Устроено примерно так:
В регистр блока А по частоте блока А записывается данные и взводится флаг. Сигнал флага уходит в блок B и защелкивается в триггере по частоте блока B, после чего защелкивается последовательно еще в двух триггерах В1 и B2. выделяем фронт сигнала по функции ~B2&B1 и при наличии этого сигнала по частоте блока Б из регистра данных блока А переписываем данные в регистр данных блока Б. При этом сигнал ~B2&B1 является ресетом для флага в блоке А. Наличие флага или ~B2&B1 блокирует запись в регистр данных блока А.
Вот, типа вступление.
Теперь проблема. Так как частоты могут иметь практически любое соотношение, то при моделировании возникают моменты когда фронт флага совпадает с фронтом клока блока Б, и при этом в первом триггере блока Б и тригеррах B1 и B2 как минимум на один такт выставляется "X" (из за несоблюдения времени предустоновки) и только после этого "1". Отсекая фронт этого сигнала вместо "1" диной в один период получаем "X" длиной в один период. который соответснвенно потом "разматывает" в X всю схему. Необходимо избавиться от этого Х при передачи флагов, но только в этом месте, так как в других местах появление "X" говорит о неработоспособности.
Что делал.
Ввел вот такую компанентику между первым триггером и B1.
module antix ( I ,O );
input I ;
wire I ;
output O ;
reg Ot ;
assign O = Ot;
always @(I)
case (I)
1'b0 : Ot <= 1'b0;
1'b1 : Ot <= 1'b1;
1'bx : Ot <= 1'b0;
1'bz : Ot <= 1'b0;
endcase
endmodule
Т.е. просто пропускает только 1, все остально 0. После синтеза превращается в просто провод, но с учетм сохранения иерархии в проекте не оптимизируется. После получения временной модели и ее компилации в библиотеки заменяю временную модель блока antix на поведенческую (не синтезированную).
Но!
В момент Мапинга ISE всеже разбирается в структуре и проекта и на вход тригерра B1 подает не выход antix а вход (выход первого триггера) т.е. оптимизирует передачу через antix и X проскочит. Постоянно подправлять нетлист руками желания нет, А хочется сделать железобетонную конструкцию, так как тестированием занимаются другие люди которые будут гонять на временной модели свои тесты и просто говорить мне потом где и когда у них что "упало" или временные ограничения не соблились.
Вот вопрос:
Как сделать красиво и правильно?
E-mail: info@telesys.ru