Chào mọi người,
Đang lúc chăm con, ngồi rỗi rãi nên chia sẽ với mọi người một vài hướng dẫn về cách thức thiết kế SRAM, cách thức mà một chuyên gia bên Qualcom chia sẽ với mình. Nó không đi sâu vào cụ thể mà chỉ là flow design thôi. Còn về thiết kế các cell SRAM như thế nào rồi các sense, row , colum decorder như thế nào thì trong nhiều tài liệu có viết chi tiết nên mình không đề cập. Mà dù có đề cập thì kinh nghiệm của mình cũng chưa sâu nên không dám. Nhiều sách viết về thiết kế các module nhỏ trong SRAM nhưng lại không trình bày flow thiết kế.
Ngày trước mình mơ mơ màng màng cứ nghĩ flow design SRAM là giống với flow thiết kế digital : Mình cứ nghĩ các SRAM cell, sense, row... được làm thành standard cell sẵn rồi mình chỉ viết code verilog, tổng hợp rồi thân tích timing..... ai ngờ lại không phải thế.
Theo mình biết, block SRAM bao gồm cả Array SRAM, sram cell, Sense, row_colum decoder đều được thiết kế full custom bằng tay như thiết kế mạch analog vậy. Ngày trước mình có hỏi chuyên gia rằng khi thiết kế theo flow thiết kế analog vậy thì khi dung lượng SRAM lớn thì chạy mô phỏng transient có lâu không ? vì sẽ có rất nhiều device. Chuyên gia bảo chạy chỉ chừng vài chục phút cho một lần mô phỏng . có một chuyên gia khác bảo với trình độ như mình hiện nay thì tầm 10 năm nữa mới thiết kế được SRAM chạy tốt được.
Chưa nói đến cách thức chèn redendancy( mỗi row hay colum đều được chèn thêm 1 hay vài sram cell để đề phòng có một cell nào đó trong row hay colum bị lỗi thì thay thế ) gì đây, hay cách thức thiết kế để business, mình trình bày sơ qua flow :
- Sau khi xác đinh được dung lượng cần thiết kế, tần số xung clock đồng bộ, rồi timing của các port ( address, data_in, data_out ) mình bắt đầu chọn topology cho mỗi block nhỏ. Mình có attach một file hình ở dưới cái mà mình tập tành làm SRAM. Theo mình biết thì các các công ty làm SRAM để bán thì họ thiết kế các block nhỏ này sao cho có thể tái sử dụng được. Họ viết một chương trình phần mêm có giao diện cửa sổ để mình chọn các thông số như dung lượng SRAM, dual port hay single port, power , speed.. thì phần mềm đó tổng hợp ra một block SRAM như mình yêu cầu luôn nên không phải thiết kế lại từ đầu. Mình chỉ việc lôi cái block đó ra ( layout để chèn vào layout của SoC ) và phần mềm đó cũng trích xuất các timing luôn cho mình tổng hợp cùng với các block số khác. Mình cũng biết là nguồn nuôi cho SRAM phải thật ổn định và có transient respond tốt mới làm cho SRAM khỏi chạy sai được.
Về cách thức thiết kế các block nhỏ nhiều sách báo có rồi nên các bạn tham khảo trong đó. Nhưng vấn đề mà mình gặp khó khăn nhất khi tập tọe làm SRAM là vấn đề timing giữa các block nhỏ với nhau sao cho khi vẽ layout thì các block nhỏ này tạo ra hình chũ nhật hoàn chỉnh và ghép lại với nhau thành hình chữ nhật lớn hoàn chỉnh thì không thừa khoảng trống nào và có thể tái sử dụng được( cái này là đau đầu nhất ). Vì vậy phân tích thiết kế SRAM hoàn chỉnh có lẽ gần như phải phân tích ngược từ layout qua schematic.
Sau khi vẽ mạch các block nhỏ xong thì các bạn tạo testbend_cell để test các block nhỏ trước đã, đặc biệt là sram_cell. Tiếp đến là tạo testbend cho một row hay một colum để thời gian test nhanh theo PVT thật kỹ để canh chỉnh timing giữa các block nhỏ với nhau. Khi một row hay 1 colum được test ok rồi thì test 2 row hay 2 colum. Test toàn bộ SRAM thì chỉ chạy một vài trường hợp thôi vì sẽ khá lâu. Sau khi chạy oke thì check layout xem có thỏa không và layout như thế thì có tạo ra hình chữ nhật không chỗ trống thừa và tái sử dụng được không.
Sau khi oke ở bước trên rồi thì chúng ta cũng phải check formal verifycation giữa một block SRAM ( symbol ) được viết từ verilog có timing chuẩn và block SRAM mà chúng ta mới thiết kế ra. Bước này thì Synopsis có công cụ chuyên test formal SRAM, DRAM mà mình quên tên mất ( tên gì có chữ cái đầu CV hay CP gì đó ). Block SRAM mà mình thiết kế ra, mình đem trích xuất ký sinh rồi tạo timing bằng công cụ của synop luôn rồi đem neslist này để check formal với netlist verilog. Check theo kiểu này thì nhanh ( như chuyên gia nói ở trên ).
Trên là flow design trên công cụ. Về test trên die thì các bạn qua thread :
http://www.dientuvietnam.net/forums/...-ram-sram-dram
Không biết bài viết ở trên có chỗ nào không ổn không , mọi người góp ý thêm nhé.
Regards,
Đang lúc chăm con, ngồi rỗi rãi nên chia sẽ với mọi người một vài hướng dẫn về cách thức thiết kế SRAM, cách thức mà một chuyên gia bên Qualcom chia sẽ với mình. Nó không đi sâu vào cụ thể mà chỉ là flow design thôi. Còn về thiết kế các cell SRAM như thế nào rồi các sense, row , colum decorder như thế nào thì trong nhiều tài liệu có viết chi tiết nên mình không đề cập. Mà dù có đề cập thì kinh nghiệm của mình cũng chưa sâu nên không dám. Nhiều sách viết về thiết kế các module nhỏ trong SRAM nhưng lại không trình bày flow thiết kế.
Ngày trước mình mơ mơ màng màng cứ nghĩ flow design SRAM là giống với flow thiết kế digital : Mình cứ nghĩ các SRAM cell, sense, row... được làm thành standard cell sẵn rồi mình chỉ viết code verilog, tổng hợp rồi thân tích timing..... ai ngờ lại không phải thế.
Theo mình biết, block SRAM bao gồm cả Array SRAM, sram cell, Sense, row_colum decoder đều được thiết kế full custom bằng tay như thiết kế mạch analog vậy. Ngày trước mình có hỏi chuyên gia rằng khi thiết kế theo flow thiết kế analog vậy thì khi dung lượng SRAM lớn thì chạy mô phỏng transient có lâu không ? vì sẽ có rất nhiều device. Chuyên gia bảo chạy chỉ chừng vài chục phút cho một lần mô phỏng . có một chuyên gia khác bảo với trình độ như mình hiện nay thì tầm 10 năm nữa mới thiết kế được SRAM chạy tốt được.
Chưa nói đến cách thức chèn redendancy( mỗi row hay colum đều được chèn thêm 1 hay vài sram cell để đề phòng có một cell nào đó trong row hay colum bị lỗi thì thay thế ) gì đây, hay cách thức thiết kế để business, mình trình bày sơ qua flow :
- Sau khi xác đinh được dung lượng cần thiết kế, tần số xung clock đồng bộ, rồi timing của các port ( address, data_in, data_out ) mình bắt đầu chọn topology cho mỗi block nhỏ. Mình có attach một file hình ở dưới cái mà mình tập tành làm SRAM. Theo mình biết thì các các công ty làm SRAM để bán thì họ thiết kế các block nhỏ này sao cho có thể tái sử dụng được. Họ viết một chương trình phần mêm có giao diện cửa sổ để mình chọn các thông số như dung lượng SRAM, dual port hay single port, power , speed.. thì phần mềm đó tổng hợp ra một block SRAM như mình yêu cầu luôn nên không phải thiết kế lại từ đầu. Mình chỉ việc lôi cái block đó ra ( layout để chèn vào layout của SoC ) và phần mềm đó cũng trích xuất các timing luôn cho mình tổng hợp cùng với các block số khác. Mình cũng biết là nguồn nuôi cho SRAM phải thật ổn định và có transient respond tốt mới làm cho SRAM khỏi chạy sai được.
Về cách thức thiết kế các block nhỏ nhiều sách báo có rồi nên các bạn tham khảo trong đó. Nhưng vấn đề mà mình gặp khó khăn nhất khi tập tọe làm SRAM là vấn đề timing giữa các block nhỏ với nhau sao cho khi vẽ layout thì các block nhỏ này tạo ra hình chũ nhật hoàn chỉnh và ghép lại với nhau thành hình chữ nhật lớn hoàn chỉnh thì không thừa khoảng trống nào và có thể tái sử dụng được( cái này là đau đầu nhất ). Vì vậy phân tích thiết kế SRAM hoàn chỉnh có lẽ gần như phải phân tích ngược từ layout qua schematic.
Sau khi vẽ mạch các block nhỏ xong thì các bạn tạo testbend_cell để test các block nhỏ trước đã, đặc biệt là sram_cell. Tiếp đến là tạo testbend cho một row hay một colum để thời gian test nhanh theo PVT thật kỹ để canh chỉnh timing giữa các block nhỏ với nhau. Khi một row hay 1 colum được test ok rồi thì test 2 row hay 2 colum. Test toàn bộ SRAM thì chỉ chạy một vài trường hợp thôi vì sẽ khá lâu. Sau khi chạy oke thì check layout xem có thỏa không và layout như thế thì có tạo ra hình chữ nhật không chỗ trống thừa và tái sử dụng được không.
Sau khi oke ở bước trên rồi thì chúng ta cũng phải check formal verifycation giữa một block SRAM ( symbol ) được viết từ verilog có timing chuẩn và block SRAM mà chúng ta mới thiết kế ra. Bước này thì Synopsis có công cụ chuyên test formal SRAM, DRAM mà mình quên tên mất ( tên gì có chữ cái đầu CV hay CP gì đó ). Block SRAM mà mình thiết kế ra, mình đem trích xuất ký sinh rồi tạo timing bằng công cụ của synop luôn rồi đem neslist này để check formal với netlist verilog. Check theo kiểu này thì nhanh ( như chuyên gia nói ở trên ).
Trên là flow design trên công cụ. Về test trên die thì các bạn qua thread :
http://www.dientuvietnam.net/forums/...-ram-sram-dram
Không biết bài viết ở trên có chỗ nào không ổn không , mọi người góp ý thêm nhé.
Regards,
Comment