Шукати в цьому блозі

пʼятниця, 23 грудня 2011 р.

Verilog Netlist Writer.( Part II ) Оптимізація .

В цій публікації я описував, як із проекту який був створений в графічному редакторі MAX+plusII, перевести в Verilog code. Хотів би зазначити, що скориставшись таким типом переводу проекту в код, ми переводимо його в Low Lewel. Тобто розбиваємо проект на базові булеві функції та тригери і регістри. Такий підхід дозволяє з мінімальними знаннями Verilog'у переводити проекти в код який по структурі близький до ASIC проектування. Такий підхід надає певну гнучкість в проектуванні і переводу проекту в інші системи проектування інших виробників як Xilinx, Lattice. Отже для оптимізації роботи над згенерованим кодом в системі   MAX+plusII, я вирішив базові елементи які були згенеровані в коді але не описані як модулі, написати під них модулі. Наші елементи AND1...AND6, OR1...OR5, DELAY, RISEFALL, INV, XOR2:

Пишемо модулі, все дуже просто...
Під описані модулі можна створити файл із розширенням *.v ,  і потім тільки в коді додавти силку на цей файл через include"*.v", а можна прямо в згенерований код додавати описані нижче модулі.

module AND1 (out_AND1,in_AND1) ;
input in_AND1;
output out_AND1;
assign out_AND1 = in_AND1;
endmodule

module AND2 (out_AND2, in1_AND2, in2_AND2) ;
input in1_AND2;
input in2_AND2;
output out_AND2;
and ( out_AND2, in1_AND2, in2_AND2);
endmodule


module AND3 (out_AND3,in1_AND3, in2_AND3, in3_AND3) ;
input in1_AND3, in2_AND3, in3_AND3;
output out_AND3;
and ( out_AND3, in1_AND3, in2_AND3, in3_AND3);
endmodule


module AND4 (out_AND4, in1_AND4, in2_AND4, in3_AND4, in4_AND4) ;
input in1_AND4,in2_AND4, in3_AND4, in4_AND4;
output out_AND4;
and ( out_AND4, in1_AND4, in2_AND4, in3_AND4, in4_AND4);
endmodule


module AND5 (out_AND5,in1_AND5, in2_AND5, in3_AND5, in4_AND5, in5_AND5) ;
input in1_AND5, in2_AND5, in3_AND5, in4_AND5, in5_AND5;
output out_AND5;
and ( out_AND5, in1_AND5, in2_AND5, in3_AND5, in4_AND5, in5_AND5);
endmodule


module AND6 (out_AND6,in1_AND6, in2_AND6, in3_AND6, in4_AND6, in5_AND6, in6_AND6) ;
input in1_AND6,in2_AND6, in3_AND6, in4_AND6, in5_AND6, in6_AND6;
output out_AND6;
and ( out_AND6, in1_AND6, in2_AND6, in3_AND6, in4_AND6, in5_AND6, in6_AND6);
endmodule


module OR1 (out_OR1, in_OR1) ;
input in_OR1;
output out_OR1;
assign out_OR1 = in_OR1;
endmodule


module OR2 (out_OR2, in1_OR2, in2_OR2) ;
input in1_OR2,in2_OR2;
output out_OR2;
or ( out_OR2, in1_OR2, in2_OR2);
endmodule


module OR3 (out_OR3, in1_OR3, in2_OR3, in3_OR3) ;
input in1_OR3, in2_OR3, in3_OR3;
output out_OR3;
or ( out_OR3, in1_OR3, in2_OR3, in3_OR3);
endmodule


module OR4 (out_OR4, in1_OR4, in2_OR4, in3_OR4, in4_OR4) ;
input in1_OR4, in2_OR4, in3_OR4, in4_OR4;
output out_OR4;
or ( out_OR4, in1_OR4, in2_OR4, in3_OR4, in4_OR4);
endmodule


module OR5 (out_OR5, in1_OR5, in2_OR5, in3_OR5, in4_OR5, in5_OR5) ;
input in1_OR5, in2_OR5, in3_OR5, in4_OR5, in5_OR5;
output out_OR5;
or ( out_OR5, in1_OR5, in2_OR5, in3_OR5, in4_OR5, in5_OR5);
endmodule

module INV (out_INV, in_INV) ;
input in_INV;
output out_INV;
not (out_INV, in_INV);
endmodule

module DELAY (out_DELAY, in_DELAY) ;
input in_DELAY;
output out_DELAY;
assign out_DELAY = in_DELAY;
endmodule

module XOR2 (out_XOR2,in1_XOR2, in2_XOR2) ;
input in1_XOR2, in2_XOR2;
output out_XOR2;
xor (out_XOR2, in1_XOR2, in2_XOR2);
endmodule

module RISEFALL (Y,IN1) ;
input IN1;
output Y;
assign Y = IN1;
endmodule 
крім того, стрічки  в коді 
RISEFALL RISEFALL_658 ( Y.(N_816), IN1.(N_809) );
замінити на  
RISEFALL RISEFALL_658 ( (N_816), (N_809) );
за стандартом Verilog  звязок   Y.(N_816) мав би бути записаний, як   N_816.(Y), тобто зв'язок верхнього рівня з'єднується із зв'язком нижнього. 

Код був протестований на ModelSim 6.5b все прекрасно працювало, також пробував зкомпілювати змінений код в   MAX+plusII але тут невдача, компілятор видав помилку що неможе зкомпілювати даний код і порадив звернутися до виробника і вказати код помилки. Думаю що на Квартусі він зкомпілюється без проблем.