Giáo trình Ngôn ngữ mô tả phần cứng Verilog
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", để 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:
giao_trinh_ngon_ngu_mo_ta_phan_cung_verilog.pdf
Nội dung text: Giáo trình Ngôn ngữ mô tả phần cứng Verilog
- ĐẠ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
- 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
- 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.
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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