Giáo trình Ngôn ngữ mô tả phần cứng Verilog - Vũ Đức Lung

pdf 303 trang cucquyet12 5300
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Ngôn ngữ mô tả phần cứng Verilog - Vũ Đức Lung", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_ngon_ngu_mo_ta_phan_cung_verilog_vu_duc_lung.pdf

Nội dung text: Giáo trình Ngôn ngữ mô tả phần cứng Verilog - Vũ Đức Lung

  1. ĐẠI H ỌC QU ỐC GIA THÀNH PH Ố H Ồ CHÍ MINH TR ƯỜNG ĐẠ I H ỌC CÔNG NGH Ệ THÔNG TIN oOo Giáo trình NGÔN NGỮ MÔ T Ả PHẦN CỨNG VERILOG Biên so ạn: TS. V ũ Đứ c Lung ThS. Lâm Đức Kh ải Ks. Phan Đình Duy 2012
  2. Lời nói đầu Ngày nay, khi m ạch thi ết k ế v ới hàng tri ệu c ổng logic được tích h ợp trong m ột con Chip thì vi ệc thi ết k ế m ạch và đi dây k ết n ối b ằng tay tr ở nên bất kh ả thi, chính t ừ lí do đó m ột khái ni ệm ngôn ng ữ có m ức độ tr ừu t ượng cao dùng để mô t ả thi ết k ế ph ần c ứng được ra đờ i, đó chính là Verilog. Cùng v ới s ự ra đờ i c ủa ngôn ng ữ mô t ả ph ần c ứng Verilog là hàng lo ạt các công c ụ EDA (Electronic Design Automation) và CAD (Computer Aided Design) đã giúp cho nh ững k ĩ s ư thi ết k ế ph ần c ứng t ạo nên nh ững con Chip có độ tích h ợp r ất cao, t ốc độ siêu vi ệt và ch ức n ăng đa d ạng. Giáo trình Ngôn ng ữ mô t ả ph ần c ứng Verilog nh ằm giúp sinh viên trang b ị ki ến th ức v ề thi ết k ế vi m ạch. Giáo trình t ập trung vào m ảng thi ết kế các m ạch s ố v ới m ạch t ổ h ợp và m ạch tu ần t ự. Giáo trình c ũng gi ới thi ệu về các b ước c ần th ực hi ện trong quá trình thi ết k ế vi m ạch t ừ vi ệc mô t ả thi ết k ế, ki ểm tra, phân tích cho đế n t ổng h ợp ph ần c ứng c ủa thi ết k ế. Giáo trình Ngôn ng ữ mô t ả ph ần c ứng Verilog dùng cho sinh viên chuyên ngành K ĩ thu ật máy tính và sinh viên các kh ối điện t ử. Để ti ếp nh ận ki ến th ức d ễ dàng, sinh viên c ần trang b ị tr ước ki ến th ức v ề thi ết k ế s ố và hệ th ống s ố. Giáo trình này được biên d ịch và t ổng h ợp t ừ kinh nghi ệm nghiên c ứu gi ảng d ạy của tác gi ả và ba ngu ồn tài li ệu chính: IEEE Standard for Verilog Hardware Description Language, 2006; Verilog Digital System Design, Second Edition, McGraw-Hill; The Complete Verilog Book, Vivek Sagdeo, Sun Micro System, Inc. Nh ằm cung c ấp m ột lu ồng ki ến th ức m ạch l ạc, giáo trình được chia ra làm 9 ch ươ ng: Ch ươ ng 1: Dẫn nh ập thi ết k ế h ệ th ống s ố v ới Verilog. Ch ươ ng này s ẽ gi ới thi ệu l ịch s ử phát tri ển c ủa ngôn ng ữ mô t ả ph ần c ứng Verilog, bên
  3. cạnh đó m ột qui trình thi ết k ế vi m ạch s ử d ụng ngôn ng ữ mô t ả ph ần c ứng Verilog c ũng được trình bày c ụ th ể ở đây. Ch ươ ng 2: Trình bày các t ừ khóa được s ử d ụng trong môi tr ường mô t ả thi ết k ế b ởi Verilog. Ch ươ ng 3: Trình bày các lo ại d ữ li ệu được s ử d ụng trong thi ết k ế m ạch bởi Verilog, g ồm hai lo ại d ữ li ệu chính đó là lo ại d ữ li ệu net và lo ại d ữ li ệu bi ến. Ch ươ ng 4: Trình bày các toán t ử c ũng nh ư các d ạng bi ểu th ức được h ỗ tr ợ b ởi Verilog. Ch ươ ng 5: Gi ới thi ệu c ấu trúc c ủa m ột thi ết k ế, ph ươ ng th ức s ử d ụng thi ết k ế con. Ch ươ ng 6: Trình bày ph ươ ng pháp thi ết k ế s ử d ụng mô hình c ấu trúc, trong ph ươ ng th ức này, module thi ết k ế được xây d ựng b ằng cách g ọi các module thi ết k ế nh ỏ h ơn và k ết n ối chúng l ại. Ch ươ ng 7: Trình bày ph ươ ng th ức thi ết k ế s ử d ụng mô hình RTL b ởi phép gán n ối ti ếp và mô hình hành vi s ử d ụng ngôn ng ữ có tính tr ừu t ượng cao t ươ ng t ự nh ư ngôn ng ữ l ập trình. Ph ần thi ết k ế máy tr ạng thái s ử d ụng mô hình hành vi c ũng được nêu ra trong ch ươ ng này. Ch ươ ng 8: Trình bày ph ươ ng pháp thi ết k ế và s ử d ụng tác v ụ và hàm. Ch ươ ng 9: Gi ới thi ệu các ph ươ ng pháp ki ểm tra ch ức n ăng c ủa thi ết k ế. Do th ời gian c ũng nh ư kh ối l ượng trình bày giáo trình không cho phép tác gi ả đi sâu h ơn v ề m ọi khía c ạnh c ủa thi ết k ế vi m ạch nh ư phân tích định th ời, t ổng h ợp ph ần c ứng. Để có được nh ững ki ến th ức này độc gi ả có th ể tham kh ảo trong các tài li ệu tham kh ảo mà giáo trình này đã cung c ấp. Mặc dù nhóm tác gi ả đã c ố g ắng biên so ạn k ỹ l ưỡng tuy nhiên c ũng khó tránh kh ỏi nh ững thi ếu sót. Nhóm tác gi ả mong nh ận được nh ững đóng góp mang tính xây d ựng t ừ quí độ c gi ả nh ằm ch ỉnh s ửa giáo trình hoàn thi ện h ơn.
  4. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog Khi kích th ước và độ ph ức t ạp c ủa h ệ th ống thi ết k ế ngày càng t ăng, nhi ều công c ụ h ỗ tr ợ thi ết k ế trên máy tính (CAD) được s ử d ụng vào quá trình thi ết k ế ph ần c ứng. Th ời kì đầu, nh ững công c ụ mô ph ỏng và t ạo ra ph ần c ứng đã đư a ra phươ ng pháp thi ết k ế, ki ểm tra, phân tích, t ổng h ợp và tự độ ng t ạo ra ph ần c ứng m ột cách ph ức t ạp. S ự phát tri ển không ng ừng của nh ững công c ụ thi ết k ế m ột cách t ự độ ng là do s ự phát tri ển c ủa nh ững ngôn ng ữ mô t ả ph ần c ứng (HDLs) và nh ững ph ươ ng pháp thi ết kế d ựa trên nh ững ngôn ng ữ này. D ựa trên nh ững ngôn ng ữ mô t ả ph ần c ứng (HDLs), nh ững công c ụ CAD trong thi ết k ế h ệ th ống s ố được phát tri ển và được nh ững k ĩ s ư thi ết k ế ph ần c ứng s ử d ụng r ộng rãi. Hi ện t ại, ng ười ta v ẫn đang ti ếp t ục nghiên c ứu để tìm ra nh ững ngôn ng ữ mô t ả ph ần c ứng t ốt hơn. M ột trong nh ững ngôn ng ữ mô t ả ph ần c ứng được s ử d ụng r ộng rãi nh ất đó là ngôn ng ữ Verilog HDL. Do được ch ấp nh ận r ộng rãi trong ngành công nghi ệp thi ết k ế s ố, Verilog đã tr ở thành m ột ki ến th ức được đòi h ỏi ph ải biết đố i v ới nh ững k ĩ s ư c ũng nh ư sinh viên làm vi ệc và h ọc t ập trong lĩnh v ực ph ần c ứng máy tính. Ch ươ ng này sẽ trình bày nh ững công c ụ và môi tr ường làm vi ệc có sẵn t ươ ng thích v ới ngôn ng ữ Verilog mà m ột k ĩ s ư thi ết k ế có th ể s ử d ụng trong qui trình thi ết k ế t ự độ ng c ủa mình để giúp đẩ y nhanh ti ến độ thi ết k ế. Đầu tiên s ẽ trình bày từng b ước v ề thi ết k ế phân c ấp, thi ết k ế m ức cao t ừ vi ệc mô t ả thi ết k ế b ằng ngôn ng ữ Verilog đế n vi ệc t ạo ra ph ần c ứng c ủa thi ết k ế đó. Nh ững qui trình và nh ững t ừ khóa chuyên môn c ũng s ẽ được minh h ọa ở ph ần này. K ế ti ếp sẽ th ảo lu ận nh ững công c ụ CAD hi ện có tươ ng thích v ới Verilog và ch ức n ăng c ủa nó trong môi tr ường thi ết k ế t ự động. Ph ần cu ối cùng c ủa ch ươ ng này s ẽ nói v ề m ột s ố đặ c tính c ủa 1
  5. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog Verilog khi ến nó tr ở thành m ột ngôn ng ữ được nhi ều k ĩ s ư thi ết k ế ph ần cứng l ựa ch ọn. 1.1 Qui trình thi ết k ế s ố Trong thi ết k ế m ột h ệ th ống s ố s ử d ụng môi tr ường thi ết k ế t ự độ ng, qui trình thi ết k ế b ắt đầ u b ằng vi ệc mô t ả thi ết k ế t ại nhi ều m ức độ tr ừu tượng khác nhau và k ết thúc b ằng vi ệc t ạo ra danh sách các linh ki ện c ũng nh ư các đường k ết n ối gi ữa các linh ki ện v ới nhau (netlist) cho m ột m ạch tích h ợp v ới ứng d ụng c ụ th ể (ASIC), m ạch in (layout) cho m ột m ạch tích hợp theo yêu c ầu khách hàng (custom IC), ho ặc m ột ch ươ ng trình cho m ột thi ết b ị logic có kh ả n ăng l ập trình được (PLD). Hình 1.1 mô t ả t ừng b ước trong qui trình thi ết k ế này. Bước đầ u c ủa thi ết k ế, m ột thi ết k ế s ẽ được mô t ả bởi s ự h ỗn h ợp gi ữa mô t ả ở m ức độ hành vi (behavioural) Verilog, s ử d ụng nh ững gói (module) thi ết k ế Verilog đã được thi ết k ế s ẵn, và vi ệc gán h ệ th ống các bus và wire để liên k ết các gói thiết k ế này thành m ột h ệ th ống hoàn ch ỉnh. Kĩ s ư thi ết k ế c ũng ph ải có trách nhi ệm t ạo ra d ữ li ệu để ki ểm tra (testbench) xem thi ết k ế đúng ch ức n ăng hay ch ưa cũng nh ư dùng để ki ểm tra thi ết k ế sau khi t ổng h ợp. Vi ệc ki ểm tra thi ết k ế có th ể th ực hi ện được bằng vi ệc mô ph ỏng, chèn nh ững k ĩ thu ật ki ểm tra, ki ểm tra thông th ường ho ặc k ết h ợp c ả ba ph ươ ng pháp trên. Sau b ước ki ểm tra đánh giá thi ết k ế (bước này được g ọi là ki ểm tra ti ền t ổng hợp (presynthesis verification)), thi ết k ế s ẽ được ti ếp t ục b ằng vi ệc t ổng h ợp để t ạo ra ph ần c ứng th ực s ự cho h ệ th ống thi ết k ế cu ối cùng (ASIC, custom IC or FPLD, ). Nếu h ệ th ống thi ết k ế là ASIC, thi ết k ế sẽ s ẽ được s ản xu ất b ởi nhà s ản xu ất khác; nếu là custom IC, thi ết k ế s ẽ được s ản xu ất tr ực ti ếp; nếu là FPLD, thi ết k ế sẽ được n ạp lên thi ết b ị l ập trình được. Sau b ước t ổng h ợp và tr ước khi 2
  6. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog ph ần c ứng th ực s ự được t ạo ra, m ột quá trình mô ph ỏng khác (h ậu tổng h ợp (postsynthesis)) ph ải được th ực hi ện. Vi ệc mô ph ỏng này, ta có th ể s ử d ụng testbench t ươ ng t ự testbench đã s ử d ụng trong mô ph ỏng ti ền t ổng h ợp (presynthesis). Bằng ph ươ ng pháp này, mô hình thi ết k ế ở m ức độ hành vi và mô hình ph ần c ứng c ủa thi ết kế được ki ểm tra v ới cùng d ữ li ệu ngõ vào. Sự khác nhau gi ữa mô ph ỏng ti ền t ổng h ợp và h ậu t ổng h ợp đó là m ức độ chi ti ết có th ể đạ t được t ừ m ỗi lo ại mô ph ỏng. Mô t ả thi ết k ế dùng Verilog module flipflop (q,d,clk); always(posedge clk) endmodule Mô ph ỏng ti ền t ổng h ợp: dùng Testbench t ạo d ạng in sóng - Ki ểm tra ch ức n ăng out - Ki ểm tra đị nh th ời Phân tích Tổng h ợp Đặt cell và đi k ết - Tạo ra m ột - Đư a v ề hàm Boole nối dữ li ệu trung - Rút g ọn bi ểu th ức - Tối ưu di ện tích gian - Tạo ra ph ần c ứng - Tối ưu k ết n ối đư ợc k ết n ối b ởi các linh ki ện c ơ b ản Phân tích timing 2.1ns - Ch ỉ ra th ời gian tr ì hoãn trên t ừng path của m ạch Mô ph ỏng hậu t ổng h ợp: dùng Testbench t ạo d ạng in sóng - Ki ểm tra ch ức n ăng out - Ki ểm tra đị nh th ời Nạp thi ết k ế lên Tạo ra ASIC netlist t ới m ức Tạo ra layout để ch ế FPGA cổng transistor tạo Chip Hình 1.1 Lu ồng thi ết k ế ASIC 3
  7. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog Nh ững ph ần ti ếp theo s ẽ mô t ả t ỉ m ỉ v ề m ỗi khối trong Hình 1.1 1.1.1 Dẫn nh ập thi ết k ế Bước đầ u tiên trong thi ết k ế h ệ th ống s ố là b ước d ẫn nh ập thi ết k ế. Trong b ước này, thi ết k ế được mô t ả b ằng Verilog theo phong cách phân cấp t ừ cao xu ống th ấp (top-down). Một thi ết k ế hoàn ch ỉnh có th ể bao g ồm nh ững linh ki ện ở m ức c ổng ho ặc m ức transistor, nh ững kh ối (module) ph ần c ứng có ch ức n ăng ph ức t ạp h ơn được mô t ả ở m ức độ hành vi, ho ặc nh ững linh ki ện được li ệt kê b ởi c ấu trúc bus. Do nh ững thi ết k ế Verilog ở m ức cao th ường được mô t ả ở m ức độ mà t ại đó nó mô t ả h ệ th ống nh ững thanh ghi và s ự truy ền d ữ li ệu gi ữa nh ững thanh ghi này thông qua h ệ th ống bus, vi ệc mô t ả h ệ th ống thi ết k ế ở mức độ này được xem nh ư là m ức độ truy ền d ữ li ệu gi ữa các thanh ghi (RTL). Một thi ết k ế hoàn ch ỉnh được mô t ả nh ư v ậy s ẽ t ạo ra được ph ần cứng t ươ ng ứng th ực s ự rõ ràng. Nh ững c ấu trúc thi ết k ế Verilog ở m ức độ RTL s ử d ụng nh ững phát bi ểu qui trình (producedural statements), phép gán liên t ục (continuous assignments), và nh ững phát bi ểu g ọi s ử d ụng kh ối (module) đã xây d ựng s ẵn. Nh ững phát bi ểu qui trình Verilog (procedural statements) được dùng để mô t ả m ức độ hành vi ở m ức cao. M ột h ệ th ống ho ặc m ột linh ki ện được mô t ả ở m ức độ hành vi thì t ươ ng t ự v ới vi ệc mô t ả trong ngôn ng ữ ph ần m ềm. Ví d ụ, chúng ta có th ể mô t ả m ột linh ki ện b ằng vi ệc ki ểm tra điều ki ện ngõ vào c ủa nó, b ật c ờ hi ệu, ch ờ cho đế n khi có s ự ki ện nào đó xảy ra, quan sát nh ững tín hi ệu b ắt tay và t ạo ra ngõ ra. Mô t ả h ệ th ống m ột cách qui trình nh ư v ậy, c ấu trúc if-else, case c ủa Verilog c ũng nh ư nh ững ngôn ng ữ ph ần m ềm khác đề u s ử d ụng nh ư nhau. Nh ững phép gán liên tục (continuous assignment) trong Verilog là nh ững phép gán cho vi ệc th ể hi ện ch ức n ăng nh ững kh ối logic, nh ững phép 4
  8. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog gán bus, và mô t ả vi ệc kết n ối gi ữa h ệ th ống bus và các chân ngõ vào và ngõ ra. Kết h ợp v ới nh ững hàm Boolean và nh ững bi ểu th ức có điều ki ện, nh ững c ấu trúc ngôn ng ữ này có th ể được để mô t ả nh ững linh ki ện và h ệ th ống theo nh ững phép gán thanh ghi và bus c ủa chúng. Nh ững phát bi ểu g ọi s ử d ụng kh ối Verilog đã được thi ết k ế s ẵn (instantiantion statements) được dùng cho nh ững linh ki ện m ức th ấp trong một thi ết k ế ở m ức độ cao h ơn. Thay vì mô t ả ở m ức độ hành vi, ch ức năng, ho ặc bus c ủa m ột h ệ th ống, chúng ta có th ể mô t ả m ột h ệ thống b ằng Verilog b ằng cách k ết n ối nh ững linh ki ện ở m ức độ th ấp h ơn. Nh ững linh ki ện này có th ể nh ỏ nh ư là m ức c ổng hay transistor, ho ặc có th ể l ớn nh ư là một b ộ vi x ử lí hoàn ch ỉnh. 1.1.2 Testbench trong Verilog Một h ệ th ống được thi ết k ế dùng Verilog ph ải được mô ph ỏng và ki ểm tra xem thi ết k ế xem đã đúng ch ức n ăng ch ưa tr ước khi t ạo ra ph ần cứng. Trong quá trình ch ạy mô ph ỏng này, nh ững l ỗi thi ết k ế và s ự không tươ ng thích gi ữa nh ững linh ki ện dùng trong thi ết k ế có th ể được phát hi ện. Ch ạy mô ph ỏng m ột thi ết k ế đòi h ỏi vi ệc t ạo ra m ột d ữ li ệu ngõ vào ki ểm tra và quá trình quan sát k ết qu ả sau khi ch ạy mô ph ỏng, d ữ li ệu dùng để ki ểm tra này được g ọi là testbench. Một testbench s ử d ụng c ấu trúc m ức cao c ủa Verilog để t ạo ra d ữ li ệu ki ểm tra, quan sát đáp ứng ngõ ra, và c ả vi ệc b ắt tay gi ữa nh ững tín hi ệu trong thi ết k ế. Bên trong testbench, h ệ th ống thi ết k ế c ần ch ạy mô ph ỏng s ẽ được g ọi ra (instantiate) trong testbench. Dữ li ệu testbench cùng v ới h ệ th ống thi ết k ế s ẽ t ạo ra m ột mô hình mô ph ỏng mà s ẽ được s ử d ụng b ởi m ột công c ụ mô ph ỏng Verilog. 5
  9. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog 1.1.3 Đánh giá thi ết k ế Một nhiêm v ụ quan tr ọng trong b ất kì thi ết k ế s ố nào c ũng c ần đó là đánh giá thi ết k ế. Đánh giá thi ết k ế là quá trình mà ng ười thi ết k ế s ẽ ki ểm tra thi ết k ế c ủa h ọ có sai sót nào có th ể x ảy ra trong suốt quá trình thi ết k ế hay không. Một sai sót thi ết k ế có th ể x ảy ra do s ự mô t ả thi ết k ế m ơ h ồ, do sai sót c ủa ng ười thi ết k ế, ho ặc s ử d ụng không đúng nh ững kh ối trong thi ết kế. Đánh giá thi ết k ế có th ể th ực hi ện b ằng mô ph ỏng, b ằng vi ệc chèn nh ững k ĩ thu ật ki ểm tra, ho ặc ki ểm tra thông th ường. 1.1.3.1 Mô ph ỏng Ch ạy mô ph ỏng dùng trong vi ệc đánh giá thi ết k ế được th ực hi ện tr ước khi thi ết k ế được t ổng h ợp. Bước ch ạy mô ph ỏng này được hi ểu nh ư mô ph ỏng ở m ức độ hành vi, m ức độ RTL hay ti ền t ổng h ợp. Ở m ức độ RTL, một thi ết k ế bao g ồm xung th ời gian clock nh ưng không bao g ồm trí hoãn th ời gian trên cổng và dây k ết n ối (wire). Ch ạy mô ph ỏng ở m ức độ này s ẽ chính xác theo xung clock. Th ời gian c ủa vi ệc ch ạy mô ph ỏng ở mức độ RTL là theo tín hi ệu xung clock, không quan tâm đến nh ững vấn đề nh ư: nguy hi ểm ti ềm ẩn có th ể khi ến thi ết k ế b ị l ỗi (hazards, glitch), hi ện tượng ch ạy đua không ki ểm soát gi ữa nh ững tín hi ệu (race conditions), nh ững vi ph ạm v ề th ời gian setup và hold c ủa tín hi ệu ngõ vào, và nh ững vấn đề liên quan đến đị nh th ời khác. Ưu điểm c ủa vi ệc mô ph ỏng này là tốc độ ch ạy mô ph ỏng nhanh so v ới ch ạy mô ph ỏng ở m ức c ổng ho ặc m ức transistor. Ch ạy mô ph ỏng cho m ột thi ết kế đòi h ỏi d ữ li ệu ki ểm tra. Thông th ường trong môi tr ường mô ph ỏng Verilog s ẽ cung c ấp nhi ều ph ươ ng pháp khác nhau để đưa d ữ li ệu ki ểm tra này vào thi ết k ế để ki ểm tra. Dữ li ệu ki ểm tra có th ể được t ạo ra b ằng đồ h ọa s ử d ụng nh ững công c ụ so ạn 6
  10. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog th ảo d ạng sóng, ho ặc b ằng testbench. Hình 1.2 mô t ả hai cách khác nhau để định ngh ĩa d ữ li ệu ki ểm tra ngõ vào c ủa m ột công c ụ mô ph ỏng. Nh ững ngõ ra c ủa công c ụ mô ph ỏng là nh ững d ạng sóng ngõ ra (có th ể quan sát tr ực quan). Mô t ả thi ết k ế Dạng sóng ngõ ra Verilog in Mô hình linh ki ện out Công c ụ mô Sóng tín hi ệu ngõ vào ph ỏng Tạo b ằng 2 cách Báo cáo k ết qu ả - Vẽ sóng dạng text - Testbench PASS/FAIL in Hình 1.2 Hai cách khác nhau để đị nh ngh ĩa d ữ li ệu ki ểm tra ngõ vào Để ch ạy mô ph ỏng v ới Verilog testbench, trong testbench s ẽ g ọi h ệ th ống thi ết k ế ra để ki ểm tra, lúc này h ệ th ống thi ết k ế được xem nh ư là một ph ần c ủa testbench, testbench s ẽ cung c ấp d ữ li ệu ki ểm tra đế n ngõ vào của h ệ th ống thi ết k ế. Hình1.3 mô t ả m ột đoạn code c ủa m ột m ạch đế m, testbench c ủa nó, c ũng nh ư k ết qu ả ch ạy mô ph ỏng c ủa nó d ưới d ạng sóng ngõ ra. Quan sát hình ta th ấy vi ệc ch ạy mô ph ỏng s ẽ đánh giá ch ức n ăng của m ạch đế m. V ới m ỗi xung clock thì ngõ ra b ộ đếm s ẽ t ăng lên 1. Chú ý rằng, theo bi ểu đồ th ời gian thì ngõ ra b ộ đế m thay đổ i t ại c ạnh lên xung clock và không có th ời gian trì hoãn do c ổng c ũng nh ư trì hoãn trên đường truy ền. Kết qu ả ch ạy mô ph ỏng cho th ấy ch ức n ăng c ủa m ạch đế m là chính xác mà không cần quan tâm đế n t ần s ố xung clock. Hi ển nhiên, nh ững linh ki ện ph ần c ứng th ực s ự s ẽ có đáp ứng khác nhau. Dựa trên định th ời và th ời gian trì hoãn c ủa nh ững kh ối được s ử 7
  11. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog dụng, th ời gian t ừ c ạnh lên xung clock đến ngõ ra c ủa b ộ đế m s ẽ có độ trì hoãn khác không. Hơn n ữa, n ếu t ần s ố xung clock được c ấp vào m ạch th ực sự quá nhanh so v ới t ốc độ truy ến tín hi ệu bên trong các c ổng và transistor của thi ết k ế thì ngõ ra c ủa thi ết k ế s ẽ không th ể bi ết được. Vi ệc mô ph ỏng này không cung c ấp chi ti ết v ề các v ấn đề đị nh th ời của h ệ th ống thi ết k ế được mô ph ỏng. Do đó, nh ững v ấn đề ti ềm ẩn v ề đị nh th ời c ủa ph ần c ứng do trì hoãn trên cổng s ẽ không th ể phát hi ện được. Đây là v ấn đề điển hình c ủa quá tr ỉnh mô ph ỏng ti ền t ổng h ợp ho ặc mô ph ỏng ở mức độ hành vi. Điều bi ết được trong Hình1.3 đó là b ộ đế m c ủa ta đế m s ố nh ị phân. Thi ết k ế ho ạt độ ng nhanh ch ậm th ế nào, ho ạt đông được ở t ần s ố nào ch ỉ có th ể bi ết được b ằng vi ệc ki ểm tra thi ết k ế sau t ổng h ợp. Testbench Mô t ả thi ết k ế `timescale 1ns/100ps module DFF (clk, din, qout); module testbench(); input clk, din; reg clk; output reg qout; wire din, qout; always @(posedge clk) begin always #10 clk = ~clk; qout = din; DFF i1 (clk, din, qout); end endmodule endmodule SIMULATOR 10ns clk din qout Hình1.3 Mô t ả m ột đoạn code c ủa m ột m ạch flip-flop 8
  12. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog 1.1.3.2 Kĩ thu ật chèn ki ểm tra (assertion) Thay vì ph ải dò theo k ết qu ả mô ph ỏng b ằng m ắt hay t ạo nh ững d ữ li ệu ki ểm tra testbench ph ức t ạp, k ĩ thu ật chèn thi ết b ị giám sát có th ể được sử d ụng để ki ểm tra tu ần t ự nh ững đặ c tính c ủa thi ết k ế trong su ốt quá trình mô ph ỏng. Thi ết b ị giám sát được đặ t bên trong h ệ th ống thi ết k ế được mô ph ỏng b ởi ng ười thi ết k ế. Ng ười thi ết k ế s ẽ quy ết đị nh xem ch ức n ăng c ủa thi ết k ế đúng hay sai, nh ững điều ki ện nào thi ết k ế c ần ph ải th ỏa mãn. Nh ững điều ki ện này ph ải tuân theo nh ững đặ c tính thi ết k ế, và thi ết b ị giám sát được chèn vào h ệ th ống thi ết k ế để đả m b ảo nh ững đặ c tính này không b ị vi ph ạm. Chu ỗi thi ết b ị giám sát này s ẽ sai n ếu m ột đặ c tính nào đó được đặ t vào b ởi người thi ết k ế b ị vi ph ạm. Nó s ẽ c ảnh báo ng ười thi ết kế r ằng thi ết k ế đã không đúng ch ức n ăng nh ư mong đợi. Th ư vi ện OVL (Open Verification Library) cung c ấp m ột chu ỗi nh ững thi ết b ị giám sát để chèn vào h ệ th ống thi ết k ế để giám sát nh ững đặ c tính thông thường c ủa thi ết k ế. Ng ười thi ết k ế có th ể dùng nh ững k ĩ thu ật giám sát c ủa riêng mình để chèn vào thi ết k ế và dùng chúng k ết h ợp v ới testbench trong vi ệc ki ểm tra đánh giá thi ết k ế. 1.1.3.3 Ki ểm tra thông th ường Ki ểm tra thông th ường là quá trình ki ểm tra nh ững đặ c tính b ất kì của thi ết k ế. Khi m ột thi ết k ế hoàn thành, ng ười thi ết k ế s ẽ xây d ựng m ột chu ỗi nh ững đặ c tính t ươ ng ứng v ới hành vi c ủa thi ết k ế. Công c ụ ki ểm tra thông th ường s ẽ ki ểm tra thi ết k ế để đả m b ảo r ằng nh ững đặ c tính được mô tả đáp ứng được t ất c ả nh ững điều ki ện. Nếu có m ột đặ c tính được phát hi ện là không đáp ứng đúng, đặ c tính đó được xem nh ư vi ph ạm. Đặ c tính độ bao ph ủ (coverage) ch ỉ ra bao nhiêu ph ần tr ăm đặ c tính c ủa thi ết k ế đã được ki ểm tra. 9
  13. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog 1.1.4 Biên d ịch và t ổng h ợp thi ết k ế Tổng h ợp là quá trình t ạo ra ph ần c ứng t ự độ ng t ừ m ột mô t ả thi ết k ế ph ần c ứng t ươ ng ứng rõ ràng. Một mô t ả ph ần c ứng Verilog dùng để t ổng hợp không th ể bao g ồm tín hi ệu và mô t ả đị nh th ời ở m ức c ổng, và nh ững cấu trúc ngôn ng ữ khác mà không d ịch sang nh ững ph ươ ng trình logic tu ần tự ho ặc t ổ h ợp. Hơn th ế n ữa, nh ững mô t ả ph ần cứng Verilog dùng cho tổng h ợp ph ải tuân theo nh ững phong cách vi ết code m ột cách nh ất đị nh cho m ạch t ổ h ợp c ũng nh ư m ạch tu ần t ự. Nh ững phong cách này và c ấu trúc Verilog t ươ ng ứng c ủa chúng được định ngh ĩa trong vi ệc t ổng h ợp RTL. Trong qui trình thi ết k ế, sau khi m ột thi ết k ế được mô t ả hoàn thành và k ết qu ả mô ph ỏng ti ền t ổng h ợp c ủa nó được ki ểm tra b ởi ng ười thi ết kế, nó ph ải được biên d ịch để ti ến g ần h ơn đến vi ệc t ạo thành ph ần c ứng th ực sự trên silicon. Bước thi ết k ế này đòi h ỏi vi ệc mô t ả ph ần c ứng c ủa thi ết k ế ph ải được nh ận ra. Ví d ụ, chúng ta ph ải ch ỉ đế n m ột ASIC c ụ th ể, ho ặc m ột FPGA c ụ th ể nh ư là thi ết b ị ph ần c ứng m ục đích c ủa thi ết k ế. Khi thi ết b ị mục đích được ch ỉ ra, nh ững t ập tin mô t ả v ề công ngh ệ (technology files) của ph ần c ứng (ASIC, FPGA, ho ặc custom IC) s ẽ cung c ấp chi ti ết nh ững thông tin v ề đị nh th ời và mô t ả ch ức n ăng cho quá trình biên d ịch. Quá trình biên d ịch s ẽ chuy ển đổ i nh ững ph ần khác nhau c ủa thi ết k ế ra m ột định dạng trung gian (bước phân tích), k ết n ối t ất c ả các ph ần l ại v ới nhau, tạo ra m ức logic t ươ ng ứng (bước t ổng h ợp), s ắp x ếp và k ết n ối (place and route) nh ững linh ki ện trong thi ết b ị ph ần c ứng m ục đích l ại v ới nhau để th ực hiên ch ức n ăng nh ư thi ết k ế mong mu ốn và t ạo ra thông tin chi ti ết v ề định th ời trong thi ết k ế. Hình 1.4 mô t ả quá trình biên d ịch và mô t ả hình ảnh k ết qu ả ngõ ra của m ỗi b ước biên d ịch. Nh ư trên hình, ngõ vào c ủa b ước này là m ột mô t ả 10
  14. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog ph ần c ứng bao g ồm nh ững mức độ mô t ả khác nhau c ủa Verilog, và k ết qu ả ngõ ra c ủa nó là m ột ph ần c ứng chi ti ết cho thi ết b ị ph ần c ứng m ục đích nh ư FPLD hay để s ản xu ất chip ASIC. Tổng h ợp Phân tích Sắp x ếp cell và đi - Đư a v ề bi ểu th ức Boolean - Tạo ra m ột d ữ dây k ết n ối - Tối ưu logic li ệu thi ết k ế có đị nh - Tối ưu di ện tích -Tạo ra ph ần c ứng được k ết dạng đồ ng nh ất - Tối ưu k ết n ối nối b ởi các linh ki ện c ơ b ản 2.1ns Phân tích timing - Ch ỉ ra th ời gian tr ì hoãn trên t ừng path c ủa m ạch Nạp thi ết k ế lên Tạo ra ASIC netlist t ới m ức Tạo ra layout để FPGA cổng transistor ch ế t ạo Chip Hình 1.4 Mô t ả quá trình biên d ịch và mô t ả hình ảnh k ết qu ả ngõ ra 1.1.4.1 Phân tích Một thi ết k ế hoàn ch ỉnh được mô t ả dùng Verilog có th ể bao g ồm mô tả ở nhi ều m ức độ khác nhau nh ư m ức độ hành vi, h ệ th ống bus và dây k ết nối v ới nh ững linh ki ện Verilog khác. Tr ước khi m ột thi ết k ế hoàn ch ỉnh tạo ra ph ần c ứng, thi ết k ế ph ải được phân tích và t ạo ra m ột đị nh d ạng đồ ng nh ất cho t ất c ả các ph ần trong thi ết k ế. Bước này c ũng ki ểm tra cú pháp và ng ữ ngh ĩa c ủa mã ngõ vào Verilog. 1.1.4.2 Tạo ph ần c ứng Sau khi t ạo được m ột d ữ li ệu thi ết k ế có đị nh d ạng đồ ng nh ất cho t ất cả các linh ki ện trong thi ết k ế, b ước t ổng h ợp sẽ b ắt đầ u b ằng chuy ển đổ i dữ li ệu thi ết k ế trên sang nh ững đị nh d ạng ph ần c ứng thông th ường nh ư một chu ỗi nh ững bi ểu th ức Boolean hay m ột netlist nh ững c ổng c ơ b ản. 11
  15. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog 1.1.4.3 Tối ưu logic Bước k ế ti ếp c ủa quá trình t ổng hợp, sau khi m ột thi ết k ế được chuy ển đổ i sang m ột chu ỗi nh ững bi ểu th ức Boolean, b ước t ối ưu logic được th ực hi ện. B ước này nh ằm m ục đích làm gi ảm nh ững bi ểu th ức v ới ngõ vào không đổi, lo ại b ỏ nh ững bi ểu th ức l ập l ại, t ối thi ểu hai m ức, t ối thi ểu nhi ều m ức. Đây là quá trình tính toán r ất hao t ốn th ời gian và công s ức, m ột s ố công c ụ cho phép ng ười thi ết k ế quy ết đị nh m ức độ t ối ưu. K ết qu ả ngõ ra của b ước này c ũng d ưới d ạng nh ững bi ểu th ức Boolean, mô t ả logic d ưới dạng b ảng, ho ặc netlist g ồm nh ững c ổng c ơ b ản. 1.1.4.4 Binding Sau b ước t ối ưu logic, quá trình t ổng h ợp s ử d ụng thông tin t ừ thi ết bị ph ần c ứng m ục đích để quy ết đị nh chính xác linh ki ện logic nào và thi ết bị nào c ần để hi ện th ực m ạch thi ết k ế. Quá trình này được g ọi là binding và kết qu ả ngõ ra c ủa nó được ch ỉ đị nh c ụ th ể s ử d ụng cho FPLD, ASIC, hay custom IC. 1.1.4.5 Sắp x ếp cell và đi dây k ết n ối Bước s ắp x ếp và đi dây k ết n ối sẽ quy ết đị nh vi ệc đặ t v ị trí c ủa các linh ki ện trên thi ết b ị ph ần c ứng m ục đích. Vi ệc k ết n ối các ngõ vào và ngõ ra c ủa nh ững linh ki ện này dùng h ệ th ống dây liên k ết và vùng chuy ển mạch trên thi ết b ị ph ần c ứng m ục đích được quy ết đị nh b ởi b ước s ắp x ếp và đi dây liên k ết này. Kết qu ả ngõ ra c ủa b ước này được đưa t ới thi ết b ị ph ần c ứng m ục đích, nh ư n ạp lên FPLD, hay dùng để s ản xu ất ASIC. Một ví d ụ minh h ọa v ề quá trình t ổng h ợp được ch ỉ ra trên Hình 1.5. Trong hình này, m ạch đế m đã được dùng ch ạy mô ph ỏng trong hình 1.3 12
  16. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog được t ổng h ợp. Ngoài vi ệc mô t ả ph ần c ứng thi ết k ế dùng Verilog, công c ụ tổng h ợp đòi h ỏi nh ững thông tin mô t ả thi ết b ị ph ần c ứng đích để ti ến hành quá trình t ổng h ợp c ủa mình. Kết qu ả ngõ ra c ủa công c ụ t ổng h ợp là danh sách các c ổng và flip-flop có s ẵn trong thi ết b ị ph ần c ứng đích và h ệ th ống dây k ết n ối gi ữa chúng. Hình 1.5 cũng ch ỉ ra m ột k ết qu ả ngõ ra mang tính tr ực quan mà đã được t ạo ra tự độ ng b ằng công c ụ t ổng h ợp c ủa Altera Quartus II. Mô t ả thi ết k ế module DFF (clk, din, qout); input clk, din; output reg qout; always @(posedge clk) begin qout = din; end endmodule Linh ki ện c ơ b ản: - Inverter SYNTHESIS TOOL - Nand - Or, Mô t ả đị nh th ời din qout clk Hình 1.5 Minh h ọa v ề quá trình t ổng h ợp 1.1.5 Mô ph ỏng sau khi t ổng h ợp thi ết k ế Sau khi quá trình t ổng h ợp hoàn thành, công c ụ t ổng h ợp s ẽ t ạo ra một netlist hoàn ch ỉnh ch ứa nh ững linh ki ện c ủa thi ết b ị ph ần c ứng đích và các giá tr ị đị nh th ời c ủa nó. Nh ững thông tin chi ti ết v ề các c ổng được dùng để hi ện th ực thi ết k ế c ũng được mô t ả trong netlist này. Netlist này c ũng 13
  17. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog bao g ồm nh ững thông tin v ề độ trì hoãn trên đường dây và nh ững tác độ ng của t ải lên các c ổng dùng trong quá trình h ậu t ổng h ợp. Có nhi ều đị nh d ạng netlist ngõ ra có th ể được t ạo ra bao g ồm c ả đị nh d ạng Verilog. Một netlist nh ư v ậy có th ể được dùng để mô ph ỏng, và mô ph ỏng này được g ọi là mô ph ỏng h ậu t ổng h ợp. Nh ững v ấn đề v ề đị nh th ời, v ề t ần s ố xung clock, v ề hi ện t ượng ch ạy đua không ki ểm soát, nh ững nguy hi ểm ti ềm ẩn c ủa thi ết kế ch ỉ có th ể ki ểm tra b ằng mô ph ỏng h ậu tổng h ợp th ực hi ện sau khi thi ết kế được t ổng h ợp. Nh ư trên Hình 1.1, ta có th ể s ử d ụng d ữ li ệu ki ểm tra mà đã dùng cho quá trình mô ph ỏng ti ền t ổng h ợp để dùng cho quá trình mô ph ỏng h ậu t ổng h ợp. Do độ trì hoãn trên đường dây và các c ổng, đáp ứng c ủa thi ết k ế sau khi ch ạy mô ph ỏng h ậu t ổng h ợp s ẽ khác v ới đáp ứng c ủa thi ết k ế mà ng ười thi ết k ế mong mu ốn. Trong tr ường h ợp này, ng ười thi ết k ế ph ải s ửa lại thi ết k ế và c ố g ắng tránh nh ững sai sót v ề đị nh th ời và hi ện t ượng ch ạy đua giữa nh ững tín hi ệu mà không th ể ki ểm soát. 1.1.6 Phân tích th ời gian Quan sát trên Hình 1.1, b ước phân tích th ời gian là m ột ph ần trong quá trình biên d ịch, ho ặc trong m ột s ố công c ụ thì b ước phân tích th ời gian này được th ực hi ện sau quá trình biên d ịch. Bước này s ẽ t ạo ra kh ả n ăng xấu nh ất v ề độ trì hoãn , t ốc độ xung clock, độ trì hoãn t ừ c ổng này đến cổng khác, c ũng nh ư th ời gian cho vi ệc thi ết l ập và gi ữ tín hi ệu. Kết qu ả của b ước phân tích th ời gian được th ể hi ện d ưới d ạng b ảng ho ặc bi ểu đồ . Ng ười thi ết k ế s ử d ụng nh ững thông tin này để xác đị nh t ốc độ xung clock, hay nói cách khác là xác định t ốc độ ho ạt độ ng c ủa m ạch thi ết k ế. 14
  18. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog 1.1.7 Tạo linh ki ện ph ần c ứng Bước cu ối cùng trong qui trình thi ết k ế t ự độ ng d ựa trên Verilog đó là t ạo ra phần c ứng th ực s ự cho thi ết k ế. B ước này có th ể t ạo ra m ột netlist dùng để s ản xu ất ASIC, m ột ch ươ ng trình để n ạp vào FPLD, hay m ột m ạch in cho m ạch IC. 1.2 Ngôn ng ữ ph ần c ứng Verilog (Verilog HDL) Trong ph ần tr ước, ta đã trình bày t ừng b ước thi ết k ế ở m ức độ RTL từ m ột mô t ả thi ết k ế Verilog cho đế n vi ệc hi ện th ực ra m ột ph ần c ứng th ực sự. Qui trình thi ết k ế này ch ỉ có th ể th ực hi ện được khi ngôn ng ữ Verilog có th ể hi ểu được b ởi ng ười thi ết k ế h ệ th ống, ng ười thi ết k ế ở m ức độ RTL, ng ười ki ểm tra, công c ụ mô ph ỏng, công c ụ t ổng h ợp, và các máy móc liên quan. B ởi vì t ầm quan tr ọng c ủa nó trong qui trình thi ết k ế, Verilog đã tr ở thành m ột chu ẩn qu ốc t ế IEEE. Chu ẩn này được s ử d ụng b ởi ng ười thi ết k ế cũng nh ư ng ười xây d ựng công c ụ thi ết k ế. 1.2.1 Quá trình phát tri ển Verilog Verilog được ra đờ i vào đầu n ăm 1984 b ởi Gateway Design Automation. Kh ởi đầ u, ngôn ng ữ đầ u tiên được dùng nh ư là m ột công c ụ mô ph ỏng và ki ểm tra. Sau th ời gian đầ u ngôn ng ữ này được ch ấp nh ận b ởi ngành công nghi ệp điện t ử, m ột công c ụ mô ph ỏng, m ột công c ụ phân tích th ời gian, và sau này vào n ăm 1987, công c ụ t ổng h ợp đã được xây d ựng và phát tri ển d ựa vào ngôn ng ữ này. Gateway Design Automation và nh ững công c ụ d ựa trên Verilog c ủa hãng sau này được mua b ởi Cadence Design System. T ừ sau đó, Cadence đóng vai trò h ết s ức quan tr ọng trong vi ệc phát tri ển c ũng nh ư ph ổ bi ến ngôn ng ữ mô t ả ph ần c ứng Verilog. 15
  19. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog Vào n ăm 1987, VHDL tr ở thành m ột chu ẩn ngôn ng ữ mô t ả ph ần cứng c ủa IEEE. B ởi do s ự h ỗ tr ợ c ủa B ộ qu ốc phòng (DoD), VHDL được sử d ụng nhi ều trong nh ững d ự án l ớn c ủa chính ph ủ M ỹ. Trong n ỗ l ực ph ổ bi ến Verilog, vào n ăm 1990, OVI (Open Verilog International) được thành lập và Verilog chi ếm ưu th ế trong l ĩnh v ực công nghi ệp. Điều này đã t ạo ra một s ự quan tâm khá l ớn t ừ ng ười dùng và các nhà cung c ấp EDA (Electronic Design Automation) tới Verilog. Vào n ăm 1993, nh ững n ỗ l ực nh ằm chu ẩn hóa ngôn ng ữ Verilog được b ắt đầ u. Verilog tr ở thành chu ẩn IEEE, IEEE Std 1364-1995, vào năm 1995. Với nh ững công c ụ mô ph ỏng, công c ụ t ổng h ợp, công c ụ phân tích th ời gian, và nh ững công c ụ thi ết k ế d ựa trên Verilog đã có s ẵn, chu ẩn Verilog IEEE này nhanh chóng được ch ấp nh ận sâu r ộng trong c ộng đồ ng thi ết k ế điện t ử. Một phiên b ản m ới c ủa Verilog được ch ấp nh ận b ởi IEEE vào n ăm 2001. Phiên b ản m ới này được xem nh ư chu ẩn Verilog-2001 và được dùng bởi h ầu h ết ng ười s ử d ụng và ng ười phát tri ển công c ụ. Nh ững đặ c điểm mới trong phiên b ản m ới đó là nó cho phép bên ngoài có kh ả n ăng đọ c và ghi d ữ li ệu, qu ản lí th ư vi ện, xây d ựng c ấu hình thi ết k ế, h ỗ tr ợ nh ững c ấu trúc có m ức độ trừu t ượng cao h ơn, nh ững c ấu trúc mô t ả s ự l ặp l ại, c ũng nh ư thêm m ột s ố đặ c tính vào phiên b ản này. Quá trình c ải ti ến chu ẩn này vẫn đang được ti ếp t ục v ới s ự tài tr ợ c ủa IEEE. 1.2.2 Nh ững đặ c tính c ủa Verilog Verilog là m ột ngôn ng ữ mô t ả ph ần c ứng dùng để đặ c t ả ph ần c ứng từ m ức transistor đế n m ức hành vi. Ngôn ng ữ này h ỗ tr ợ nh ững c ấu trúc định th ời cho vi ệc mô ph ỏng đị nh th ời ở m ức độ chuy ển m ạch và t ức th ời, nó c ũng có kh ả n ăng mô t ả ph ần c ứng t ại m ức độ thu ật toán tr ừu t ượng. Một mô t ả thi ết k ế Verilog có th ể bao g ồm s ự tr ộn l ẫn gi ữa nh ững kh ối 16
  20. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog (module) có m ức độ tr ừu t ượng khác nhau v ới s ự khác nhau v ề m ức độ chi ti ết. 1.2.2.1 Mức độ chuy ển m ạch Nh ững đặ c điểm c ủa ngôn ng ữ này khi ến nó tr ở nên lí t ưởng trong vi ệc mô hình hóa và mô ph ỏng ở m ức độ chuy ển m ạch bao g ồm kh ả n ăng chuy ển m ạch m ột chi ều c ũng nh ư hai chi ều v ới nh ững thông s ố v ề độ trì hoãn và lưu tr ữ điện tích. Nh ững trì hoãn m ạch điện có th ể được mô hình hóa nh ư là trì hoãn đường truy ền, trì hoãn t ừ th ấp lên cao hay t ừ cao xu ống th ấp. Đặc điểm l ưu tr ữ điện tích ở m ức độ tr ừu t ượng trong Verilog khi ến nó có kh ả n ăng mô t ả nh ững m ạch điện với linh ki ện động nh ư là CMOS hay MOS. 1.2.2.2 Mức độ c ổng Nh ững c ổng c ơ b ản v ới nh ững thông s ố được đị nh ngh ĩa tr ước s ẽ cung c ấp m ột kh ả n ăng thu ận ti ện trong vi ệc th ể hi ện netlist và mô ph ỏng ở mức c ổng. Đố i v ới vi ệc mô ph ỏng m ức c ổng v ới m ục đích chi ti ết và đặc bi ệt, nh ững linh ki ện c ổng có th ể được đị nh ngh ĩa ở m ức độ hành vi. Verilog c ũng cung c ấp nh ững công c ụ cho vi ệc đị nh ngh ĩa nh ững ph ần t ử cơ b ản v ới nh ững ch ức n ăng đặ c bi ệt. M ột h ệ th ống s ố logic 4 giá tr ị đơn gi ản (0,1,x,z) được s ử d ụng trong Verilog để th ể hi ện giá tr ị cho tín hi ệu. Tuy nhiên, để mô hình m ức logic chính xác h ơn, nh ững tín hi ệu Verilog gồm 16 m ức giá tr ị v ề độ m ạnh được thêm vào 4 giá tr ị đơn gi ản ở trên. 1.2.2.3 Độ trì hoãn gi ữa pin đế n pin Một ti ện ích trong vi ệc mô t ả đị nh th ời cho các linh ki ện t ại ngõ vào và ngõ ra c ũng được cung c ấp trong Verilog. Ti ện ích này có th ể được dùng 17
  21. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog để truy v ấn l ại thông tin v ề đị nh th ời trong mô t ả ti ền thi ết k ế ban đầ u. Hơn nữa, ti ện ích này c ũng cho phép ng ười vi ết mô hình hóa tinh ch ỉnh hành vi định th ời c ủa mô hình d ựa trên hi ện th ực ph ần c ứng. 1.2.2.4 Mô t ả Bus Nh ững ti ện ích v ề mô hình bus và thanh ghi c ũng được cung c ấp b ởi Verilog. Đối v ới nhi ều c ấu trúc bus khác nhau, Verilog h ỗ tr ợ ch ức n ăng phân gi ải bus và wire v ới h ệ th ống logic 4 giá tr ị (0,1,x,z). Với s ự k ết h ợp gi ữa ch ức n ăng bus logic và ch ức n ăng phân gi ải, nó cho phép mô hình hóa được h ầu h ết các lo ại bus. Đối v ới vi ệc mô hình hóa thanh ghi, vi ệc mô t ả xung clock m ức cao và nh ững cấu trúc điều khi ển đị nh th ời có th ể được s ử dụng để mô t ả thanh ghi v ới nh ững tín hi ệu xung clock và tín hi ệu reset khác nhau. 1.2.2.5 Mức độ hành vi Nh ững kh ối qui trình (procedural blocks) c ủa Verilog cho phép mô tả thu ật toán c ủa nh ững c ấu trúc ph ần c ứng. Nh ững c ấu trúc này t ươ ng t ự với ngôn ng ữ l ập trình ph ần m ềm nh ưng có kh ả n ăng mô t ả ph ần c ứng. 1.2.2.6 Nh ững ti ện ích h ệ th ống Nh ững tác v ụ h ệ th ống trong Verilog cung c ấp cho ng ười thi ết k ế nh ững công c ụ trong vi ệc t ạo ra d ữ li ệu ki ểm tra testbench, t ập tin truy xu ất đọc, ghi, x ử lí d ữ li ệu, t ạo d ữ li ệu, và mô hình hóa nh ững ph ần c ứng chuyên d ụng. Nh ững ti ện ích h ệ th ống dùng cho b ộ nh ớ đọ c và thi ết b ị logic l ập trình được (PLA) cung c ấp nh ững ph ươ ng pháp thu ận ti ện cho vi ệc mô hình hóa nh ững thi ết b ị này. Nh ững tác v ụ hi ện th ị và I/O có th ể được s ử d ụng để ki ểm soát t ất c ả nh ững ngõ vào và ngõ ra dữ li ệu c ủa ứng 18
  22. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog dụng và mô ph ỏng. Verilog cho phép vi ệc truy xu ất đọ c và ghi ng ẫu nhiên đến các t ập tin. 1.2.2.7 PLI Công c ụ t ươ ng tác ngôn ng ữ l ập trình (PLI) của Verilog cung c ấp một môi tr ường cho vi ệc truy xu ất c ấu trúc d ữ li ệu Verilog s ử d ụng m ột th ư vi ện ch ứa các hàm c ủa ngôn ng ữ C. 1.2.3 Ngôn ng ữ Verilog Ngôn ng ữ Verilog HDL đáp ứng t ất c ả nh ững yêu c ầu cho vi ệc thi ết kế và t ổng h ợp nh ững h ệ th ống s ố. Ngôn ng ữ này h ỗ tr ợ vi ệc mô t ả c ấu trúc phân c ấp c ủa ph ần c ứng t ừ m ức độ h ệ th ống đế n m ức c ổng ho ặc đế n c ả mức công t ắc chuy ển m ạch. Verilog c ũng h ỗ tr ợ m ạnh t ất c ả các m ức độ mô t ả vi ệc đị nh th ời và phát hi ện l ỗi. Vi ệc đị nh th ời và đồng b ộ mà được đòi h ỏi b ởi ph ần c ứng s ẽ được chú tr ọng m ột cách đặ c bi ệt. Trong Verilog, m ột linh ki ện ph ần c ứng được mô t ả b ởi m ột c ấu trúc ngôn ng ữ “khai báo module”. Sự mô t ả m ột module s ẽ mô t ả danh sách nh ững ngõ vào và ngõ ra c ủa linh ki ện c ũng nh ư nh ững thanh ghi và h ệ th ống bus bên trong linh ki ện. Bên trong m ột module, nh ững phép gán đồng th ời, g ọi s ử d ụng linh ki ện và nh ững kh ối qui trình có th ể được dùng để mô t ả m ột linh ki ện ph ần c ứng. Nhi ều module có th ể được g ọi m ột cách phân c ấp để hình thành nh ững c ấu trúc ph ần c ứng khác nhau. Nh ững ph ần t ử con c ủa vi ệc mô t ả thi ết k ế phân c ấp có th ể là nh ững module, nh ững linh ki ện c ơ b ản ho ặc nh ững linh ki ện do ng ười dùng t ự đị nh ngh ĩa. Để mô ph ỏng cho thi ết k ế, nh ững ph ần t ử con trong c ấu trúc phân c ấp này nên được t ổng h ợp m ột cách riêng l ẻ. 19
  23. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog Hiện nay có r ất nhi ều công c ụ và môi tr ường d ựa trên Verilog cung cấp kh ả n ăng ch ạy mô ph ỏng, ki ểm tra thi ết k ế và t ổng h ợp thi ết k ế. Môi tr ường mô ph ỏng cung c ấp nh ững ch ươ ng trình giao di ện đồ h ọa cho b ước thi ết k ế tr ước layout (front-end) và nh ững công c ụ t ạo d ạng sóng và công cụ hi ển th ị. Nh ững công c ụ t ổng h ợp dựa trên n ền t ảng c ủa Verilog và khi tổng h ợp m ột thi ết k ế thì thi ết b ị ph ần c ứng đích nh ư FPGA ho ặc ASIC c ần ph ải được xác đị nh tr ước. 1.3 Tổng k ết Ph ần này đã cung c ấp m ột cái nhìn t ổng quan v ề nh ững c ơ ch ế, nh ững công c ụ và nh ững qui trình dùng trong vi ệc mô t ả m ột thi ết k ế t ừ bước thi ết k ế đế n quá trình hi ện th ực ph ần c ứng. Ph ần này c ũng nói s ơ l ược về thông tin ki ến th ức mà ta s ẽ đi sâu trong các ph ần sau. Bên c ạnh đó, nó cũng cung c ấp đế n ng ười đọc l ịch s ử phát tri ển c ủa Verilog. Cùng v ới vi ệc phát tri ển chu ẩn Verilog HDL này là s ự phát tri ển không ng ừng c ủa các công ty nghiên c ứu, xây d ựng và hoàn thi ện các công c ụ h ỗ tr ợ đi kèm, k ết qu ả là t ạo ra nh ững công c ụ t ốt h ơn và nh ững môi tr ường thi ết k ế đồ ng b ộ hơn. 1.4 Bài t ập 1. Verilog là gì ? T ại sao ta ph ải s ử d ụng ngôn ng ữ mô t ả ph ần c ứng Verilog trong thi ết k ế Chip? 2. Tìm hi ểu môi tr ường thi ết k ế trên FPGA là QuartusII của Altera và tìm hi ểu môi tr ường mô ph ỏng và môi tr ường t ổng h ợp c ủa nó. Hãy liên t ưởng so sánh môi tr ường thi ết k ế này v ới môi tr ường mô ph ỏng và t ổng h ợp mà đã được trình bày trong ph ần này. 20
  24. Ch ươ ng 1. Dẫn nh ập thi ết k ế hệ th ống s ố v ới Verilog 3. Nêu s ự khác bi ệt gi ữa ngôn ng ữ mô t ả ph ần c ứng nói chung (ngôn ng ữ Verilog HDL nói riêng) và ngôn ng ữ l ập trình nói chung (ngôn ng ữ C nói riêng). 4. Tìm hi ểu s ự khác bi ệt gi ữa hai lo ại ngôn ng ữ mô t ả ph ần c ứng Verilog HDL và VHDL. 5. Quá trình t ổng h ợp (synthesis) là gì? 6. Verilog HDL có th ể được s ử d ụng để mô t ả m ạch t ươ ng t ự (analog) trong ph ần c ứng không ? 7. Tìm ki ếm 3 công c ụ mô ph ỏng Verilog HDL hỗ tr ợ mi ễn phí. 8. Tìm ki ếm 3 tài li ệu h ỗ tr ợ vi ệc h ọc và nghiên c ứu Verilog HDL. 9. Tìm ki ếm 3 website h ỗ tr ợ vi ệc h ọc và nghiên c ứu Verilog HDL. 10. Tìm ki ếm các công ty thi ết k ế chip ở Vi ệt Nam đang s ử d ụng Verilog HDL trong vi ệc thi ết k ế. 11. Tìm hi ểu và s ử d ụng thành th ạo hai công c ụ mô ph ỏng QuartusII và ModelSim. 21
  25. Ch ươ ng 2. Qui ước v ề t ừ khóa Ch ươ ng 2. Qui ước v ề t ừ khóa 2.1 Kho ảng tr ắng Kho ảng tr ắng có th ể ch ứa nh ững kí t ự đặ c bi ệt nh ư kí t ự space, kí t ự tab, kí t ự xu ống dòng. Nh ững kí t ự này có th ể được b ỏ qua tr ừ khi nó được sử d ụng để tách bi ệt v ới nh ững kí t ự đặc bi ệt mang ý ngh ĩa khác. Tuy nhiên, nh ững kí t ự kho ảng tr ắng và kí t ự tab có th ể được xem nh ư nh ững kí tự đặ c bi ệt trong chu ỗi (xem trong m ục 2.5). 2.2 Chú thích Ngôn ng ữ Verilog HDL có hai cách để t ạo chú thích. “Chú thích m ột dòng” có th ể b ắt đầ u b ằng hai kí t ự // và k ết thúc v ới m ột dòng m ới. “Chú thích m ột kh ối” s ẽ b ắt đầ u v ới m ột /* và k ết thúc v ới */. Chú thích kh ối không nên quá r ối r ắm. Trong chú thích kh ối thì hai kí t ự // không mang ý ngh ĩa gì đặc bi ệt c ả. 2.3 Toán t ử Nh ững toán t ử nh ư chu ỗi kí t ự đơn, kép hay g ồm ba kí t ự được dùng trong nh ững bi ểu th ức. Trong ph ần th ảo lu ận v ề bi ểu th ức ta s ẽ trình bày v ề cách s ử d ụng các toán t ử trong bi ểu th ức nh ư th ế nào. Nh ững toán t ử đơn th ường xu ất hi ện bên trái c ủa toán h ạng c ủa chúng. Nh ững toán t ử kép th ường xu ất hi ện ở gi ữa nh ững toán h ạng c ủa chúng. Toán t ử có điều ki ện th ường có hai toán t ử kí t ự được phân bi ệt b ởi ba toán h ạng 22
  26. Ch ươ ng 2. Qui ước v ề t ừ khóa 2.4 Số h ọc Hằng s ố được mô t ả nh ư là h ằng s ố nguyên ho ặc h ằng s ố th ực. Ví d ụ 2.1 243 // số th ập phân 1.4E9 // 1.4x10 9 -5’d18 // s ố th ập phân -18 l ưu trong 5 bit 4’b1011 // s ố nh ị phân 1011 l ưu trong 4 bit 8’hEF // s ố th ập l ục phân EF l ưu trong 8 bit 16’o56 // s ố bát phân 56 l ưu trong 16 bit 4’bxxxx // số nh ị phân tùy định 4’bzzzz // số nh ị phân có giá tr ị t ổng tr ở cao 2.4.1 Hằng s ố nguyên Hằng s ố nguyên có th ể được mô tả theo đị nh d ạng s ố th ập phân, th ập lục phân, bát phân và nh ị phân. Có hai d ạng để bi ểu di ễn h ằng s ố nguyên. D ạng th ứ nh ất là m ột số th ập phân đơn gi ản, nó có th ể là m ột chu ỗi kí t ự t ừ 0 đế n 9 và có th ể b ắt đầu v ới toán t ử đơn c ộng ho ặc tr ừ. D ạng th ứ hai được mô t ả d ưới d ạng hằng c ơ s ố, nó g ồm ba thành ph ần – một là thành ph ần mô t ả độ r ộng h ằng số, m ột thành ph ần là kí t ự móc đơn (‘) được theo sau b ởi m ột kí t ự c ủa c ơ số t ươ ng ứng (‘D), và thành ph ần cu ối cùng mô t ả giá tr ị c ủa s ố đó. Ví d ụ 2.2 Hằng s ố không d ấu 374 // s ố th ập phân ‘h 473FF // s ố th ập l ục phân ‘o7439 // s ố bát phân 23
  27. Ch ươ ng 2. Qui ước v ề t ừ khóa 5be // không h ợp l ệ ( s ố th ập l ục phân đòi h ỏi ‘h) Thành ph ần đầ u tiên, độ r ộng h ằng s ố, mô t ả độ r ộng s ố bit để ch ứa hằng s ố. Nó được mô t ả nh ư là m ột s ố th ập phân không d ấu khác không. Ví dụ, độ r ộng c ủa hai s ố hexadecimal là 8 bit b ởi vì m ỗi m ột s ố hexadecimal cần 4 bit để ch ứa. Thành ph ần th ứ hai, đị nh d ạng c ơ s ố, bao g ồm m ột kí t ự có th ể kí t ự th ường ho ặc kí t ự hoa để mô t ả c ơ s ố c ủa s ố đó, ta có th ể thêm vào ho ặc không thêm vào phía tr ước nó kí t ự s (ho ặc S) để ch ỉ r ằng nó là m ột s ố có dấu, ti ếp t ục phía tr ước nó là m ột kí t ự móc đơn. Nh ững c ơ s ố được dùng có th ể là d, D, h, H, o, O, b, B để mô t ả cho c ơ s ố th ập phân, c ơ s ố th ập l ục phân, c ơ s ố bát phân và c ơ s ố nh ị phân m ột cách t ươ ng ứng. Kí t ự móc đơn và kí t ự đị nh d ạng c ơ s ố không được cách nhau b ởi bất kì kho ảng tr ắng nào. Thành ph ần th ứ ba, m ột s ố không d ấu, bao g ồm nh ững kí t ự phù h ợp với c ơ s ố đã được mô t ả trong thành ph ần th ứ hai. Thành ph ần s ố không dấu này có th ể theo sau ngay thành ph ần c ơ s ố ho ặc có th ể theo sau thành ph ần c ơ s ố b ởi m ột kho ảng tr ắng. Nh ững kí t ự t ừ a đế n f c ủa s ố th ập l ục phân có th ể là kí t ự th ường ho ặc kí t ự hoa. Ví d ụ 2.3 Hằng s ố có độ r ộng bit 4’b1011 // s ố nh ị phân 4 bit 5 ‘D 5 // s ố th ập phân 5 bit 3’b10x // s ố nh ị phân 3 bit v ới bit có tr ọng s ố th ấp nh ất có giá tr ị không xác đị nh 12’hx // s ố th ập l ục phân 12 bit có giá tr ị không xác định 16’hz // s ố th ập l ục phân 16 bit có giá tr ị t ổng tr ở cao. 24
  28. Ch ươ ng 2. Qui ước v ề t ừ khóa Nh ững s ố th ập phân đơn gi ản không kèm theo độ r ộng bit và định dạng cơ s ố có th ể được xem nh ư là nh ững s ố nguyên có d ấu, trong khi đó nh ững s ố được mô t ả b ởi đị nh d ạng c ơ s ố có th ể được xem nh ư nh ững s ố nguyên có d ấu khi thành ph ần ch ỉ đị nh s được kèm thêm vào ho ặc nó s ẽ được xem nh ư nh ững s ố nguyên không d ấu khi ch ỉ có thành ph ần đị nh dạng c ơ s ố được s ử d ụng. Thành ph ần ch ỉ đị nh s ố có d ấu s không ảnh hưởng đế n m ẫu bit được mô t ả mà nó ch ỉ ảnh h ưởng trong quá trình biên dịch. Toán t ử c ộng hay tr ừ đứ ng tr ước h ằng s ố độ r ộng là m ột toán t ử đơn cộng hay tr ừ. Hai toán t ử này n ếu được đặ t n ằm gi ữa thành ph ần đị nh d ạng cơ s ố và s ố là không đúng cú pháp. Nh ững s ố âm được bi ểu di ễn d ưới d ạng bù hai. Ví d ụ 2.4 Sử d ụng d ấu v ới h ằng s ố 6 ‘d -7 // cú pháp không đúng -6 ‘d 7 // s ố bù 2 c ủa 7, t ươ ng đươ ng v ới –(6’d 7) 4 ‘shf // s ố có d ấu (s ố bù 2) 4 bit ‘1111’, b ằng -1, t ươ ng đươ ng v ới –4’h1 -4 ‘sd15 // t ươ ng đươ ng v ới –(4’sd15), hay –(-1) = 1 = 0001 8’sd? //t ươ ng đươ ng 8’sbz Các giá tr ị s ố đặ c bi ệt x và z: -Một s ố x dùng để bi ểu diễn m ột giá tr ị không xác đị nh trong nh ững hằng s ố th ập l ục phân, h ằng s ố bát phân và h ằng s ố nh ị phân. -Một s ố z dùng để bi ểu di ễn m ột s ố có giá tr ị t ổng tr ở cao. Một s ố x có th ể được thi ết l ập trên 4 bit để bi ểu di ễn m ột s ố th ập l ục phân, trên 3 bit để bi ểu di ễn m ột s ố bát phân, trên 1 bit để bi ểu di ễn m ột s ố nh ị phân có giá tr ị không xác đị nh. T ươ ng t ự, m ột s ố z có th ể được thi ết l ập 25
  29. Ch ươ ng 2. Qui ước v ề t ừ khóa trên 4 bit để bi ểu di ễn m ột s ố th ập l ục phân, trên 3 bit để bi ểu di ễn m ột s ố bát phân, trên 1 bit để bi ểu di ễn m ột s ố nh ị phân có giá tr ị t ổng tr ở cao. Ví d ụ 2.5 Tự độ ng thêm vào bên trái reg [11:0] m, n, p, q; initial begin m = ‘h x; // t ạo ra xxx n = ‘h 4x; // t ạo ra 04x p = ‘h z5; // t ạo ra zz5 q = ‘h 0z8; // tạo ra 0z8 end reg [15:0] e, f, g; e = ‘h4; // t ạo ra {13{1’b0}, 3’b100} f = ‘hx // t ạo ra {16{1’hx}} g = ‘hz; // t ạo ra {16{1’hz}} Nếu độ r ộng bit c ủa s ố không d ấu nh ỏ h ơn độ r ộng được mô t ả trong ph ần mô t ả h ằng s ố thì s ố không d ấu s ẽ được thêm vào bên trái nó là các s ố 0. N ếu bít ngoài cùng bên trái trong s ố không d ấu là x ho ặc z thì m ột x ho ặc m ột z s ẽ được dùng để thêm vào bên trái m ột cách t ươ ng ứng. N ếu độ rộng c ủa s ố không d ấu l ớn h ơn độ r ộng được mô t ả trong ph ần mô t ả h ằng số thì s ố không d ấu s ẽ b ị c ắt xén đi t ừ bên trái. Số bit dùng để t ạo nên m ột s ố không có độ r ộng ( có th ể là m ột s ố th ập phân đơn gi ản ho ặc m ột s ố không mô t ả độ r ộng bit) nên ít nh ất là 32 bit. Nh ững h ằng s ố không d ấu, không độ r ộng mà bit có tr ọng s ố cao là không xác định (x) ho ặc t ổng tr ở cao (z) thì nó s ẽ được m ở r ộng ra đế n độ rộng c ủa bi ểu th ức ch ứa h ằng s ố. Giá tr ị x và z để mô t ả giá tr ị c ủa m ột s ố có th ể là ch ữ hoa ho ặc ch ữ th ường. 26
  30. Ch ươ ng 2. Qui ước v ề t ừ khóa Khi được s ử d ụng để mô t ả m ột s ố trong Verilog, thì kí t ự d ấu ch ấm hỏi (?) có ý ngh ĩa thay th ế cho kí t ự z. Nó c ũng thi ết l ập 4 bit lên giá tr ị tổng tr ở cao cho s ố th ập l ục phân, 3 bit cho s ố bát phân và 1 bit cho s ố nh ị phân. D ấu ch ấm h ỏi có th ể được dùng để giúp vi ệc đọ c code d ễ hi ểu h ơn trong tr ường h ợp giá tr ị t ổng tr ở cao là một điều ki ện không quan tâm (don’t care). Ta s ẽ th ảo lu ận rõ h ơn v ề v ấn đề này khi trình bày v ề casez và casex. Kí t ự d ấu ch ấm h ỏi c ũng được dùng trong nh ững b ảng tr ạng thái do ng ười dùng t ự đị nh ngh ĩa. Trong m ột h ằng s ố th ập phân, s ố không d ấu không bao gồm nh ững kí t ự x, z ho ặc ? tr ừ tr ường h ợp ở đó ch ỉ có đúng m ột kí t ự để ch ỉ ra r ằng mọi bit trong h ằng s ố th ập phân là x ho ăc z. Kí t ự g ạch d ưới (_) có th ể dùng ở b ất kì n ơi đâu trong m ột s ố, ngo ại tr ừ kí t ự đầ u tiên. Kí t ự g ạch d ưới s ẽ được b ỏ qua. Đặ c tính này có th ể được dùng để tách m ột s ố quá dài để giúp vi ệc đọ c code d ễ dàng h ơn. Ví d ụ 2.6 Sử d ụng d ấu g ạch d ưới trong mô t ả s ố 27_195_000 16’b0011_0101_0001_1111 32 ‘h 12ab_f001 Nh ững h ằng s ố âm có độ r ộng bit và nh ững h ằng s ố có d ấu có độ rộng bit là nh ững s ố có d ấu m ở r ộng khi nó được gán đế n m ột lo ại d ữ li ệu là reg b ất ch ấp b ản thân reg này có d ấu hay không. Độ dài m ặc đị nh c ủa x và z gi ống nh ư độ dài m ặc đị nh c ủa m ột s ố nguyên. 2.4.2 Hằng số th ực Nh ững s ố h ằng s ố th ực có th ể được bi ểu di ễn nh ư được mô t ả b ởi chu ẩn IEEE 754-1985, m ột chu ẩn IEEE cho nh ững s ố dấu ch ấm độ ng có độ chính xác kép. 27
  31. Ch ươ ng 2. Qui ước v ề t ừ khóa Nh ững s ố th ực có th ể được mô t ả b ằng m ột trong hai cách, m ột là theo d ạng th ập phân (ví d ụ, 25.13), hai là theo cách vi ết hàn lâm (ví d ụ, 45e6, có ngh ĩa là 45 nhân v ới 10 6. Nh ững s ố th ực được bi ểu di ễn v ới d ấu ch ấm th ập phân s ẽ có ít nh ất m ột kí s ố ở mỗi bên c ủa d ấu ch ấm th ập phân. Ví d ụ 2.7 2.5 0.9 1543.34592 3.2E23 or 3.2e23 5.6e-3 0.9e-0 45E13 43E-6 354.156_972_e-19 (d ấu g ạch d ưới được b ỏ qua) Nh ững d ạng s ố sau không đúng là s ố th ực vì chúng không có ít nh ất một kí s ố ở m ỗi bên c ủa d ấu ch ấm th ập phân. .43 8. 7.E4 .6e-9 2.4.3 Số đả o Số th ực có th ể bi ến đổ i sang s ố nguyên b ằng cách làm tròn s ố th ực đến s ố nguyên g ần nh ất thay vì c ắt xén s ố bit c ủa nó. Bi ến đổ i không t ường minh có th ể th ực hi ện khi m ột s ố th ực được gán đế n m ột s ố nguyên. Nh ững cái đuôi nên được làm tròn khác 0. Ví d ụ: 28
  32. Ch ươ ng 2. Qui ước v ề t ừ khóa Hai s ố th ực 48.8 và 48.5 đều tr ở thành 49 khi được biến đổ i sang s ố nguyên, và s ố 48.3 s ẽ tr ở thành 48. Bi ến đổ i s ố th ực -5.5 sang s ố nguyên s ẽ được -6, bi ến đổ i s ố 5.5 sang số nguyên s ẽ được 6. 2.5 Chu ỗi Một chu ỗi là m ột dãy các kí t ự được n ằm trong hai d ấu nháy kép(“”) và được ghi trên m ột dòng đơ n. Những chu ỗi được dùng nh ư là nh ững toán hạng trong bi ểu th ức và trong nh ững phép gán được xem nh ư là nh ững hằng s ố nguyên không d ấu và được bi ểu di ễn b ởi m ột dãy kí t ự 8 bit ASCII. M ột kí t ự ASCII bi ểu di ễn b ằng 8 bit. 2.5.1 Khai báo bi ến chu ỗi Bi ến chu ỗi là bi ến có lo ại d ữ li ệu là reg v ới độ r ộng b ằng v ới s ố kí t ự trong chu ỗi nhân v ới 8. Ví d ụ 2.8 Để l ưu tr ữ một chu ỗi 12 kí t ự “Verilog HDL!” đòi h ỏi m ột reg có độ rộng 8*12, ho ặc 96 bit reg [8*12:1] stringvar; initial begin stringvar = “Verilog HDL!”; end 29
  33. Ch ươ ng 2. Qui ước v ề t ừ khóa 2.5.2 Xử lí chu ỗi Chu ỗi có th ể được x ử lí b ằng vi ệc s ử d ụng các toán t ử Verilog HDL. Giá tr ị mà được x ử lí b ởi toán t ử là m ột dãy giá tr ị 8 bit ASCII. Các toán t ử xử lý chu ỗi được th ể hi ện chi ti ết h ơn trong ph ần 4.3.3. 2.5.3 Nh ững kí t ự đặ c bi ệt trong chu ỗi Một s ố kí t ự ch ỉ được s ử d ụng trong chu ỗi khi đứ ng tr ước nó là m ột kí t ự m ở đầ u, g ọi là kí t ự escape “\”. B ảng bên d ưới li ệt kê những kí t ự này và ý ngh ĩa c ủa nó. Bảng 2.1 Kí t ự đặ c bi ệt trong chu ỗi Chu ỗi escape Kí t ự t ạo b ởi chu ỗi escape \n Kí t ự xu ống dòng \t Kí t ự tab \\ Kí t ự \ \” Kí t ự “ \ddd Một kí t ự được mô t ả trong 1-3 kí s ố bát phân (0 ≤d≤7) Nếu ít h ơn ba kí t ự được s ử d ụng, kí t ự theo sau không th ể là m ột kí s ố bát phân. Vi ệc th ực thi có th ể d ẫn đế n l ỗi n ếu kí t ự được bi ểu di ễn l ớn h ơn 377 2.6 Định danh, t ừ khóa và tên h ệ th ống Định danh (indentifier) được dùng để gán cho m ột đố i t ượng (object) một tên duy nh ất để nó có th ể được g ọi t ới khi c ần. Đị nh danh có th ể là m ột định danh đơn gi ản ho ặc m ột đị nh danh escaped. M ột đị nh danh đơ n gi ản có th ể là m ột dãy b ất kì g ồm các kí t ự, kí s ố, d ấu dollar ($), và kí t ự g ạch dưới (_). 30
  34. Ch ươ ng 2. Qui ước v ề t ừ khóa Kí t ự đầ u tiên của m ột đị nh danh không th ể là m ột kí s ố hay $; nó có th ể là m ột kí t ự ho ặc một d ấu g ạch d ưới. Đị nh danh sẽ là khác nhau gi ữa ch ữ th ường và ch ữ hoa nh ư trong ngôn ng ữ l ập trình C. Ví d ụ 2.9 kiemtra_e net_m fault_result string_ab _wire1 n$983 Ở đây có s ự gi ới hạn v ề độ dài c ủa đị nh danh, nh ưng gi ới h ạn này ít nh ất là 1024 kí t ự. N ếu m ột đị nh danh vượt ra kh ỏi gi ới h ạn v ề chi ều dài đã được xác đị nh thì l ỗi có th ể được thông báo ra. 2.6.1 Định danh v ới kí t ự “\” Tên định danh escaped được bắt đầ u v ới kí t ự g ạch chéo (\) và k ết thúc b ởi kho ảng tr ắng (kí t ự kho ảng tr ắng, kí t ự tab, kí t ự xu ống dòng). Chúng cung c ấp cách th ức để chèn thêm nh ững kí t ự ASCII có th ể in được vào trong các kí t ự có code từ 33 đế n 126, ho ặc giá tr ị th ập l ục phân t ừ 21 đến 7E). Cả hai kí t ự g ạch chéo (\) và kí t ự kho ảng tr ắng k ết thúc đề u không được xem nh ư là thành ph ần c ủa tên nh ận dạng. Do đó, m ột đị nh danh “\abc” sẽ được x ử lí gi ống như định danh “abc”. Ví d ụ 2.10 \netc+num \-signal 31
  35. Ch ươ ng 2. Qui ước v ề t ừ khóa \ fault-result \wirea/\wireb \{m,n} \i*(k+l) Một t ừ khóa trong Verilog HDL mà đứng tr ước nó là m ột kí t ự escape s ẽ không được biên d ịch nh ư là m ột t ừ khóa. 2.6.2 Tác v ụ h ệ th ống và hàm h ệ th ống Dấu dollar ($) mở đầ u m ột c ấu trúc ngôn ng ữ s ẽ cho phép phát tri ển nh ững tác v ụ h ệ th ống và hàm h ệ th ống do ng ười dùng định ngh ĩa. Nh ững cấu trúc h ệ th ống không ph ải là ngôn ng ữ thi ết k ế, mà nó mu ốn nói đế n ch ức n ăng mô ph ỏng. M ột tên theo sau d ấu $ được biên d ịch nh ư là một tác vụ h ệ th ống ho ặc hàm h ệ th ống. Tác v ụ h ệ th ống/hàm h ệ th ống có th ể được đị nh ngh ĩa trong ba vi trí: Một t ập h ợp chu ẩn nh ững tác v ụ h ệ th ống và hàm h ệ th ống. Nh ững tác v ụ h ệ th ống và hàm h ệ th ống thêm vào được đị nh ngh ĩa dùng cho PLI (Programming Language Interface). Nh ững tác v ụ h ệ th ống và hàm h ệ th ống thêm vào được đị nh ngh ĩa b ởi th ực thi ph ần m ềm. Ví d ụ 2.11 $time – tr ả v ề th ời gian ch ạy mô ph ỏng hi ện t ại $display – tươ ng t ự nh ư hàm printf trong C $stop – ng ừng ch ạy mô ph ỏng $finish – hoàn thành ch ạy mô ph ỏng $monitor – giám sát ch ạy mô ph ỏng 32
  36. Ch ươ ng 2. Qui ước v ề t ừ khóa 2.7 Bài t ập 1. Nêu tác d ụng và s ự khác bi ệt gi ữa hai hàm h ệ th ống $monitor và $display khi s ử d ụng hai hàm h ệ th ống này trong quá trình mô ph ỏng. 2. Làm sao có th ể đọc và ghi m ột file d ữ li ệu trong mô t ả ph ần c ứng Verilog HDL (gi ả s ử file ch ứa n ội dung b ộ nh ớ kh ởi t ạo). 3. Hãy tìm thêm 10 tác v ụ h ệ th ống và nêu ý ngh ĩa c ủa chúng 33
  37. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog 3.1 Khái quát Verilog ch ỉ h ỗ tr ợ nh ững lo ại d ữ li ệu đã được đị nh ngh ĩa tr ước. Nh ững lo ại d ữ li ệu này bao g ồm d ữ li ệu bit, m ảng bit, vùng nh ớ, s ố nguyên, s ố th ực, s ự ki ện, và độ m ạnh c ủa d ữ li ệu. Nh ững lo ại này định ngh ĩa trong ph ần l ớn mô t ả c ủa Verilog. Verilog ch ủ y ếu x ử lí trên bit và byte khi mô t ả m ạch điện t ử. Lo ại s ố th ực thì h ữu d ụng trong vi ệc mô t ả độ trì hoãn và định th ời và nó c ũng r ất h ữu d ụng trong vi ệc mô hình hóa ở mức cao nh ư là phân tích xác su ất k ết n ối m ạch trong h ệ th ống và nh ững gi ải thu ật x ử lí tín hi ệu s ố. Lo ại d ữ li ệu ph ần c ứng bao g ồm net và reg. Thông th ường nh ững lo ại này có th ể được xem nh ư là dây k ết n ối và thanh ghi. D ữ li ệu net có th ể được khai báo chi ti ết h ơn để t ạo ra nh ững lo ại d ữ li ệu khác nh ư tri-stated hay non-tri-stated và ph ụ thu ộc vào các x ử lí nhi ều kết n ối s ẽ t ạo ra nh ững phép and, or ho ặc dùng giá tr ị tr ước đó. Ph ần ti ếp theo s ẽ trình bày chi ti ết v ề nh ững v ấn đề này. 3.2 Nh ững h ệ th ống giá tr ị Mỗi lo ại d ữ li ệu có nh ững m ục đích c ụ th ể c ủa nó trong vi ệc mô t ả. Nh ững h ệ th ống giá tr ị đị nh ngh ĩa nh ững lo ại giá tr ị khác nhau đã được định ngh ĩa trong ngôn ng ữ và bao g ồm c ả nh ững thao tác giúp h ỗ tr ợ nh ững hệ th ống giá tr ị này. Chúng c ũng có nh ững đị nh ngh ĩa h ằng s ố t ươ ng ứng. Trong Verilog có nhi ều giá tr ị khác nhau nh ư: bits and integers(32 bits), time (64 bits) – bit-vectors và integers có th ể ph ối h ợp m ột cách t ự do. Integers được đị nh 34
  38. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog ngh ĩa có 32 bit. Giá tr ị time có 64 bit. Th ực s ự bit có hai lo ại sau:  4 giá tr ị tr ạng thái (0,1,x,z); được bi ết nh ư là giá tr ị logic.  128 lo ại tr ạng thái (4 tr ạng thái và 64 độ m ạnh (8 cho độ mạnh ‘0’ và 8 cho độ m ạnh ‘1’) Lo ại floating point (số th ực) Chu ỗi kí t ự Giá tr ị độ trì hoãn – Nh ững giá tr ị này có th ể là single, double, triplet hay n-tuple để ch ỉ độ trì hoãn c ạnh lên, c ạnh xu ống ho ặc s ự chuy ển đổ i khác c ủa tín hi ệu. Giá tr ị chuy ển tr ạng thái – (01) – chuy ển tr ạng thái t ừ 0 sang 1. Giá tr ị này có th ể có trong nh ững linh ki ện c ơ b ản do ng ười dùng định ngh ĩa ho ặc trong nh ững kh ối mô t ả (specify blocks) Nh ững giá tr ị có điều ki ện/Boole – true/false ho ặc 0/1 units (ch ỉ dùng cho timescale) – femtoseconds (Fs) đến seconds (s) 3.3 Khai báo lo ại d ữ li ệu 3.3.1 Gi ới thi ệu Nh ững lo ại d ữ li ệu khác nhau trong Verilog được khai báo b ằng phát bi ểu khai báo d ữ li ệu. Nh ững phát bi ểu này xu ất hi ện trong nh ững đị nh ngh ĩa module tr ước khi s ử d ụng và m ột s ố trong chúng có th ể được khai báo bên trong nh ững kh ối tu ẩn t ự được đặ t tên. Thêm vào đó, nh ững lo ại giá tr ị có th ể phân bi ệt v ới nh ững lo ại c ủa d ữ li ệu khác, nh ững đặ c tính ph ần c ứng c ủa wires so v ới registers c ũng được phân bi ệt nh ư là nh ững khai báo net so v ới khai báo reg trong Verilog. T ừ “driving” ngh ĩa là điều 35
  39. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog khi ển được dùng trong nh ững mô t ả ph ần c ứng để mô t ả cách th ức m ột giá tr ị được gán đế n m ột ph ần t ử. Nets và regs là hai ph ần t ử d ữ li ệu chính trong Verilog. Nets được điều khi ển m ột cách n ối ti ếp t ừ nh ững phép gán nối ti ếp (continuous assignments) ho ặc t ừ nh ững ph ần t ử c ấu trúc nh ư module ports, gates, transistors ho ặc nh ững ph ần t ử c ơ b ản do ng ười dùng tự đị nh ngh ĩa. Regs được điều khi ển m ột cách chặt ch ẽ t ừ nh ững kh ối hành vi (behavioural blocks). Nets thông th ường được th ực thi nh ư là wires trong ph ần c ứng và regs thì có th ể là wires ho ặc ph ần t ử t ạm ho ặc flip-flops (registers). Nh ững lo ại d ữ li ệu khác nhau trong Verilog được khai báo nh ư là một trong nh ững lo ại sau: parameter: Lo ại này là nh ững bi ểu th ức giá tr ị hằng s ố được phân tích sau quá trình biên d ịch và cho phép modules được gán tham s ố. input, output, inout : Nh ững lo ại d ữ li ệu này định ngh ĩa chi ều và độ r ộng c ủa m ột port. net: Đây là lo ại d ữ li ệu dùng cho vi ệc k ết n ối ho ặc wire trong ph ần c ứng v ới s ự phân tích khác nhau. reg: Đây là lo ại d ự li ệu tr ừu t ượng gi ống nh ư là m ột thanh ghi (register) và được điều khi ển theo hành vi. time: Đây là lo ại d ữ li ệu l ưu tr ữ kho ảng th ời gian nh ư độ trì hoãn và th ời gian mô ph ỏng. integer: Đây là lo ại d ữ li ệu s ố nguyên. real: Đây là lo ại d ữ li ệu floating point hay s ố th ực event: Đây là d ữ li ệu để ch ỉ ra r ằng m ột c ờ hi ệu được b ật tích cực. Nh ững lo ại d ữ li ệu này t ất c ả có th ể được khai báo ở m ức độ module. Nh ững mô t ả khác trong Verilog v ới nh ững kh ả n ăng t ạo l ập m ục đích bao 36
  40. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog gồm nh ững tác v ụ, nh ững hàm và nh ững kh ối begin-end được đặ t tên. Nets được điều khi ển không theo hành vi (non-behaviorally) nên do đó nó không th ể được khai báo cho nh ững m ục đích khác. T ất c ả nh ững lo ại d ữ li ệu khác có th ể được th ể hi ện trong nh ững tác v ụ và trong nh ững kh ối begin- end. Ví d ụ 3.1 input a, b; reg [15:0] c; time tg; Dòng đầu tiên trong ví d ụ trên là m ột dòng khai báo input, dòng th ứ hai là m ột khai báo d ữ li ệu reg 16 bit. Dòng cu ối cùng là khai báo cho một bi ến được đặ t tên là tg. 3.4 Khai báo lo ại d ữ li ệu net 3.4.1 Gi ới thi ệu Net là m ột trong nhi ều lo ại d ữ li ệu trong ngôn ng ữ mô t ả Verilog dùng để mô t ả dây k ết n ối v ật lí trong m ạch điện. Net s ẽ k ết n ối nh ững linh ki ện ở m ức c ổng được g ọi ra, nh ững module được g ọi ra và nh ững phép gán n ối ti ếp. Ngôn ng ữ Verilog cho phép đọ c giá tr ị t ừ m ột net t ừ bên trong nh ững mô t ả hành vi, nh ưng ta không th ể gán m ột giá tr ị t ừ m ột net bên trong nh ững mô t ả hành vi. M ột net s ẽ không l ưu gi ữ giá tr ị c ủa nó. Nó ph ải được điều khi ển b ởi m ột trong hai cách sau. Bằng vi ệc k ết n ối net đế n ngõ ra c ủa m ột c ổng hay m ột module. Bằng vi ệc gán m ột giá tr ị đế n net trong m ột phép gán n ối ti ếp. 37
  41. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog Nh ững lo ại net khác nhau được đị nh ngh ĩa trong Verilog được mô t ả bên d ưới và trong Bảng 3.1 sẽ tóm t ắt s ự phân gi ải logic của chúng. S ự phân gi ải logic là m ột qui đị nh để gi ải quy ết xung độ t x ảy ra khi có nhi ều mức logic điều khi ển m ột net. Wire: một net v ới giá tr ị 0,1,x và s ự phân gi ải logic được d ựa trên s ự t ươ ng đươ ng. Wand: một net v ới giá tr ị 0,1,x và s ự phân gi ải logic được d ựa trên nguyên t ắc c ủa phép wired and Wor: một net v ới giá tr ị 0,1,x và s ự phân gi ải logic được d ựa trên wired or Tri: một net v ới giá tr ị 0,1,x,z và s ự phân gi ải logic được d ựa trên nguyên t ắc c ủa bus tri-state Tri0: một net v ới giá tr ị 0,1,x,z và s ự phân gi ải logic được d ựa trên nguyên t ắc của bus tri-state và m ột giá tr ị m ặc đị nh là 0 khi không được điều khi ển Tri1: một net v ới giá tr ị 0,1,x,z và s ự phân gi ải logic được d ựa trên nguyên t ắc của bus tri-state và m ột giá tr ị m ặc đị nh là 1 khi không được điều khi ển Trior: một net v ới giá tr ị 0,1,x,z và s ự phân gi ải logic được dựa trên nguyên t ắc của tri-state cho giá tr ị z-non-z s ử d ụng hàm ‘or’ c ủa giá tr ị non-z Triand: một net v ới giá tr ị 0,1,x,z và s ự phân gi ải logic được dựa trên nguyên t ắc của tri-state cho giá tr ị z-non-z s ử d ụng hàm ‘and’ c ủa giá tr ị non-z Trireg: một net v ới giá tr ị 0,1,x,z và s ự phân gi ải logic được dựa trên nguyên t ắc của tri-state cùng v ới giá tr ị l ưu tr ữ điện tích (giá tr ị tr ước được dùng để phân gi ải giá tr ị m ới) Supply0, supply1 (gnd và vdd) 38
  42. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog Bảng 3.1 Sự phân gi ải c ủa các lo ại net tri/wire 0 1 X Z triand/wand 0 1 X Z 0 0 X X 0 0 0 0 0 0 1 X 1 X 1 1 0 1 X 1 X X X X X X 0 X X X Z 0 1 X X Z 0 1 X Z trior/wor 0 1 X Z tri0 0 1 X Z 0 0 1 X 0 0 0 0 0 0 1 1 1 1 1 1 X 1 X 1 X X 1 X X X X X X X Z 0 1 X Z Z 0 1 X 0 trireg 0 1 X Z tri1 0 1 X Z 0 0 1 X 0 0 0 X X 0 1 1 1 1 1 1 X 1 X 1 X X 1 X X X X X X X Z 0 1 X P Z 0 1 X 1 3.4.2 Wire và Tri Lo ại d ữ li ệu wire là một lo ại đơ n gi ản để k ết n ối gi ữa hai linh ki ện. D ữ li ệu wire dùng cho nh ững net được điều khi ển b ởi m ột c ổng linh ki ện đơn hay trong phép gán n ối ti ếp (continuous assignments). Trong Ví d ụ 3.2 nh ững khai báo 2-wire được t ạo ra. Khai báo đầ u tiên mô t ả wire đơn ( scalar wire ) a1. Khai báo thứ hai mô t ả m ột m ảng (vector) b2 v ới 3 bits. Bit tr ọng s ố cao nh ất (MSB) c ủa nó có tr ọng s ố là 2 và bit tr ọng s ố th ấp nh ất (ISB) có tr ọng s ố là 0. 39
  43. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog Ví d ụ 3.2 wire a1; wire [2:0] b2; tri abc Dữ li ệu tri thì hoàn toàn gi ống v ới d ữ li ệu wire v ề cú pháp s ử d ụng và ch ức n ăng tuy nhiên nó khác v ới d ữ li ệu wire ở ch ỗ, d ữ li ệu tri được dùng cho nh ững net được điều khi ển b ởi nhi ều c ổng linh ki ện ngõ ra. Lo ại dữ li ệu tri (tri-state) là lo ại d ữ li ệu đặ c bi ệt c ủa wire trong đó s ự phân gi ải giá tr ị c ủa net được điều khi ển b ởi nhi ều linh ki ện điều khi ển được th ực hi ện b ằng vi ệc s ử d ụng nh ững qui lu ật c ủa bus tri-state. T ất c ả các bi ến mà điều khi ển net tri ph ải có giá tr ị Z (t ổng tr ở cao), ngo ại tr ừ m ột bi ến. Bi ến đơ n này xác định giá tr ị c ủa net tri. Trong Ví d ụ 3.3, ba bi ến điều khi ển bi ến out. Chúng được thi ết l ập trong module khác để ch ỉ m ột linh ki ện điều khi ển tích c ực trong m ột th ời điểm. Ví d ụ 3.3 module tri_kiemtra (out, m, n,p); input [1:0] select ,m ,n, p; output out; tri out; assign out = m ; t ạo k ết n ối cho net tri assign out = n; assign out = p; endmodule module mnp (m, n, p, select) output m, n, p; input [1:0] select; 40
  44. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog always @( select) begin m = 1’bz; // thi ết l ập t ất c ả các bi ến có giá tr ị Z n = 1’bz; p = 1’bz; case (select) // ch ỉ thi ết l ập m ột bi ến non-Z 2’b00: m = 1’b1; 2’b01: n = 1’b0; 2’b10: p = 1’b1; endcase end endmodule module top_tri_test ( out, m, n, p, select); input [1:0] select; input m, n, p; output out; tri out; mnp (m, n, p, select); tri_test (out, m, n, p); endmodule 3.4.3 Wired net Wired nets bao g ồm nh ững lo ại d ữ li ệu wor, wand, trior và triand. Chúng được d ủng để mô hình giá tr ị logic c ủa net. Nh ững wired net trên có bảng s ự th ật khác nhau để phân gi ải nh ững xung độ t n ếu x ảy ra khi có nhi ều c ổng linh ki ện cùng điều khi ển m ột net. 41
  45. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog 3.4.3.1 Wand/triand nets Wand/triand là lo ại d ữ li ệu đặ c bi ệt c ủa wire dùng hàm and để tìm giá tr ị k ết qu ả khi nhi ều linh ki ện điều khi ển m ột net, hay nói cách khác nếu có b ất kì ngõ ra linh ki ện điều khi ển nào có giá tr ị 0 thì giá tr ị c ủa net được điều khi ển s ẽ là 0. Trong Ví d ụ 3.4, hai bi ến điều khiển bi ến out. Giá tr ị c ủa out được xác định b ằng hàm logic and gi ữa b1 và b2. Ví d ụ 3.4 module wand_test (out, b1,b2); input b1, b2; output out; wand out; assign out = b1; assign out = b2; endmodule Ta có th ể gán m ột giá tr ị trì hoãn trong khai báo wand, và ta có th ể sử d ụng nh ững t ừ khóa đơn (scalar) và m ảng (vector) cho vi ệc mô ph ỏng. 3.4.3.2 Wor/Trior Lo ại d ữ li ệu wor /trior là lo ại d ữ li ệu đặ c bi ệt c ủa wire dùng hàm or để tìm giá tr ị k ết qu ả khi nhi ều linh ki ện điều khi ển m ột net, hay nói cách khác n ếu có b ất kì ngõ ra linh ki ện điều khi ển nào có giá tr ị 1 thì giá tr ị c ủa net được điều khi ển s ẽ là 1. Trong Ví d ụ 3.5, hai bi ến điều khi ển bi ến out. Giá tr ị c ủa out được xác đị nh b ằng hàm logic OR gi ữa a1 và a2. Ví d ụ 3.5 module wor_test(a1,a2); input a1, a2; 42
  46. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog ouput out; wor out; assign out = a1; assign out = a2; endmodule 3.4.4 Trireg net Net trireg được dùng để mô hình giá tr ị điện dung l ưu gi ữ trên net của m ạch điện, nó có kh ả n ăng l ưu gi ữ giá tr ị điện tích. M ột trireg có th ể là một trong hai tr ạng thái sau: Tr ạng thái được điều khi ển (driven state): Khi có ít nh ất m ột ngõ ra của linh ki ện điều khi ển net trireg có giá tr ị 1, 0 ho ặc x thì giá tr ị này s ẽ được truy ền đế n net trireg và giá tr ị này điều khi ển giá tr ị c ủa net trireg. Tr ạng thái l ưu gi ữ điện dung: Khi t ất c ả các ngõ ra c ủa linh ki ện điều khi ển net trireg đề u có giá tr ị t ổng tr ở cao (z) thì net trireg s ẽ l ưu gi ữ giá tr ị cu ối cùng mà nó ở tr ạng thái được điều khi ển. Giá tr ị t ổng tr ở cao c ủa các ngõ ra linh ki ện điều khi ển s ẽ không được truy ền đế n net trireg. Do đó, net trireg s ẽ luôn có giá tr ị 0 hay 1 ho ặc x và không có giá tr ị z. Độ m ạnh giá trị trên net trireg trong tr ạng thái l ưu gi ữ điện dung được mô t ả b ởi độ r ộng, đó có th ể là l ớn (large), v ừa (medium) hay nh ỏ (small) với giá tr ị m ặc đị nh là medium n ếu nó không được mô t ả. Trong tr ạng thái được điều khi ển, độ m ạnh c ủa net trireg s ẽ ph ụ thu ộc vào độ m ạnh c ủa linh ki ện điều khi ển nh ư supply, strong, pull, weak mà ta s ẽ th ảo lu ận sau. Nh ư một mô hình Verilog nh ư phía d ưới, ta s ẽ l ấy được giá tr ị k ết qu ả c ủa wire trireg khi transistor điều khi ển nó b ị t ắt. Ví d ụ 3.6 module kiemtra; 43
  47. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog reg c0, c1, i1, i2; tri d0, d1, d2; trireg d; and (d0, il, i2); nmos nl (d1, d0, c0); nmos n2(d, d1, c1); initial begin $monitor (“time = %d d = %d c0=%d c1=%d d0=%d d1=%d i1=%d i2=%d”, $ time , d, c0, c1, d0, d1, i1, i2); #1 i1 = 1; i2 = l; c0 = l; c1 = 1; #5 c0 = 0; end endmodule Simulation result: time = 0 d= x c0=x c1=x d0=x d1=x i1=x i2=x time = 1 d= 1 c1=1 c1=1 d0=1 d1=1 i1=1 i2=1 time = 6 d= 1 c0=0 c1=1 d0=1 d1=0 i1=1 i2=1 3.4.5 Tri0 và tri1 nets Net tri0 và tri1 dùng để mô hình nh ững net v ới linh ki ện điện tr ở kéo lên ho ặc kéo xu ống. M ột net tri0 s ẽ t ươ ng đươ ng v ới m ột net v ới được điều 44
  48. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog khi ển liên t ục b ởi giá tr ị 0 v ới độ m ạnh pull . M ột net tri1 s ẽ t ươ ng đươ ng với m ột net v ới được điều khi ển liên t ục b ởi giá tr ị 1 v ới độ mạnh pull . Khi không có linh ki ện điều khi ển net tri0, giá tr ị c ủa nó v ẫn là 0 v ới độ m ạnh pull. Khi không có linh ki ện điều khi ển net tri1, giá tr ị c ủa nó v ẫn là 1 v ới độ m ạnh pull . Khi có nhi ều linh ki ện điều khi ển net tri0 ho ặc tri1 thì s ự phân gi ải độ mạnh c ủa các linh ki ện điều khi ển v ới độ m ạnh pull của net tri0 ho ặc tri1 s ẽ xác đị nh giá tr ị c ủa net. 3.4.6 Supply0/supply1 nets Lo ại d ữ li ệu supply0 và supply1 định ngh ĩa nh ững net wire được mắc c ố đị nh đế n m ức logic 0 (n ối đấ t, vss) và logic 1 ( ngu ồn cung c ấp, vdd). Vi ệc s ử d ụng supply0 và supply1 t ươ ng t ự nh ư khai báo m ột wire và sau đó gán giá tr ị 0 ho ặc 1 lên nó. Trong Ví d ụ 3.7, power được n ối lên ngu ồn cung c ấp (luôn là logic 1 – có độ m ạnh l ớn nh ất) và gnd được n ối đến đấ t (ground) ( luôn là logic 0 – có độ m ạnh nh ất). Ví d ụ 3.7 supply0 gnd; supply1 power; 3.4.7 Th ời gian trì hoãn trên net Trong th ực t ế b ất kì net nào trong m ạch điện t ử c ũng t ạo ra độ trì hoãn trên net. Trong Verilog, độ trì hoãn có th ể được khai báo k ết h ợp trong phát bi ểu khai báo net. Nh ững giá tr ị độ trì hoãn này là th ời gian trì hoãn được tính t ừ khi tín hi ệu t ại ngõ ra c ủa linh ki ện điều khi ển thay đổ i cho đến khi tín hi ệu trên net th ực s ự thay đổ i. Độ trì hoãn được mô t ả b ởi số ho ặc bi ểu th ức theo sau bi ểu t ượng ‘#’. Nh ững giá tr ị này là h ằng s ố, 45
  49. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog tham s ố, bi ểu th ức c ủa chúng hay có th ể là nh ững bi ểu th ức độ ng dùng nh ững bi ến s ố khác. Độ trì hoãn có th ể là rise, fall, hay hold (th ời gian thay đổi đế n z) và m ỗi lo ại trì hoãn này có th ể có ba giá tr ị - minimum, typical và maximum. S ự mô t ả độ trì hoãn rise, fall, và hold được phân bi ệt b ởi dấu ph ẩy (,) và s ự mô t ả min-typ-max được phân bi ệt b ởi d ấu hai ch ấm (:). Độ trì hoãn rise bao g ồm th ời gian trì hoãn khi giá tr ị tín hi ệu thay đổ i t ừ 0 lên 1, 0 đến x và t ừ x đế n 1. Độ trì hoãn fall bao g ồm th ời gian trì hoãn khi giá tr ị tín hi ệu thay đổ i t ừ 1 xu ống 0, 1 đế n x và t ừ x đế n 0. Độ trì hoãn hold bao g ồm th ời gian trì hoãn khi giá tr ị tín hi ệu thay đổ i t ừ 0 lên z, 1 đến z và t ừ x đế n z. Khái ni ệm độ trì hoãn này c ũng được dùng cho vi ệc đị nh ngh ĩa độ trì hoãn c ủa c ổng, transistor, linh ki ện c ơ b ản do ng ười dùng t ự định ngh ĩa và nh ững mô t ả hành vi. Ví d ụ 3.8 tri #9 t1, t2; wire #(10,9,8) a1, a2; wand #(10:8:6, 9:8:6) a3; Trong Ví d ụ 3.8, dòng đầu tiên mô t ả t1, t2 có th ời gian trì hoãn rise, fall, hold đều là 9 đơ n v ị th ời gian. Dòng th ứ hai, wire a1 và a2 định ngh ĩa ba giá tr ị khác nhau cho ba s ự thay đổi – 10 cho rise, 9 cho fall và 8 cho hold. Dòng cu ối cùng, wand a3 định ngh ĩa giá tr ị min, type cho c ả ba s ự thay đổi rise, fall, hold. Ví d ụ 3.9 wire a1, a2; tri [7:0] t1, t2; trireg large trg1, trg2; triand [31:0] #(10:5) gate1; 46
  50. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog Trong ví d ụ trên, dòng đầu tiên v ới từ khóa ‘wire’ khai báo a1 và a2 là wire đơ n ( scalar wire hay single bit). Dòng th ứ hai khai báo hai vector wire 8 bit t1 và t2 có lo ại d ữ li ệu là tri. Dòng k ế ti ếp khai báo net có kh ả năng l ưu gi ữ điện dung trg1 và trg2 v ới độ l ớn điện dung là large. Dòng cu ối cùng khai báo m ột net có độ r ộng 32 bit có lo ại d ữ li ệu là triand v ới độ trì hoãn là t ối thi ểu (minimum) và trung bình (typical). 3.5 Khai báo lo ại d ữ li ệu bi ến - reg Khai báo reg được th ực hi ện cho t ất c ả nh ững tín hi ệu mà được điều khi ển t ừ nh ững mô t ả hành vi. Lo ại d ữ li ệu reg l ưu gi ữ m ột giá tr ị được cho đến khi nó được gán m ột giá tr ị m ới trong m ột mô t ả tu ần t ự (kh ối intitial ho ặc always). Lo ại d ữ li ệu reg thì có m ức độ tr ừu t ượng h ơn so v ới lo ại d ữ li ệu net nh ưng nó có quan h ệ m ật thi ết v ới khái ni ệm thanh ghi (register) với kh ả n ăng l ưu gi ữ giá tr ị và có th ể được xem nh ư là m ột register trong ph ần c ứng. Tuy nhiên, chúng c ũng có th ể được xem nh ư là wire ho ặc ph ần tử nh ớ t ạm th ời mà không ph ải là ph ần t ử th ực trong ph ần c ứng, điều này ph ụ thu ộc vào vi ệc s ử d ụng chúng bên trong kh ối mô t ả hành vi. Ví d ụ 3.10 reg reg1, reg2; reg [63:0] data1, data2, data3; 3.6 Khai báo port 3.6.1 Gi ới thi ệu Ta ph ải khai báo th ật t ường minh v ề chi ều (input, output hay bidirectional) c ủa m ỗi port xu ất hi ện trong danh sách khai báo port. Trong 47
  51. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog Verilog định ngh ĩa ba lo ại port khác nhau, đó là input, output và inout. Lo ại dữ li ệu c ủa port có th ể là net ho ặc reg. Loai d ữ li ệu reg ch ỉ có th ể xu ất hi ện ở port output. H ằng s ố và bi ểu th ức luôn n ằm phía d ưới khai báo port. input : t ất c ả port input c ủa m ột module được khai báo v ới m ột phát bi ểu input. Lo ại d ữ li ệu m ặc đị nh c ủa input port là wire và được điều khi ển bởi cú pháp c ủa wire. Ta có th ể khai báo độ r ộng c ủa m ột input nh ư m ột mảng (vector) c ủa nh ững tín hi ệu, gi ống nh ư input b trong ví d ụ d ưới. Nh ững phát bi ểu input có th ể xu ất hi ện ở b ất c ứ v ị trí nào trong mô t ả thi ết kế nh ưng chúng ph ải được khai báo tr ước khi chúng được s ử d ụng. Ví d ụ 3.11 input m; input [2:0] n; output : t ất c ả port output c ủa m ột module được khai báo v ới m ột phát bi ểu output. N ếu không có m ột lo ại d ữ li ệu khác nh ư là reg, wand, wor, ho ặc tri được khai báo, thì output port s ẽ có lo ại d ữ li ệu m ặc đị nh là wire và nó c ũng được điều khi ển b ởi cú pháp c ủa wire. M ột phát bi ểu output có th ể xu ất hi ện ở b ất c ứ v ị trí nào trong mô t ả thi ết k ế, nh ưng nó ph ải được khai báo tr ước khi được s ử d ụng. Ta có th ể khai báo độ r ộng c ủa một output nh ư m ột m ảng (vector) c ủa nh ững tín hi ệu. N ếu ta s ử d ụng lo ại dữ li ệu reg để khai báo cho output thì reg ph ải có cùng độ r ộng v ới độ r ộng của m ảng (vector) c ủa tín hi ệu. Ví d ụ 3.12 output a; output [2:0] b; reg [2:0] b; 48
  52. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog inout : ta có th ể khai báo port hai chi ều (bidirectional) v ới phát bi ểu inout. M ột port inout có lo ại d ữ li ệu là wire và được điều khi ển b ởi cú pháp của wire. Ta ph ải khai báo port inout tr ước khi nó được s ử d ụng. Ví d ụ 3.13 inout a: inout [2:0] b; Ví d ụ 3.14 module fulladder(cout, sum, in1, in2, in3); input in1, in2, in3; // khai báo 3 ngõ vào output cout, sum; //khai báo 2 ngõ ra wire in1, in2, in3; //khai báo ki ểu d ữ li ệu reg cout, sum; //khai báo ki ểu d ữ li ệu endmodule 3.7 Khai báo m ảng và ph ần t ử nh ớ m ột và hai chi ều. 3.7.1 Gi ới thi ệu Verilog ch ỉ h ỗ tr ợ khai báo m ảng m ột và hai chi ều. Nh ững m ảng một chi ều được g ọi là bit-vectors và nó có th ể là lo ại d ữ li ệu net ho ặc reg. Nh ững m ảng hai chi ều được g ọi là nh ững ph ần t ử nh ớ và là lo ại d ữ li ệu reg. Ta có th ể đị nh ngh ĩa độ r ộng cho t ất c ả các lo ại d ữ li ệu được trình bày trong ch ươ ng này. Vi ệc đị nh ngh ĩa độ r ộng cung c ấp m ột cách để t ạo ra một bit-vector. Cú pháp c ủa m ột mô t ả độ r ộng là [msb:lsb]. Nh ững bi ểu th ức c ủa msb (bit có tr ọng s ố l ớn nh ất) và lsb (bit có tr ọng s ố nh ỏ nh ất) 49
  53. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog ph ải là nh ững bi ểu th ức có giá tr ị h ằng khác 0. Nh ững bi ểu th ức có giá tr ị hằng ch ỉ có th ể t ạo nên b ởi nh ững h ằng s ố, nh ững tham s ố c ủa Verilog và các toán t ử. Không có gi ới h ạn trong vi ệc đị nh ngh ĩa độ r ộng t ối đa c ủa m ột bit-vector trong Verilog, tuy nhiên vi ệc gi ới h ạn này có th ể s ẽ ph ụ thu ộc vào công c ụ mô ph ỏng, t ổng h ợp, ho ặc nh ững công c ụ khác. 3.7.2 Mảng net Ví d ụ 3.15 wire [63:0] bus; Ở Ví d ụ 3.15 mô t ả vi ệc khai báo m ột wire có độ r ộng 64 bits. Ví d ụ 3.16 wire vectored [31:0] bus1; wire scalared [31:0] bus2; Ở Ví d ụ 3.16, ta s ử d ụng hai t ừ khóa ch ỉ d ẫn ‘vectored’ và ‘scalared’, chúng đều được dùng để khai báo multi-bit nets, tuy nhiên chúng khác nhau ở ch ỗ có cho phép mô t ả t ừng bit hay t ừng ph ần c ủa net hay không. assign bus1 [1] = 1’b1; // sai cú pháp vì s ử d ụng vi ệc ch ọn bit của m ột vectored net. assign bus2 [1] = 1’b1; // đúng vì vi ệc ch ọn bit c ủa m ột scalared net là được phép. Trình biên d ịch ch ấp nh ận cú pháp c ủa nh ững c ấu trúc mô t ả Verilog này, tuy nhiên chúng s ẽ b ị b ỏ qua khi m ạch được t ổng h ợp ra ph ần c ứng. 3.7.3 Mảng thanh ghi Ví d ụ 3.17 Khai báo m ảng thanh ghi 50
  54. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog reg [7:0] areg 3.7.4 Mảng ph ần t ử nh ớ Ví d ụ 3.18 : Khai báo m ảng ph ần t ử nh ớ reg amem [7:0] ; reg bmem [7:0][0:3]; 51
  55. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog reg [7:0] cmem [0:3]; reg [2:0] dmem [0:3][0:4]; 52
  56. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog 3.8 Khai báo lo ại d ữ li ệu bi ến - số nguyên, th ời gian, s ố th ực, và th ời gian th ực 3.8.1 Gi ới thi ệu Thêm vào kh ả n ăng mô hình hóa cho ph ần c ứng trong Verilog, ta có th ể s ử d ụng thêm m ột s ố lo ại dữ li ệu bi ến khác ngoài dữ li ệu bi ến reg. M ặc dù bi ến d ữ li ệu reg có th ể được dùng cho nh ững ch ức n ăng t ổng quát nh ư đếm th ời gian, l ưu gi ữ s ự thay đổ i giá tr ị c ủa net, bi ến d ữ li ệu integer và time thì cung c ấp s ự thu ận l ợi và d ễ đọ c hi ểu h ơn trong vi ệc mô t ả thi ết k ế. 3.8.2 Integer Lo ại d ữ li ệu integer là bi ến có ch ức n ăng t ổng quát được dùng để tính toán s ố l ượng. Nó không được xem nh ư là thanh ghi trong ph ần c ứng thi ết k ế. Lo ại d ữ li ệu integer g ồm 32 bit và nó có th ể được gán và s ử d ụng hoàn toàn gi ống nh ư lo ại bi ến d ữ li ệu reg. Phép gán qui trình (procedural assignment) được dùng để kích s ự thay đổ i giá tr ị c ủa lo ại d ữ li ệu integer. Nh ững phép tính trên bi ến d ữ li ệu integer s ẽ t ạo ra nh ững k ết qu ả ở dưới d ạng bù 2. 53
  57. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog Ví d ụ 3.19 integer i1, i2; 3.8.3 Time Bi ến d ữ li ệu time có độ r ộng 64 bit và này th ường được dùng để l ưu gi ữ giá tr ị output c ủa hàm h ệ th ống $time ho ặc để tính toán th ời gian ch ạy mô ph ỏng trong nh ững tr ường h ợp mà ở đó vi ệc ki ểm tra đị nh th ời là b ắt bu ộc ho ặc cho nh ững m ục đích dò tìm và phát hi ện l ỗi c ủa thi ết k ế trong quá trình mô ph ỏng. Lo ại d ữ li ệu time có th ể được gán và s ử d ụng hoàn toàn gi ống nh ư lo ại bi ến d ữ li ệu reg. Phép gán qui trình (procedural assignment) được dùng để kích s ự thay đổ i giá tr ị c ủa lo ại d ữ li ệu time Ví d ụ 3.20 time t1, t2; 3.8.4 Số th ực (real) và th ời gian th ực (realtime) Bên c ạnh bi ến d ữ li ệu integer và time, Verilog còn có h ỗ tr ợ vi ệc s ử dụng h ằng s ố th ực và bi ến d ữ li ệu th ực (real). Ngo ại tr ừ nh ững ngo ại l ệ nh ư trình bày phía d ưới thì bi ến d ữ li ệu real có th ể được s ử d ụng t ươ ng t ự nh ư integer và time. Không ph ải t ất c ả các phép toán trong Verilog có th ể được s ử dụng v ới nh ững s ố th ực. Bảng 3.2 Toán t ử v ới s ố th ực Unary+ unary- Unary operation + - * / Arithmetic 54
  58. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog > >= > >> <<< shift Bi ến d ữ li ệu không co khai báo độ r ộng c ủa bi ến. Vi ệc tính toán được th ực hi ện dùng chu ẩn đị nh d ạng IEEE floating point. Bi ến d ữ li ệu có giá tr ị m ặc đị nh là 0. Th ời gian th ực (realtime) được khai báo và s ử d ụng t ươ ng t ự nh ư s ố th ực (real). Chúng có th ể hoán đổ i cho nhau. Ví d ụ 3.21 real float; realtime rtime; 55
  59. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog 3.9 Khai báo tham s ố 3.9.1 Gi ới thi ệu Trong Verilog HDL, lo ại d ữ li ệu tham s ố (parameter) không thu ộc lo ại d ữ li ệu bi ến (variables: reg, integer, time, real, realtime) cũng nh ư lo ại dữ li ệu net. D ữ li ệu tham s ố không ph ải là bi ến mà chúng là h ằng s ố. Có hai lo ại tham s ố: tham s ố module (module parameter), và tham s ố đặ c t ả (specify parameter). Việc khai báo trùng tên gi ữa net, bi ến hay tham s ố là không được phép. Cả hai lo ại tham s ố trên đều được phép khai báo độ r ộng. M ặc đị nh, parameters và specparams sẽ có độ r ộng đủ để ch ứa giá tr ị c ủa h ằng s ố, ngo ại tr ừ khi tham s ố đó có khai báo độ r ộng. 3.9.2 Tham s ố module (module parameter) Tham s ố module có hai lo ại khai báo: parameter và localparameter. 3.9.2.1 Parameter 3.9.2.1.1 Gi ới thi ệu Giá tr ị c ủa khai báo parameter trong m ột module có th ể được thay đổi t ừ bên ngoài module đó b ằng phát bi ểu defparam ho ặc phát bi ểu g ọi instance c ủa module đó. Thông th ường khai báo parameter được dùng để mô t ả đị nh th ời ho ặc độ r ộng c ủa bi ến. Ví d ụ 3.22 parameter msb = 1; // định ngh ĩa tham s ố msb có giá tr ị h ằng s ố là 1 parameter e = 43, f =789; // định ngh ĩa hai h ằng s ố parameter r = 46.7; // khai báo r là m ột h ằng s ố th ực 56
  60. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog parameter byte_size = 9, byte_mask = byte_size - 6; parameter average_delay = (r + f) / 2; parameter signed [3:0] mux_selector = 0; parameter real r1 = 3.6e19; parameter p1 = 13'h7e; parameter [31:0] dec_const = 1'b1; // giá tr ị được đổ i sang 32 bit parameter newconst = 3'h4; // ng ụ ý là tham s ố này có độ r ộng [2:0] parameter newconst = 4; // ng ụ ý là tham s ố này có độ r ộng t ối thi ểu là 32 bit. 3.9.2.1.2 Thay đổi giá tr ị c ủa tham s ố khai báo parameter Một tham s ố module có th ể có mô t ả lo ại d ữ li ệu và mô t ả độ r ộng. Sự tác độ ng c ủa giá tr ị tham s ố m ới khi nó đè lên giá tr ị c ủa tham s ố đã được khai báo ban đầ u trong module v ới mô t ả lo ại d ữ li ệu và mô t ả độ rộng s ẽ tuân theo nh ững qui lu ật sau: Một khai báo tham s ố mà không mô t ả lo ại d ữ li ệu và độ r ộng sẽ có lo ại d ữ li ệu và độ r ộng m ặc đị nh c ủa giá tr ị cu ối cùng được gán vào tham s ố đó. Một khai báo tham s ố mà không mô t ả lo ại d ữ li ệu mà ch ỉ mô tả độ r ộng thì độ r ộng c ủa tham s ố s ẽ không đổi, còn lo ại d ữ li ệu s ẽ là unsigned khi giá tr ị m ới được đè lên. Một khai báo tham s ố mà ch ỉ mô t ả lo ại d ữ li ệu mà không mô tả độ r ộng thì lo ại d ữ li ệu c ủa tham s ố s ẽ không đổ i, còn độ rộng s ẽ có giá tr ị đủ để ch ừa giá tr ị m ới được đè lên. Một khai báo tham s ố mà mô t ả c ả lo ại d ữ li ệu là có d ấu và mô tả c ả độ r ộng thì lo ại d ữ li ệu và độ r ộng c ủa tham s ố c ũng s ẽ không đổi khi giá tr ị m ới được đè lên. 57
  61. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog Trong Verilog có hai cách để thay đổ i giá tr ị c ủa tham s ố được khai báo b ởi parameter : m ột là phát bi ểu defparam, v ới phát bi ểu này nó s ẽ cho phép gán giá tr ị m ới vào tham s ố trong module b ằng cách dùng tên g ọi m ột cách phân c ấp, hai là phép gán giá tr ị tham s ố khi g ọi instance c ủa module đó, b ằng cách này s ẽ cho phép thay đổ i giá tr ị tham s ố trong cùng m ột dòng với vi ệc g ọi instance c ủa module đó. 3.9.2.1.2.1 Phát bi ểu defparam Sử d ụng phát bi ểu defparam, giá tr ị tham s ố có th ể được thay đổ i bên trong instance c ủa module thông qua vi ệc s ử d ụng tên phân c ấp c ủa tham số. Tuy nhiên, phát bi ểu defparam được mô t ả trong m ột instance ho ặc một dãy các instance thì s ẽ không làm thay đổi giá tr ị tham s ố trong nh ững instance khác c ủa cùng m ột module. Bi ểu th ức bên ph ải c ủa phép gán defparam là bi ểu th ức h ằng s ố ch ỉ bao g ồm s ố và nh ững tham s ố tham chi ếu đã được khai báo tr ước đó trong cùng module v ới phát bi ểu defparam . Phát bi ểu defparam đặ c bi ệt h ữu d ụng vì ta có th ể nhóm t ất c ả các phép gán thay đổi giá tr ị các tham s ố c ủa các module khác nhau ch ỉ trong một module. Trong tr ường h ợp có nhi ều phát bi ểu defparam cho m ột tham s ố duy nh ất thì giá tr ị tham s ố đó s ẽ l ấy giá tr ị c ủa phát bi ểu defparam sau cùng. Nếu phát bi ểu defparam c ủa m ột tham s ố được khai báo trong nhi ều file khác nhau thì giá tr ị c ủa tham s ố đó s ẽ không được xác đị nh. Ví d ụ 3.23 module top; reg clk; 58
  62. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog reg [0:4] in1; reg [0:9] in2; wire [0:4] o1; wire [0:9] o2; vdff m1 (o1, in1, clk); vdff m2 (o2, in2, clk); endmodule module vdff (out, in, clk); parameter size = 1, delay = 1; input [0:size-1] in; input clk; output [0:size-1] out; reg [0:size-1] out; always @(posedge clk) # delay out = in; endmodule module annotate; defparam top.m1.size = 5, top.m1.delay = 10, top.m2.size = 10, top.m2.delay = 20; endmodule Trong Ví d ụ 3.22, module annotate có phát bi ểu defparam, giá tr ị t ừ phát bi ểu này s ẽ đè lên nh ững giá tr ị tham s ố size và delay trong instance m1 và m2 trong module top. Hai module top và annotate đều được xem nh ư module top-level. 59
  63. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog 3.9.2.1.2.2 Phép gán giá tr ị tham s ố khi g ọi instance c ủa module Trong Verilog có m ột ph ươ ng pháp khác dùng để gán giá tr ị đế n m ột tham s ố bên trong instance c ủa m ột module đó là s ử d ụng m ột trong hai dạng c ủa phép gán giá tr ị tham s ố trong instance c ủa module. M ột là phép gán theo th ứ t ự danh sách tham s ố, hai là phép gán b ởi tên. Hai d ạng phép gán này không th ể đặ t l ẫn l ộn v ới nhau mà chúng ch ỉ có th ể là m ột trong hai d ạng cho toàn b ộ instance c ủa module. Vi ệc gán giá tr ị tham s ố instance c ủa module theo th ứ t ự danh sách tham s ố t ươ ng t ự nh ư vi ệc gán giá tr ị trì hoãn cho nh ững c ổng c ủa instance, còn vi ệc gán giá tr ị tham s ố instance c ủa module theo tên tham s ố thì t ươ ng t ự nh ư vi ệc k ết n ối port c ủa module b ởi tên. Nó gán nh ững giá tr ị tham s ố cho nh ững instance c ụ th ể mà trong module c ủa nh ững instance này đã định ngh ĩa nh ững tham s ố trên. Một tham s ố mà đã được khai báo trong m ột block, m ột tác v ụ hay một hàm ch ỉ có th ể khai báo l ại m ột cách tr ực ti ếp dùng phát bi ểu defparam . Tuy nhiên, n ếu giá tr ị tham s ố ph ụ thu ộc vào m ột tham s ố th ứ hai, thì vi ệc đị nh ngh ĩa l ại giá tr ị tham s ố th ứ hai c ũng s ẽ c ập nh ật giá tr ị của tham s ố th ứ nh ất. 1. Phép gán giá tr ị tham s ố theo th ứ t ự danh sách tham s ố Th ứ t ự c ủa nh ững phép gán trong phép gán giá tr ị tham s ố theo th ứ tự danh sách tham s ố instance c ủa module s ẽ theo th ứ t ự tham s ố lúc khai báo bên trong module. Nó không c ần thi ết phai gán giá tr ị cho t ất c ả các tham s ố có bên trong module khi dùng ph ươ ng pháp này. Tuy nhiên, ta không th ể nh ảy qua m ột tham s ố. Do đó, để gán nh ững giá tr ị cho m ột ph ần nh ững tham s ố trong t ất c ả các tham s ố đã khai báo trong module thì nh ững phép gán để thay th ế giá tr ị c ủa m ột ph ần nh ững tham s ố đó s ẽ đứ ng tr ước nh ững khai báo c ủa nh ững tham s ố còn l ại. M ột ph ươ ng pháp khác đó là 60
  64. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog ph ải gán giá tr ị cho t ất c ả các tham s ố nh ưng dùng giá tr ị m ặc đị nh (cùng có giá tr ị nh ư được gán trong khai báo tham s ố trong đị nh ngh ĩa module) cho các tham s ố mà không c ần có giá tr ị m ới. Xét Ví d ụ 3.24, trong ví d ụ này nh ững tham s ố bên trong instance của nh ững module mod_a, mod_c, và mod_d được thay đổ i trong khi g ọi instance. Ví d ụ 3.24 module tb1; wire [9:0] out_a, out_d; wire [4:0] out_b, out_c; reg [9:0] in_a, in_d; reg [4:0] in_b, in_c; reg clk; // T ạo testbench clock và stimulus. // B ốn instance c ủa module vdff với phép gán giá tr ị tham s ố theo th ứ tự danh sách tham s ố // mod_a có hai giá tr ị tham s ố m ới size=10 và delay=15 // mod_b có giá tr ị tham s ố m ặc đị nh là (size=5, delay=1) // mod_c có m ột giá tr ị tham s ố m ặc đị nh là size=5 và m ột giá tr ị mới là delay=12 // Để thay đổ i giá tr ị c ủa tham s ố delay, ta c ũng c ần ph ải mô t ả giá tr ị m ặc đị nh c ủa tham s ố size // mod_d có m ột giá tr ị tham s ố m ới là size=10, và giá tr ị tham s ố delay v ẫn gi ữ giá tr ị m ặc đị nh c ủa nó. vdff #(10,15) mod_a (.out(out_a), .in(in_a), .clk(clk)); vdff mod_b (.out(out_b), .in(in_b), .clk(clk)); vdff #( 5,12) mod_c (.out(out_c), .in(in_c), .clk(clk)); 61
  65. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog vdff #(10) mod_d (.out(out_d), .in(in_d), .clk(clk)); endmodule module vdff (out, in, clk); parameter size=5, delay=1; output [size-1:0] out; input [size-1:0] in; input clk; reg [size-1:0] out; always @(posedge clk) #delay out = in; endmodule Nh ững giá tr ị c ủa tham s ố c ục b ộ không th ể b ị đè lên, do đó chúng không được xem nh ư là m ột ph ần th ứ t ụ c ủa danh sách cho phép gán giá tr ị tham s ố. Trong Ví d ụ 3.25, addr_width s ẽ được gán giá tr ị 12, và data_width s ẽ được gán giá tr ị 16. Mem_size s ẽ không được gán giá tr ị m ột cách t ường minh do th ứ t ự danh sách, nh ưng nó s ẽ có giá tr ị 4096 do bi ểu th ức khai báo c ủa nó. Ví d ụ 3.25 module my_mem (addr, data); parameter addr_width = 16; localparam mem_size = 1 << addr_width; parameter data_width = 8; endmodule module top; 62
  66. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog my_mem #(12, 16) m(addr,data); endmodule 2. Phép gán giá tr ị tham s ố b ởi tên Phép gán giá tr ị tham s ố b ởi tên bao g ồm tên t ường minh c ủa tham số và giá tr ị m ới c ủa nó. Tên c ủa tham s ố s ẽ là tên được mô t ả trong instance c ủa module. Ta không c ần thi ết gán nh ững giá tr ị đế n t ất c ả các tham s ố bên trong module khi s ử d ụng ph ươ ng pháp này. Ch ỉ nh ững tham s ố nào mà được gán giá tr ị m ới thì m ới c ần được ch ỉ ra. Bi ểu th ức tham s ố có th ể là m ột l ựa ch ọn để vi ệc g ọi instance c ủa module có th ể ghi l ại vi ệc hi ện di ện c ủa m ột tham s ố mà không c ần b ất kì một phép gán đế n nó. Nh ững d ấu đóng m ở ngo ặc được đòi h ỏi, và trong tr ường h ợp này tham s ố s ẽ gi ữ giá tr ị m ặc đị nh c ủa nó. Khi m ột tham s ố được gán m ột giá tr ị, thì m ột phép gán khác đế n tên tham s ố này là không được phép. Xét Ví d ụ 3.26, trong ví d ụ này c ả nh ững tham s ố c ủa mod_a và ch ỉ một tham s ố c ủa mod_c và mod_d b ị thay đổ i trong khi g ọi instance của module. Ví d ụ 3.26 module tb2; wire [9:0] out_a, out_d; wire [4:0] out_b, out_c; reg [9:0] in_a, in_d; reg [4:0] in_b, in_c; reg clk; // Code t ạo testbench clock & stimulus 63
  67. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog // B ốn instance c ủa moduel vdff v ới giá tr ị tham s ố được gán b ởi tên // mod_a có giá tr ị tham s ố m ới là size=10 và delay=15 // mod_b có giá tr ị tham s ố m ặc đị nh là (size=5, delay=1) // mod_c có m ột giá tr ị tham s ố m ặc đị nh là size=5 và có m ột giá tr ị tham s ố m ới là delay=12 // mod_d có m ột giá tr ị tham s ố m ới là size=10. // còn tham s ố delay v ẫn gi ữ giá tr ị m ặc đị nh vdff #(.size(10),.delay(15)) mod_a (.out(out_a),.in(in_a),.clk(clk)); vdff mod_b (.out(out_b),.in(in_b),.clk(clk)); vdff #(.delay(12)) mod_c (.out(out_c),.in(in_c),.clk(clk)); vdff #(.delay( ),.size(10) ) mod_d (.out(out_d),.in(in_d),.clk(clk)); endmodule module vdff (out, in, clk); parameter size=5, delay=1; output [size-1:0] out; input [size-1:0] in; input clk; reg [size-1:0] out; always @(posedge clk) #delay out = in; endmodule Nó thì h ợp l ệ khi g ọi nh ững instance c ủa module dùng nh ững lo ại định ngh ĩa l ại tham s ố trong cùng module ở top-level. Xét ví d ụ sau, trong ví d ụ này nh ững tham s ố c ủa mod_a b ị thay đổ i b ằng cách dùng vi ệc đị nh ngh ĩa l ại tham s ố theo th ứ t ự danh sách và tham s ố th ứ hai c ủa mod_c được thay đổi b ằng cách dùng vi ệc đị nh ngh ĩa l ại tham s ố b ằng tên trong khi g ọi instance c ủa module. 64
  68. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog Ví d ụ 3.27 module tb3; // s ự pha tr ộn gi ữa instance có khai báo tham s ố theo th ứ t ự và instance có khai báo tham s ố theo tên thì h ợp l ệ vdff #(10, 15) mod_a (.out(out_a), .in(in_a), .clk(clk)); vdff mod_b (.out(out_b), .in(in_b), .clk(clk)); vdff #(.delay(12)) mod_c (.out(out_c), .in(in_c), .clk(clk)); endmodule Nó s ẽ không h ợp l ệ khi g ọi instace c ủa b ất kì module nào dùng l ẫn lộn nh ững phép gán l ại giá tr ị tham s ố b ằng th ứ t ự danh sách tham s ố và tên gi ống nh ư trong phép g ọi instance c ủa module mod_a ở d ưới. Ví d ụ 3.28 // instance mod_a không h ợp l ệ do có s ự pha tr ộn gi ữa các phép gán tham s ố vdff #(10, .delay(15)) mod_a (.out(out_a), .in(in_a), .clk(clk)); 3.9.2.1.3 Sự ph ụ thu ộc tham s ố Một tham s ố (ví d ụ, memory_size ) có th ể được đị nh ngh ĩa v ới m ột bi ểu th ức ch ứa nh ững tham s ố khác (ví d ụ, word_size). Tuy nhiên, vi ệc gán đè giá tr ị tham s ố, có th ể là b ằng phát bi ểu defparam ho ặc trong phát bi ểu gọi instance c ủa module, s ẽ thay th ế m ột cách hi ệu qu ả vi ệc đị nh ngh ĩa tham s ố v ới m ột bi ểu th ức m ới. B ởi vì memory_size ph ụ thu ộc vào giá tr ị của word_size , b ất kì có s ự thay đổ i nào c ủa word_size s ẽ làm thay đổi giá tr ị c ủa memory_size. Ví d ụ, trong khai báo tham s ố sau, m ột giá tr ị m ới c ập nh ật c ủa word_size, có th ể là b ởi phát bi ểu defparam ho ặc phát bi ểu g ọi instance c ủa module mà trong module này đã định ngh ĩa nh ững tham s ố 65
  69. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog trên, thì giá tr ị c ủa memory_size s ẽ được t ự độ ng c ậ nh ật. Nêu memory_size được c ập nh ật b ởi phát bi ểu defparam hay m ột phát bi ểu g ọi instance thì nó s ẽ l ấy giá tr ị đó mà không c ần quan tâm đến giá tr ị c ủa word_size. Ví d ụ 3.29 parameter word_size = 32, memory_size = word_size * 4096; 3.9.2.2 Tham s ố c ục b ộ (localparam) Trong Verilog, tham s ố c ục b ộ ( localparam ) gi ống t ươ ng t ự v ới tham s ố ( parameter ) ngo ại tr ừ là nó không th ể được gán l ại giá tr ị bởi phát bi ểu defparam ho ặc phép gán giá tr ị tham s ố khi g ọi instance c ủa module. Nh ững tham s ố c ục b ộ ( localparam ) có th ể được gán b ởi nh ững bi ểu th ức hằng s ố ch ứa nh ững tham s ố ( parameter ) mà nh ững tham s ố (parameter) này có th ể được gán l ại giá tr ị b ởi phát bi ểu defparam ho ặc phép gán giá tr ị tham s ố khi g ọi instance c ủa module. Vi ệc ch ọn bit hay m ột ph ần c ủa tham s ố c ục b ộ mà lo ại d ữ li ệu c ủa nó không ph ải là real thì được phép. Ví d ụ 3.30 localparam thamso1; localparam signed [3:0] thamso2; localparam time t1; localparam integer int2; localparam var = 5*6; 66
  70. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog 3.9.3 Tham s ố đặ c t ả (specify parameter) Từ khóa specparam khai báo nó là m ột lo ại đặ c bi ệt c ủa tham s ố (parameter) ch ỉ dùng cho m ục đích cung c ấp giá tr ị đị nh th ời (timing) và giá tr ị trì hoãn (delay), nh ưng nó có th ể xu ất hi ện trong b ất kì bi ểu th ức nào mà bi ểu th ức đó không được gán đế n m ột tham s ố ( parameter ) và bi ểu th ức đó c ũng không ph ải là ph ần mô t ả độ r ộng trong m ột khai báo. Nh ững tham số đặ c t ả ( specparams) được phép khai báo bên trong kh ối đặ c t ả (specify block) ho ặc bên trong m ột module chính. Một tham s ố đặ c t ả (specify parameter) khai báo bên ngoài m ột kh ối đặc t ả (specify block) thì c ần được khai báo tr ước khi nó được s ử d ụng. Giá tr ị mà được gán đến m ột tham s ố đặ c t ả có th ể là m ột bi ểu th ức h ằng s ố b ất kì. M ột tham s ố đặ c t ả có th ể được dùng nh ư là ph ần c ủa m ột bi ểu th ức hằng s ố cho m ột khai báo tham s ố đặ c t ả k ế ti ếp. Không gi ống nh ư m ột tham s ố module (module parameter), m ột tham s ố đặ c t ả không th ể được gán l ại giá tr ị t ừ bên trong ngôn ng ữ Verilog, nh ưng nó có th ể được gán l ại giá tr ị thông qua t ập tin d ữ li ệu SDF ( Standard Delay Format). Nh ững tham s ố đặ c t ả (specify parameter) và tham s ố module (module parameter) thì không th ể thay th ế cho nhau. Ngoài ra, tham s ố module (module parameter) không th ể được gán b ởi m ột bi ểu th ức h ằng s ố mà có ch ứa tham s ố đặ c t ả ( specify parameter). Bảng 3.4 tóm t ắt s ự khác nhau gi ữa hai lo ại khai báo tham s ố. Bảng 3.4 Sự khác nhau gi ữa hai lo ại khai báo tham s ố Specparams (tham s ố đặ c t ả) Parameters ( tham s ố module) Sử d ụng t ừ khóa specparam Sử d ụng t ừ khóa parameter Cần được khai báo bên trong m ột Cần được khai báo bên ngoài nh ững module ho ặc m ột kh ối đặ c t ả ( kh ối đặ c t ả ( specify block) specify block) 67
  71. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog Có th ể được dùng bên trong m ột Không th ể được dùng bên trong module ho ặc m ột kh ối đặ c t ả ( nh ững kh ối đặ c t ả (specify block). specify block) Có th ể được gán b ởi tham s ố đặ c t ả Không th ể được gán b ởi (specparam) và tham s ố module specparams. (parameter). Sử d ụng t ập tin d ữ li ệu SDF để gán Dùng phát bi ểu defparam ho ặc phép đè giá tr ị cho tham s ố đặ c t ả. gán giá tr ị tham s ố cho instance c ủa module để gán đè giá tr ị cho tham số. Một tham s ố đặ c t ả (specify parameter) có th ể được mô t ả độ r ộng. Độ r ộng c ủa nh ững tham s ố đặ c t ả c ần tuân theo nh ững qui lu ật sau: Một khai báo tham s ố đặ c t ả mà không có mô t ả độ r ộng thì mặc đị nh s ẽ là độ r ộng c ủa giá tr ị cu ối cùng được gán đế n nó, sau khi có b ất kì giá tr ị nào gán đè lên nó. Một khai báo tham s ố đặ c t ả mà có mô t ả độ r ộng thì độ r ộng của nó s ẽ theo độ r ộng khai báo. Độ r ộng s ẽ không b ị ảnh hưởng b ởi b ất kì giá tr ị nào được gán đè lên nó. Vi ệc ch ọn bit hay m ột ph ần c ủa tham s ố c ục b ộ mà lo ại d ữ li ệu c ủa nó không ph ải là real thì được phép. Ví d ụ 3.31 specify specparam tRise_clk_q = 150, tFall_clk_q = 200; specparam tRise_control = 40, tFall_control = 50; endspecify Nh ững dòng ở gi ữa nh ững t ừ khóa specify và endspecify là để khai báo b ốn tham s ố đặ c t ả. Dòng đầu tiên khai báo hai tham s ố đặ c t ả 68
  72. Ch ươ ng 3. Lo ại d ữ li ệu trong Verilog tRise_clk_q và tFall_clk_q v ới giá tr ị t ươ ng ứng là 150 và 200. Dòng th ứ hai khai báo hai tham s ố đặ c t ả tRise_control và tFall_control v ới giá tr ị tươ ng ứng là 40 và 50. Ví d ụ 3.32 module RAM16GEN ( output [7:0] DOUT, input [7:0] DIN, input [5:0] ADR, input WE, CE); specparam dhold = 1.0; specparam ddly = 1.0; parameter width = 1; parameter regsize = dhold + 1.0; // Không h ợp l ệ - không th ể gán tham s ố đặ c t ả (specparam) đế n m ột tham s ố (parameter) endmodule 3.10 Bài t ập 1. Trong ngôn ng ữ mô t ả ph ần c ứng Verilog HDL, có m ấy lo ại d ữ li ệu cơ b ản? Nêu ch ức n ăng s ử d ụng c ủa m ỗi lo ại. 2. Trong ki ểu d ữ li ệu net có nh ững lo ại khai báo d ữ li ệu nào? Nêu s ự khác nhau gi ữa các lo ại khai báo d ữ li ệu net? 3. Trong ki ểu d ữ li ệu bi ến có nh ững lo ại khai báo d ữ li ệu nào? Nêu s ự khác nhau gi ữa các lo ại khai báo d ữ li ệu bi ến? 4. Trong ngôn ng ữ mô t ả ph ần c ứng Verilog HDL, có nh ững lo ại tham số nào? Nêu s ự khác bi ệt gi ữa tham s ố module và tham s ố đặ c t ả? 5. Khi nào ta s ử d ụng khai báo defparam ? 69