2007年2月18日日曜日

System on Chip

А.Алтанбилэг (Тоокёогийн Их Сургууль)

Миний судалгааны үндсэн чиглэл бол VLSI (Very Large Scale Integration) Design, VLSI CAD (Computer Aided Design) бөгөөд энэ чиглэлд сүүлийн үед нэвтэрч эхэлж байгаа технологи болох SoC (System on Chip)-ийн талаар танилцуулъя.

Өнгөрсөн хэдэн арван жилд LSI-д (Large Scale Integration үгийн товчлол. Чип гэж нэрлэх явдал бий.) байрлуулах боломжтой хагас дамжуулагч транзисторийн тоо Мoore-ийн хуулийн дагуу жилд 58 %-иар өсөж байна. Үүний үр дүнд computer, гар утас, DVD тоглуулагч, Digital camera-г бид өдөр тутамдаа хэрэглэх боломжтой болсон. Гэвч Pentium гэх мэтийн микропроцессорт агуулагдах транзисторийн тоог тоолох юм бол жилд 21%-иар л өсч байгааг ажиглаж болно. Чипний үлдсэн зайг санах ой хэлбэрээр ихэнхдээ ашиглаж байна. Энэ нь LSI Designer- ийн design хийх чадвар жилд 21%-иар л өсч байгаагаас шалтгаална.

Энэ асуудлыг шийдэх арга замын нэг нь систем түвшинд LSI Design хийх явдал юм. Юуны түрүүнд систем түвшний LSI Design гэж юу вэ гэдэг талаар танилцуулъя. Нэг LSI-д агуулах боломжтой транзисторийн тоо 100 саяыг хэдийн давж тэрбум руу дөхөж байна.

Үүний үр дүнд өмнө нь нэг боард-нд суулган холбож байсан CPU, memory болон бусад device-уудийг нэг LSI-д багтааж чадахаар болсон билээ. Системийг бүхэлд нь нэг чип-д багтаасан System on chip гэсэн хэллэг мөн энэ үеэс эхэлсэн. System on chip-ийг design хийхэд түүнийг бүрэлдүүлэх hardware болон түүний дээр ажиллах software-г ч гэсэн бодолцох хэрэгтэй. Энэхүү HW/SW-г цугт нь design хийх аргыг HW/SW co-design гэдэг. Систем түвшний design гэдэг нь HW/SW co-design аргаар design хийхийг хэлдэг.

Систем түвшний design хийхэд тухайн design-ийг илэрхийлэх систем түвшний хэл хэрэгтэй. SpecC, SystemC зэрэг хэлнүүд систем түвшний дизайн хийхэд хэрэглэгдэж байна. Эдгээр хэлнүүдтэй танилцахын өмнө hardware design-ий түүхийг сөхөж үзье.

IC design хийж эхэлсэн 60-70 онд транзисторийн байрлал холболтыг шууд зурах замаар design хийж байсан. 70-80 онд AND, OR гэх мэтийн логик gate-үүдийг байрлуулах замаар design хийх түвшинд хүрч, удалгүй логик тэгшитгэлүүдийг бичих замаар design хийх болсон. Энэ үед одоо олны танил болсон Cadence, Synopsis, Mentor компаниуд CAD програмуудаа гаргаж эхэлсэн. 80-90 онд HDL (Hardware Description Language) болох Verilog, VHDL гэх мэтийн программчлалын хэлтэй төстэй хэлнүүд дээр design хийгдэж эхэлсэн. 90-ээд оны сүүлээс hardware design-ий хэлбэр илүү абстракт түвшинд гарч C-маягийн хэлнүүд дээр design хийгддэг болоод байна.

Hardware design-ий түүхийг харвал software-ийн хөгжилтэй төстэй болохыг ажиглана. Програмистууд анх машины хэл дээр программ бичиж эхэлсэн ба тэр нь хөгжсөөр ассемблер хэл эцэст нь илүү өндөр түвшний хэлнүүд C гэх мэт дээр бичдэг болсон. Систем түвшний хэл нь HW/SW-ийг илэрхийлж чадах учир дараагийн түвшний хэл гэж ойлгож болно. Систем түвшний хэлнүүд нь судалгааны төвүүд, их сургуулиуд дээр голчлон судлагдаж байгаа бөгөөд ойрын 10 жилд үйлдвэрлэлд нэвтрэх төлөвтэй байна.

Эцэст нь SpecC хэлний тухай бага зэрэг танилцуулъя. SpecC хэл нь ANSI-C хэлийг өргөтгөж behavior, channel, interface зэрэг бүтцийг нэмж бүтээсэн хэл юм. Түүнээс гадна систем түвшний хэлд зайлшгүй шаардлагатай шаталсан бүтэц, параллель ажиллагаа, мэдээлэл солилцоо, синхрончлол, төлөвийн шилжилт, хугацааны ойлголтыг нэмж өгсөн. SpecC хэл нь анх University of California, Irvine дээр бүтээгдсэн бөгөөд одоогоор дэлхийн олон оронд судлагдаж байна. University of California, Irvine болон SpecC Technology Consortsium зэргээс энэ хэлний тухай өргөн мэдлэгийг олох боломжтой.

SpecC хэлний үндсэн бүтэц:

interface L { void Write(int x); };

interface R { int Read (void); };

channel C implements L,R

{

int Data; bool Valid;

void Write(int x)

{ Data=x; Valid=true; }

int Read(void)

{ while(! Valid) waitfor(10);return(Data); }

};

behavior B1(in int p1, L p2, in int p3)

{ void main(void)

{ /* ... */ p2.Write(p1); }

};

behavior B2(out int p1, R p2, out int p3)

{ void main(void)

{ /*...*/ p3=p2.Read(); }

};

behavior B(in int p1, out int p2)

{ int c1; C c2;

B1 b1(p1, c2, c1);

B2 b2(c1, c2, p2);

void main(void)

{ par { b1.main(); b2.main(); } }

};