• Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

  • Integrated Circuit Design - Chia sẻ kiến thức về vi mạch

    Vi mạch và Ứng dụng

Thứ Bảy, 29 tháng 7, 2017

[Basic Knowledge] Phân loại thiết kế trong thiết kế vi mạch số

Bài này trình bày về sự khác nhau và cách hiểu giữa các cách (loại) thiết kế trong thiết kế vi mạch số như thiết kế đồng bộ, thiết kế nhiều miền xung clock bất đồng bộ, thiết kế bất đồng bộ.

1. Các dạng thiết kế

Thiết kế vi mạch số có nhiều cách thực hiện khác nhau. Nếu dựa trên cấu trúc cơ bản và hoạt động thực tế của một mạch số, một thiết kế có thể thuộc các nhóm sau đây:
  1. Thiết kế đồng bộ (synchronous design) là thiết kế sử dụng chỉ một nguồn xung clock hoặc nhiều xung clock đồng bộ.
  2. Thiết kế nhiều xung clock bất đồng bộ (multi-asynchronous clock design) là thiết kế sử dụng nhiều nguồn xung bất đồng bộ với nhau
  3. Thiết kế mạch bất đồng bộ (asynchronous circuit design) là thiết kế không sử dụng nguồn xung clock chung phân bố đến các thành phần trong thiết kế.
Thuật ngữ "thiết kế bất đồng bộ" trong cách nói thông thường sẽ tùy vào ngữ cảnh để hiểu là (2) hoặc (3). Ở đây, tôi xin chia rõ ràng thành các tên gọi như trên để tránh nhầm lẫn và giúp các bạn có thể phân biệt khi đọc các tài liệu khác.

2. Thiết kế đồng bộ

Khi được gọi là đồng bộ (synchronous) thì mọi hoạt động đều phải tuân theo 1 quy luật chung mà quy luật đó ở đây là chu kỳ xung clock. Trong thiết kế đồng bộ, tại mỗi chu kỳ xung clock, trạng thái của các thành phần trong thiết kế sẽ được cập nhật giá trị một lần tại điểm lấy mẫu. Sau điểm lấy mẫu, trạng thái sẽ nhanh chóng được xác lập đến giá trị ổn định và giữ ở trạng thái này cho đến điểm lấy mẫu tiếp theo. Mô hình thường dùng để minh họa cho cấu trúc cơ bản của một thiết kế đồng bộ là như hình 1 với thành phần gồm mạch tổ hợp (combinational logic), phần tử lưu trữ (digital storage) và nguồn clock (Clock).
Hình 1. Mô hình mạch số được đồng bộ bởi xung clock
Trong mô hình cơ bản trên ta thấy được xung clock là thành phần không thể thiếu trong loại thiết kế này.

Thiết kế đồng bộ đơn giản nhất là thiết kế có một xung clock và hoạt động theo một cạnh, cạnh lên hoặc cạnh xuống xung clock. Vị trí cạch clock được sử dụng để xác định điểm lấy mẫu gọi là cạch tích cực. Phần tử lưu trữ được sử dụng là Flip-Flop (FF).
Hình 2. Minh họa thiết kế đồng bộ một xung clock, một cạnh tích cực
Thiết kế đồng bộ phức tạp hơn là thiết kế sử dụng một xung clock và hoạt động theo cả 2 cạnh xung clock. Thiết kế kiểu này gây ra nhiều khó khăn như chèn các đường scan (scan-path) phục vụ việc kiểm tra các FF trong thiết kế hoặc xác định đường có độ trễ lớn nhất (critical path),...
Hình 3. Minh họa thiết kế đồng bộ một xung clock, 2 cạnh tích cực
Phức tạp hơn nữa, thiết kế đồng bộ sử dụng nhiều xung clock. Trường hợp này là khi thiết kế sử dụng các bộ chia đồng bộ, ví dụ như bộ đếm đồng bộ, để tạo ra các xung clock khác nhau sử dụng trong thiết kế. Tuy thiết kế dạng này sử dụng nhiều xung clock khác nhau những các clock được tạo ra có mối liên quan xác định được so với clock nguồn. ví dụ như bộ chia đôi clock sau đây.
Hình 4. Bộ chia đôi clock
Xem xét bộ chia 2 clock, xung clock q1 được tạo ra có sự lệch pha so với xung clock clock1. Sự lệch pha này là do độ trễ clock-to-q của FF. Đây là một thông số xác định được. Tuy vậy, nếu q1 tiếp tục được sử dụng để tạo ra tín hiệu clock khác, tín hiệu clock này lại tiếp tục được dùng để tạo clock tiếp theo và có thể nhiều hơn nữa thì độ trễ giữa tín hiệu clock được tạo ra trước sẽ được cộng dồn cho tín hiệu clock tiếp theo làm độ lệch pha giữa clock nguồn và các clock tầng sau càng lớn. Điều này không chỉ làm cho việc tổng hợp, phân tích và layout các đường clock khó khăn mà người thiết kế mức cao cũng phải quan tâm đến sự lệch pha này để thiết kế các mạch hoạt động đúng. Ví dụ như bộ Ripple counter sau đây.
Hình 5. Bộ Ripple counter
Người thiết kế mức cao (phân tích cấu trúc, viết RTL code) có thể cảm thấy dễ dàng khi mô tả một thiết kế đồng bộ sử dụng nhiều xung clock, sử dụng cả cạnh lên hoặc cạch xuống. Bằng chứng là bạn có thể mô tả tất cả các mạch trên đây bằng vài dòng code đơn giản. Tuy nhiên, điều này ảnh hưởng lớn đến mức độ phức tạp cho công việc thiết kế mức thấp (tổng hợp, phân tích timing, layout) và có thể gây ra những sai sót không mong muốn nên hãy cân nhắc khi lựa chọn giải pháp thiết kế.

3. Thiết kế nhiều xung clock bất đồng bộ

Thiết kế nhiều miền xung clock bất đồng bộ khác với thiết kế đồng bộ là trong thiết kế có thể sử dụng nhiều nguồn xung clock khác nhau mà không có mối quan hệ cố định nào hoặc không có mối liên hệ nào. Thiết kế cũng có thể chỉ sử dụng một nguồn xung clock nhưng lại có những giao tiếp bất đồng bộ. Một số trường hợp điển hình của thiết kế loại này như sau:
  1. Thiết kế giao tiếp lấy ngõ vào từ một miền bên ngoài không biết trước, ví dụ như như giao tiếp port trên chân chip. Rõ ràng, tín hiệu ngõ vào kiểu này có thể thay đổi bất cứ lúc nào mà không có mối quan hệ ràng buộc nào với xung clock bên trogn thiết kế.
  2. Thiết kế lấy ngõ vào từ một miền clock khác mà nguồn clock này độc lập với nguồn clock của thiết kế. 
  3. Clock ngõ vào và clock ngõ ra của PLL
Hình 6. Một số trường hợp của thiết kế nhiều xung clock bất đồng bộ
Do một tín hiệu thay đổi ngẫu nhiên nên vấn đề chính của thiết kế bất đồng bộ là làm thế nào để lấy đúng được dữ liệu mong muốn.

4. Thiết kế mạch bất đồng bộ

Trong hai kiểu thiết kế đã đề cập phía trên, vấn đề định thời của xung clock cực kỳ quan trọng nếu muốn mạch hoạt động chính xác. Cụ thể, cạch tích cực của xung clock đến các FF phải cùng lúc nhưng đó chỉ là lý tưởng vì đỗ trễ đường dây làm cho các cạch clock đến từng FF không thể đồng thời mà có độ sai lệch nhất định. Hiện tượng này gọi là "clock skew".
Hình 7. Hiện tượng clock skew
Mạch bất đồng bộ có thể loại bỏ vấn đề này bằng cách thay thế các nguồn clock dùng chung bằng các giao thức bắt tay. Xem bài "[Asynchronous Design][Thiết kế bất đồng bộ][Bài 1] Đồng bộ clock và giao thức bắt tay" để hiểu rõ hơn về điều này.

Có thể hình dung đơn giản như sau, thiết kế đồng bộ như một hàng dọc nhiều người trong đó người đứng đầu hàng (xung clock) là người ra hiệu lệnh điều khiển cả hàng. Mỗi lần người đầu hàng (clock) ra hiệu là cả hàng phải làm theo. Thiết kế bất đồng bộ thì khác, mỗi người trong hàng chỉ nghe lệnh từ người đứng trước rồi thực hiện và truyền lệnh đó cho người đứng sau. Như vậy, từng người trong hàng đều thực hiện mệnh lệnh của người đứng đầu nhưng không đồng thời. Đây chỉ là ví dụ để bạn đọc dễ hình dung, chi tiết hơn các bạn hãy tham khảo mục thiết kế bất đồng bộ "Async design" trong trang này.

Mong nhận được các góp ý và chia sẻ để các kiến thức ngày càng hoàn thiện hơn.

Lịch sử cập nhật:
1) 2019.11.20 - Sửa link hình vẽ

Thứ Ba, 25 tháng 7, 2017

[Tool] Các phần mềm mã nguồn mở phục vụ thiết kế vi mạch

Bài này liệt kê và giới thiệu các phần mềm mã nguồn mở để các bạn có thể cài đặt và thử nghiêm, phục vụ công tác nghiên cứu và học tập (Bài viết sẽ được cập nhật thường xuyên các tool hữu ích).

1. gnucap

Loại phần mềm: Mô phỏng mạch

Mô tả: gnucap là chương trình mô phỏng cả mạch số và mạch tương tự (mixed-signal). Phần mềm thực thi dc phi tuyến, các phân tích tức thời, phân tích ac tuyến tính tại một điểm xử lý. Phần mềm cũng bao gồm các mô hình MOSFET tương thích SPICE, diode và BJT.

Link cài đặt và tham khảo:
  • http://ftp.gnu.org/gnu/gnucap/
  • http://gnucap.org/dokuwiki/doku.php?id=gnucap:start
  • http://www.gnu.org/software/gnucap/gnucap-man.pdf
  • https://www.johannes-bauer.com/electronics/gnucap/
  • https://directory.fsf.org/wiki/Gnucap
  • http://thoughtmountain.com/gnucap_demo.html
2. ngspice

Loại phần mềm: Mô phỏng mạch

Mô tả: ngspice là trình mô phỏng mạch mixed-signal và mixed-level. Mã nguồn của phần mềm này dựa trên 3 gói phần mềm mã nguồn mở là Spice3f5, Cider1b1 và Xspice.

Link cài đặt và tham khảo:
  • http://ngspice.sourceforge.net/index.html
  • http://www.ngspice.com/
ngspice

3. Qucs

Loại phần mềm: Mô phỏng mạch

Mô tả Qucs, viết tắt của Quite Universal Circuit Simulator, là một rình mô phỏng mạch tích hợp. Phân mềm cho phép thực hiện một mạch với giao diện đồ họa và mô phỏng tín hiệu lớn, tín hiệu nhỏ và nhiễu trong mạch.

Link cài đặt và tham khảo:
  • http://qucs.sourceforge.net/
Giao diện Qucs
3. IRSIM

Loại phần mềm: Mô phỏng mạch

Mô tả: IRSIM là trình mô phỏng mạch mức switch. Nó coi các transistor như các switch. Nó sử dụng hằng số RC để dự đoán thời gian tương đối của các sự kiện. 

Link download và tham khảo:
  • http://opencircuitdesign.com/irsim/download.html
  • http://opencircuitdesign.com/irsim/
HIển thị đồ họa analyzer trong IRSIM
4. Icarus Verilog

Loại phần mềm: Mô phỏng và tổng hợp

Mô tả: Icarus Verilog là phần mềm mô phỏng và tổng hợp tương thích với RTL code Verilog IEEE-1364.

Link download và tham khảo:
  • http://mac.softpedia.com/get/Math-Scientific/Icarus-Verilog.shtml
  • http://iverilog.icarus.com/
  • http://courses.cecs.anu.edu.au/courses/ENGN3213/Documents/VERILOG/iverilog_NOOR.pdf
  • http://www.swarthmore.edu/NatSci/mzucker1/e15/iverilog-instructions.html
5. Verilator

Loại phần mềm: Mô phỏng

Mô tả: Verilator được giới thiệu là phần mềm mô phỏng miễn phí Verilog HDL nhanh nhất. Nó có thể biên dịch được code Verilog khả tổng hợp, một số PSL, SystemVerrilog và các assertion tổng hợp trong C++ hoặc System C. Phần mềm được viết để sử dụng cho các dự án lớn cần tốc độ mô phỏng nhanh.

Link download và tham khảo:
  • https://www.veripool.org/wiki/verilator/Installing
  • http://www.lowrisc.org/docs/untether-v0.2/verilator/
6. GHDL

Loại phần mềm: Biên dịch (compiler) và mô phỏng

Mô tả: GHDL là từ viết tắt của G Hardware Design Language. GHDL là một trình biên dịch VHDL, khồng phải là một trình tổng hợp (synthesis) tạo ra file netlist. Tuy gọi là trình biên dịch vì GHDL biên dịch RTL code viết bằng VHDL thành mã máy sử dụng gcc mà không thông quan ngôn ngữ trung gian như C hay C++ nên có thời gian biên dịch và phân tích nhanh hơn. Bạn có thể biên dịch thiết kế cùng với testbench để tạo ra file VCD và có thể sử dụng các phần mềm khác để xem dạng sóng như GTKwave.

Link download và tham khảo:

  • http://ghdl.free.fr/
  • https://www.youtube.com/watch?v=vLQqhN8cBo0
GHDL

7. ChipVault


Loại phần mềm: Biên dịch và tổng hợp

Mô tả: Là một chương trình phát triển chip trên ngôn ngữ VHDL và Verilog. ChipVault hiển thị thiết kế theo cấu trúc thứ bậc  ChipVault cung cấp chuỗi thực hiện các tác vụ từ dưới lên như khởi chạy các trình biên dịch RTL, tổng hợp, tạo khối và instance, và hỗ trợ kiểm soát thiết kế.

Link download và tham khảo:

  • http://freecode.com/projects/chipvault
  • http://chipvault.sourceforge.net/
ChipVault
8. GTKwave


Loại phần mềm: Xem dạng sóng

Mô tả: Là một chương trình đọc được các định dạng file  LXT, LXT2, VZT, FST, GHW và VCD/EVCD để hiển thị.

Link download và tham khảo:

  • http://gtkwave.sourceforge.net/
  • http://iverilog.wikia.com/wiki/GTKWAVE
  • http://www.ic.unicamp.br/~ducatte/mc542/Docs/gtkwave.pdf
GTKwave

8. Gwave

Loại phần mềm: Xem dạng sóng

Mô tả: Gwave là phần mềm đọc dữ liệu tương tự như ngõ ra của trình mô phỏng Spice. Gwave đọc các file "raw" của các phần mềm spice2G6, spice3F5 hoặc ngspice.

Link download và tham khảo:

  • http://gwave.sourceforge.net/
  • https://sourceforge.net/projects/gwave/

Gwave
9. Alliance

Loại phần mềm: Thực thi đầy đủ luồng thiết kế trên ngôn ngữ VHDL (biên dịch, mô phỏng, tổng hợp, tạo macro-cell, Place and Route, ...)

Mô tả: Alliance là một bộ công cụ CAD miễn phí và các thư viện có sẵn cho thiết kế VLSI. Nó bao gồm trình biên dịch VHDL và trình mô phỏng, các công cụ tổng hợp logic, Place and Route. Bộ thư viện CMOS được cung cấp sẵn. Alliance là kết quả nỗ lực trong mười hai năm của khoa SoC, phòng thí nghiệm LIP6, Đại học Pierre & Marie Curie (Paris VI, Pháp). Alliance đã được sử dụng cho các dự án vi xử lý superscalar StaCS có mật độ 875000 transistor và sự án chip Router IEEE Gigabit HSL có mật độ 400000.

Alliance là phần mềm miễn phí. Các tập tin nhị phân, mã nguồn và các thư viện cell được miễn phí theo license GNU (GNU General Public License). Bạn có thể sử dụng gói phần mềm ngay cả đối với thiết kế thương mại mà không có bất kỳ khoản phí.

Link download và tham khảo (nếu là trang web tiếng Pháp, bạn hãy chuyển sang chế độ tiếng Anh để tham khảo):
  • https://www-soc.lip6.fr/en/team-cian/softwares/alliance/
  • https://github.com/clothbot/Alliance-VLSI-CAD-System
  • ftp://ftp.gwdg.de/pub/misc/opencores/cores/usbhost/alliance.shtml
  • https://ashwith.wordpress.com/2011/02/07/vhdl-in-alliance-behavioral-simulations/
Alliance
10. Electric

Loại phần mềm: Thiết kế mạch số, analog, layout và nhiều thứ hay ho khác

Mô tả: Electric là phần mềm mã nguồn mở cho phép thực hiện nhiều dạng thiết kế mạch khác nhau. Một số khả năng của tool này là Custom IC Layout, thiết kế mạch số/tương tự dạng schematic, tổng hợp biên dịch VHDL, Verilog, ... Rất nhiều dự án nghiên cứu đã dùng phần mềm này (tham khảo link sau: http://www.staticfreesoft.com/electricGallery.html)

Bảng tổng hợp các thành phần của Electric

Link download và tham khảo:

  • http://www.staticfreesoft.com/
Electric
11. Magic

Loại phần mềm: Layout

Mô tả: Magic là một công cụ layout VLSI được viết bởi John Ousterhout năm 1980 tại Berkeley, hiện nay nó nổi tiếng cho việc viết ngôn ngữ TCL. Magic được dùng phổ biến ở các trường đại học và các công ty nhỏ. Magic vẫn dùng rộng rãi như một công cụ trung gian giúp layout dễ dàng nhất, trước khi dùng các công cụ thương mại để thiết kế sản phẩm.
Magic phiên bản 8.1 là phiên bản chính thức phát hành hiện tại .

Link download và tham khảo:

  • http://opencircuitdesign.com/magic/index.html
Magic





Chủ Nhật, 23 tháng 7, 2017

[Verilog] Các cách mô tả một mạch tổ hợp với ngôn ngữ Verilog

Nội dung bài này đưa ra các cách khác nhau có thể sử dụng để mô tả một mạch tổ hợp sử dụng Verilog HDL.

Mạch tổ hợp hình 1 sẽ được sử dụng để minh họa các cách khác nhau được sử dụng để cùng mô tả một mạch tổ hợp. Mạch này là mạch tạo ngõ ra GS cho bộ mã hóa ưu tiên 8 bit. Xem thêm bài "Làm thế nào để mô tả mạch tổ hợp bằng ngôn ngữ Verilog" để biết thêm chi tiết.

Hình 1. Mạch tổ hợp tạo ngõ ra GS (Group Select) cho bộ mã hóa ưu tiên 8 bit

1. Sử dụng phát biểu assign

Phát biểu assign là một trong những từ khóa được sử dụng phổ biến hàng đầu trong ngôn ngữ Verilog HDL để mô tả mạch tổ hợp. Thông qua việc kết hợp với các toán tử khác, phát biểu assign  trở nên linh hoạt trong việc mô tả loại mạch này.
Hình 2. Các toán tử trong ngôn ngữ Verilog
Với mạch hình 1, chúng ta có thể mô tả bằng assign như sau:

assign GS   = Ein? (|D[7:0]): 0;

Cũng có thể chia mô tả trên thành mạch OR và mạch MUX riêng để có cách mô tả tương đương như sau:

assign GS      = Ein? or_out: 0;
assign or_out = |D[7:0];
Mạch MUX có thể thay thế tương đương với một cổng AND như sau:

assign GS   = Ein & (|D[7:0]);
2. Sử dụng cấu trúc always

Cấu trúc always cũng là một trong những cấu trúc có tần suất sử dụng nhiều nhất. Có thể sử dụng thay thế tương đương cho phát biểu assign trong mô tả mạch tổ hợp. Nó có thể kết hợp thêm với các phát biểu điều kiện (if-else-if), phát biểu case (case/casez/casex), ... làm RTL code trở nên dễ đọc và hiểu hơn.

Việc thay thế tương đương giữa always assign như sau:

always @ (*) begin
  GS   = Ein & (|D[7:0]);
end

hoặc

always @ (*) begin
  GS      = Ein? or_out: 0;
  or_out  = |D[7:0];
end
hoặc

always @ (*) begin
  GS   = Ein & (|D[7:0]);
end

Tuy nhiên cần lưu ý, kiểu dữ liệu của GS or_out trong phát biểu assign và cấu trúc always là khác nhau. Sử dụng assign, chúng được khai báo kiểu wire. Sử dụng always, chúng được khai báo kiểu reg.

Sử dụng always kết hợp với if-else-if:

always @ (*) begin
  if (Ein) GS = |D[7:0];
  else GS = 0;
end
Sử dụng always kết hợp với case:

always @ (*) begin
  case (Ein)
    1'b1: GS = |D[7:0];
default: GS = 0;
  endcase
end
3. Sử dụng function

Từ khóa function là một dạng khác so với assignalways. Mạch được mô tả bởi function sẽ không được tổng hợp nếu không được gọi. Việc sử dụng function cần 2 bước:
  1. Tạo (khai báo) function là để tạo một mô tả mạch chức năng
  2. Gọi function là để sử dụng hoặc tạo ra mạch chức năng mong muốn khi chạy mô phỏng hoặc tổng hợp. Function được gọi thông qua các phát biểu khác như assign hay always.
Đối với mạch hình 1, chúng ta có thể tạo function như sau:


function group_select;
  input enable;
  input [7:0] data_in;

  group_select   = enable & (|data_in[7:0]);
endfunction
hoặc:
function group_select;
  input enable;
  input [7:0] data_in;

  if (enable) group_select = |data_in[7:0];
  else group_select = 0;
endfunction

Để sử dụng function đã tạo ra, việc gọi function có thể thực hiện như sau:

assign GS = group_select(Ein, D[7:0]);

hoặc:
always @ (*) begin
  GS = group_select(Ein, D[7:0]);
end
Tuy nhiên, function sử dụng chủ yếu cho việc mô tả các mạch có cấu trúc cố định nhưng mạch này được sử dụng lặp lại nhiều lần trong một thiết kế. Điều này được minh họa trên mạch tạo Q[2:0] trong bộ mã hóa ưu tiên 8 bit.

Hình 3. Mạch tạo ngõ ra trong bộ mã hóa ưu tiên 8 bit
Mạch này sử dụng nhiều bộ MUX 2 ngõ vào, mỗi ngõ vào 3 bit. Bộ MUX này được tạo bằng function như sau:
function [2:0] mux2;
  input sel;
  input [2:0] in1;
  input [2:0] in2;

  mux2 = sel? in1: in2;
endfunction
Mạch hình 3 sẽ được mô tả bằng cách gọi function trên như sau:
assign Q[2:0]     = mux2(Ein,  out_7,  3'b000);
assign out_7[2:0] = mux2(D[7], 3'b111, out_6);
assign out_6[2:0] = mux2(D[6], 3'b110, out_5);
assign out_5[2:0] = mux2(D[5], 3'b101, out_4);
assign out_4[2:0] = mux2(D[4], 3'b100, out_3);
assign out_3[2:0] = mux2(D[3], 3'b011, out_2);
assign out_2[2:0] = mux2(D[2], 3'b010, out_1);
assign out_1[2:0] = mux2(D[1], 3'b001, 3'b000);

4. Sử dụng các thành phần xây dựng sẵn

Những thành phần xây dựng sẵn trong Verilog, gọi là built-in primitive, chứa các cổng được xây dựng sẵn, gọi là built-in gate. Các cổng xây dựng sẵn này được gọi và sử dụng tương tự như việc gọi một module có sẵn.

Hình 4. Các cổng xây dựng sẵn (built-in gate) có thể tổng hợp được trong Verilog 
Để mô tả một mạch tổ hợp bằng cách sử dụng các cổng này thì tất cả các ngõ ra cần phải đưa về dạng biểu thức boolean hoặc các mạch nguyên lý phải ở dưới dạng các cổng cơ bản như liệt kê trong hình 4.
Như đã trình bày, MUX trong mạch hình 1 có thể thay bằng cổng AND như hình sau.

Hình 5. Mạch nguyên lý tương đương của hình 1
Như vậy GS có thể được mô tả bằng các built-in gate như sau:
and and_gate (GS, Ein, or_out);
or  or_gate  (or_out, D[7], D[6], D[5], D[4], D[3], D[2], D[1], D[0]);
Chú ý, and or là loại built-in gate có n ngõ vào.

5. Sử dụng các standard cell của thư viện tổng hợp

Thư viện tổng hợp sẽ chứa các cell chuẩn (standard cell) được sử dụng để biên dịch RTL code thành file netlist. File netlist chứa kết nối của các cell chuẩn của thư viện.

Ở đây, tôi sử dụng thư viện cell chuẩn 180um của TSMC để minh họa, các bạn có thể tìm và download dễ dàng tài liệu mô tả về thư viện này "TSMC 0.18µm Process 1.8-Volt SAGE-XTM Standard Cell Library Databook".

Các họ cell được chọn để mô tả cho mạch hình 1 là  MX2, OR4 và OR2. Gọi là họ cell vì mỗi tên này đại diện cho một nhóm cell có cùng chức năng nhưng có khả năng lái tải ngõ ra (Driver strength) khác nhau.

Hình 5. Các họ cell chuẩn được chọn để mô tả RTL code
Mạch hình 1 sẽ được biến đổi thành mạch dưới đây để có thể sử dụng các họ cell đã nói.

Hình 7. Biến đổi lại mạch nguyên lý hình 1
RTL code của GS sử dụng các cell chuẩn như sau:
MX2X2 mux_gate  (.Y(GS), .S0(Ein), .A(1'b0), .B(or_out));
OR2X2 or2_gate  (.Y.(or_out), .A(or4_1), .B(or4_2));
OR4X2 or4_gate1 (.Y(or4_1), .A(D[7]), .B(D[6]), .C(D[5]), .D(D[4]));
OR4X2 or4_gate2 (.Y(or4_2), .A(D[3]), .B(D[2]), .C(D[1]), .D(D[0]));
Chú ý, nếu sử dụng cách này RTL code sẽ chỉ tổng hợp được trên thư viện cố định có chứa các cell đã chọn. Việc mô phỏng chức năng (function) mạch ở mức RTL code độc lập với thư viện tổng hợp cũng thể thực hiện được.

6. Cách mô tả tổng hợp

Cách mô tả tổng hợp là sử dụng kết hợp linh hoạt các cách đã trình bày trên đây để tạo ra một RTL code đúng chức năng yêu cầu, tổng hợp được, dễ đọc và dễ debug.