Thông báo

Collapse
No announcement yet.

Căn bản về systemC

Collapse
This is a sticky topic.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Căn bản về systemC

    Chào các bạn,

    Tại sao lại mở đề tài về systemC? Bộ RTL (VHDL và Verilog) không đủ để thiết kế hay sao?

    Như các bạn đã biết là thường thì những kỹ thuật số, đặc biệt là bộ lọc được khai triển dùng Matlab hoặc C. Mô phỏng cách hoạt động dùng Matlab hoặc C vừa đơn giản, vừa dễ thử nghiệm cho nên những người làm về system hoặc DSP thường dùng một trong 2 cách mô tả này.

    Sau khi vừa ý về cách hoạt động, một vài khối trong hệ thống có thể phải chuyển qua phần cứng để có thể đạt chỉ tiêu về độ chạy (performance)

    1) DSP - Nửa cứng, nửa mềm, có thể đạt độ chạy tương xứng và vẫn linh động để có thể thay đổi dễ dàng nhưng khá tốn kiếm cho phần cứng, tốn nhiều nhiên liệu, chạy nóng hơn và tốn nhiều chỗ.
    2) RTL (FPGA hoặc ASIC) - Lợi về độ chạy, nhiên liệu, nhỏ và đỡ tốn kém. Yếu điểm là khó thay đổi.

    Để chuyển từ C qua RTL, hiện nay đa số vẫn dùng cách chuyển bằng tay (manual). Cách chuyển này thường dễ tạo ra lỗi do nhiều dữ kiện và vì vậy thời gian thử nghiệm gia tăng và mức gia tăng này có thể gấp nhiều lần so với độ phức tạp của thiết kế.

    C chỉ có thể mô tả cách hoạt động tuần tự cho nên không thích hợp với những hệ thống đòi hỏi về hoạt động đồng bộ (multi-thread). SystemC extension đã xuất phát để giải quyết vấn đề này.

    SystemC synthesis subset (tổng hợp) cũng đã được đề ra để cho những công cụ tổng hợp tuân theo và chuyển từ systemC qua RTL. Khi tổng hợp, những công cụ này phải làm những công việc mà bình thường được làm bằng tay với lợi điểm là lẹ và chính xác về thời gian hơn.

    Hẹn các bạn trong những bài sau để đi sâu vào cấu trúc của systemC. Bạn nào có kinh nghiệm về systemC, xin tham gia và bổ túc. Cám ơn rất nhiều
    Chúc một ngày vui vẻ
    Tony
    email : dientu_vip@yahoo.com

  • #2
    Mình đang bắt đầu học SystemC, qua bài viết của anh Tony mình có cái nhìn tổng quát thật bổ ích. Các bạn có kinh nghiệm về phần này cùng chia sẽ nha, thanks.

    Comment


    • #3
      Trước khi đi vào phần cấu trúc, tôi xin nói sơ về data type (không biết tiếng Việt gọi là gì nhỉ?)

      systemC xuất phát từ C cho nên nó cũng tuân theo những qui tắc của C/C++. Ngoài data type nguyên thủy (native) gồm có bool, char, short, int, float và vv, nó còn có systemC data type:

      1) Integer
      * sc_int<W>, sc_uint<W> là số nguyên signed và unsigned với W là số bit dùng để định giá trị. Ví dụ sc_int<6> có 5 bit cho giá trị và 1 bit cho dấu. Giá trị đi từ -31 tới 31. sc_uint<6> thì đi từ 0 tới 63.
      2) Fixed point - số lẻ
      * sc_fixed<W,I> và sc_ufixed<W,I> W là tổng số bit và I là số bit cho phần nguyên. Ví dụ sc_ufixed<5,2>. 2 bit cho phần nguyên và 3 bit cho phần lẻ

      Khi W > 64, thì phải chuyển qua big data type. Ví dụ như sc_bigint<65>

      systemC còn có sc_logic và sc_lv. sc_logic và sc_lv có 4 states ('0', '1', 'X' và 'Z') và hay được dùng cho simulation.

      Các bạn google systemC data type để tìm hiểu thêm nhe.
      Chúc một ngày vui vẻ
      Tony
      email : dientu_vip@yahoo.com

      Comment


      • #4
        Xin bổ sung thêm tí:
        Datatype gọi là kiểu dữ liệu, việc định dạng các kiểu mới này vửa tiện cho việc mô phỏng các thuật toán, vừa gần gũi với phần cứng. Các bạn cũng thấy sc_int linh động hơn ở chỗ cho người thiết kế đặt số lượng bit bất kì.
        Kiểu fix-point cũng rất tiện:
        Ví dụ, khi cộng một số fix-point A(5,2) và B(7,3), khi viết VHDL, các bạn phải tự dịch các phần nguyên và phần lẻtrùng nhau mới cộng được. Còn SystemC, khi thực hiện
        A+B, toán tử (operator) "+" đã được định nghĩa lại để thực hiện việc cộng dữ liệu mới này. (Anh Tony kiểm tra em nói đúng không dùm )

        Comment


        • #5
          Ví dụ, khi cộng một số fix-point A(5,2) và B(7,3), khi viết VHDL, các bạn phải tự dịch các phần nguyên và phần lẻtrùng nhau mới cộng được. Còn SystemC, khi thực hiện
          Thường thì họ nhân tất cả với một bội số nào đó để chuyển qua số nguyên rồi sau đó lấy kết quả chia ngược trở lại với bội số đó.
          Chúc một ngày vui vẻ
          Tony
          email : dientu_vip@yahoo.com

          Comment


          • #6
            Tương tự như bên VHDL (entity) và Verilog (module), systemC bắt đầu mô đun bằng SC_MODULE. SC_MODULE là lớp (class) trong C++ cho đối tượng. Trong SC_MODULE sẽ có cổng (port) vào và ra (sc_in và sc_out). sc_in/sc_out là lớp dưới (subclass) của SC_MODULE. Khi dùng những lớp của systemC, bó buộc phải cần "systemc.h" khi biên dịch và systemc.lib khi nối. Khi tuyên bố sc_in/sc_out cần phải có kiếu dữ liệu liên hệ với cổng. Ví dụ

            #include <systemc.h>

            SC_MODULE(top)
            {
            sc_in<bool> a;
            sc_in<bool> b;
            sc_out<bool> c;
            };
            Chúc một ngày vui vẻ
            Tony
            email : dientu_vip@yahoo.com

            Comment


            • #7
              Để mô tả cách hoạt động, systemC dùng hàm của lớp và đăng ký (register) theo dữ kiện (event). Có 3 phương cách để đăng ký hàm:

              1) SC_METHOD
              * Không đồng bộ - Sẽ tạo ra combinational logic (không biết dịch ra tiếng Việt là gì)
              * Đồng bộ - Xuất tiến ở mỗi xung clock.

              Code:
              #include <systemc.h>
              SC_MODULE(and_func)
              {
              	sc_in<bool> clk;
              	sc_in<bool> a, b;
              	sc_out<bool> c, d;
              	
              	bool temp;
              	
              	void comb()
              	{
              		c.write(a.read() & b.read());
              	}
              	void sync()
              	{
              		d.write(a.read() & b.read());
              	}
              	
              	SC_CTOR(and_func):
              		clk("clk"),
              		a("a"),
              		b("b")
              	{
              		SC_METHOD(comb);
              		sensitive << a << b;
              		
              		SC_METHOD(sync);
              		sensitive << clk.pos();
              	}
              };
              Click image for larger version

Name:	Capture.PNG
Views:	1
Size:	9.6 KB
ID:	1349852

              Click image for larger version

Name:	Capture.PNG
Views:	1
Size:	12.1 KB
ID:	1349853

              Khi dùng SC_METHOD, không được dùng câu lệnh đợi (wait) cho nên phương pháp này bị hạn chế chỉ để dùng cho cycle accurate model, chẳng hạn như interfaces

              Khi mô tả đồng bộ, nếu cần reset thì code ở trên cần phải thay đổi như sau:

              * Async reset

              Code:
              #include <systemc.h>
              SC_MODULE(and_func)
              {
              	sc_in<bool> clk;
                              sc_in<bool> rst;
              	sc_in<bool> a, b;
              	sc_out<bool> c, d;
              	
              	bool temp;
              	
              	void comb()
              	{
              		c.write(a.read() & b.read());
              	}
              	void async()
              	{
                                             if (rst)
                                                       d.write(0);
                                             else
              		          d.write(a.read() & b.read());
              	}
              	
              	SC_CTOR(and_func):
              		clk("clk"),
                                             rst("rst"),
              		a("a"),
              		b("b")
              	{
              		SC_METHOD(comb);
              		sensitive << a << b;
              		
              		SC_METHOD(async);
              		sensitive << rst.pos() << clk.pos();
              	}
              };
              SC_METHOD không có thể dùng cho synchronous reset. SC_CTHREAD và SC_THREAD có thể làm được công việc này.

              SC_MODULE phải có bộ xây dựng SC_CTOR (constructor). Trạng thái đầu tiên hay những công việc mà chỉ cần xuất phát một lần thôi thường được khởi động từ đây, chẳng hạn như initialization.

              Code dùng SC_CTHREAD với synchronous reset:

              Code:
              #include <systemc.h>
              SC_MODULE(and_func)
              {
              	sc_in<bool> clk;
                      sc_in<bool> rst;
              	sc_in<bool> a, b;
              	sc_out<bool> d;
              	
              	bool temp;
              	
              	void sync()
              	{
              		d.write(0); // Reset condition d=0
              		wait();
              		while (true) 
              		{
              			d.write(a.read() & b.read());
              			wait();
              		}
              	}
              	
              	SC_CTOR(and_func):
              		clk("clk"),
                              rst("rst"),
              		a("a"),
              		b("b"),
              		d("d")
              	{
              		SC_CTHREAD(sync,clk.pos());
              		reset_signal_is(rst, true);
              	}
              };
              SC_THREAD không được nhận vào standard cho tổng hợp nhưng có một số công cụ tổng hợp vẫn chấp nhận SC_THREAD.

              Code với SC_THREAD
              Code:
              #include <systemc.h>
              SC_MODULE(and_func)
              {
              	sc_in<bool> clk;
                      sc_in<bool> rst;
              	sc_in<bool> a, b;
              	sc_out<bool> d;
              	
              	bool temp;
              	
              	void do_it()
              	{
              		d.write(0); // Reset condition d=0
              		wait();
              		while (true) 
              		{
              			d.write(a.read() & b.read());
              			wait();
              		}
              	}
              	
              	SC_CTOR(and_func):
              		clk("clk"),
                              rst("rst"),
              		a("a"),
              		b("b"),
              		d("d")
              	{
              		SC_THREAD(do_it);
              		sensitive << clk.pos();
              	}
              };
              Sync hoặc async reset và active level sẽ được điều khiển bởi công cụ tổng hợp.
              Last edited by tonyvandinh; 16-02-2012, 04:30. Lý do: Bổ túc
              Chúc một ngày vui vẻ
              Tony
              email : dientu_vip@yahoo.com

              Comment


              • #8
                Chào bác Tony,

                Em đã sửa code theo gợi ý của bác và thêm một flip-flop để sync tín hiệu enable phục vụ cho mục đích calibration sau này. Em nghĩ đưa vào chủ để này tốt hơn vì ở bên kia code chỉ mang tính ví dụ minh họa cho giái pháp em đề cập.

                Code:
                //------------------------------------------------------------------
                //-- http://www.dientuvietnam.net
                //-- Vi Dien Tu: Thiet ke, Phat trien va Ung dung
                //-- GAL-PAL-CPLD-FPGA
                //-- FPGA va cac giai phap ung dung trong Cong Nghe Quan Su
                //--
                //-- MODULE name	:  sync_pulse_gen
                //-- Created by	:  hithere123
                //--
                //-- function	:  Tao xung dong bo cu ly 
                //--     
                //-- Copyright 2011 -  All rights reserved.
                //------------------------------------------------------------------
                //-- Revisions  :
                //-- Date         Version  Author    	Description
                //-- 2011-07-14   0.1      hithere123	created
                //-- 2011-07-15   0.2      hithere123   add sync_en_int
                //--									add reset
                //--									update sensitivity list
                //--
                //------------------------------------------------------------------
                
                #ifndef SYNC_PULSE_GEN_H
                #define SYNC_PULSE_GEN_H
                
                #include <systemc.h>
                
                SC_MODULE(sync_pulse_gen) {
                
                    sc_in<bool >  mclk_i;
                	sc_in<sc_logic >  reset;
                    sc_in<sc_logic >  sync_en_i;
                    sc_out<sc_logic > sync_clk1_o;
                    sc_out<sc_logic > sync_clk2_o;
                    sc_out<sc_logic > sync_clk3_o;
                    sc_out<sc_logic > sync_clk4_o;
                    sc_out<sc_logic > sync_clk5_o;	
                
                	sc_signal<sc_logic > sync_en_int;
                    sc_signal<sc_lv<10> > count_int;
                
                    void sync() {
                	   if (reset.read() == SC_LOGIC_1) {	
                		sync_en_int=SC_LOGIC_0;
                	   } else {	
                		sync_en_int=sync_en_i;
                	   }
                    }
                	
                    void counter() {
                /*
                	if ((sync_en_int.read() == SC_LOGIC_0)) {
                            count_int.write(0);
                        } else if (mclk_i.posedge()) {
                		  } else {	
                */
                	if (reset.read() == SC_LOGIC_1) {	
                		count_int.write(0);
                	} else if ((sync_en_int.read() == SC_LOGIC_1)) {
                		  count_int.write((count_int.read().to_uint() + 1)); 
                        }
                    }
                	
                	void comp() {
                //       if ((sync_en_int.read() == SC_LOGIC_0)) {
                		if (reset.read() == SC_LOGIC_1) {
                            sync_clk1_o.write(SC_LOGIC_0);
                            sync_clk2_o.write(SC_LOGIC_0);
                            sync_clk3_o.write(SC_LOGIC_0);
                            sync_clk4_o.write(SC_LOGIC_0);
                            sync_clk5_o.write(SC_LOGIC_0);			
                //        } else {
                		} else if ((sync_en_int.read() == SC_LOGIC_1)) {
                		    if (count_int.read().to_uint() == 0) {			
                				sync_clk1_o.write(SC_LOGIC_1);
                /*
                			} else if ((count_int.read().to_uint() == 170) && (mclk_i.negedge())) {
                				sync_clk2_o.write(SC_LOGIC_1);
                			} else if ((count_int.read().to_uint() == 255) && (mclk_i.negedge())) {
                				sync_clk3_o.write(SC_LOGIC_1);
                				sync_clk4_o.write(SC_LOGIC_1);
                			} else if ((count_int.read().to_uint() == 281) && (mclk_i.negedge())) {
                				sync_clk3_o.write(SC_LOGIC_0);
                			} else if ((count_int.read().to_uint() == 310) && (mclk_i.negedge())) {
                				sync_clk2_o.write(SC_LOGIC_0);
                			} else if ((count_int.read().to_uint() == 395) && (mclk_i.negedge())) {
                				sync_clk4_o.write(SC_LOGIC_0);
                			} else if ((count_int.read().to_uint() == 400) && (mclk_i.negedge())) {
                				sync_clk1_o.write(SC_LOGIC_0);
                			} else if ((count_int.read().to_uint() == 470) && (mclk_i.negedge())) {
                				sync_clk5_o.write(SC_LOGIC_1);
                			} else if ((count_int.read().to_uint() == 610) && (mclk_i.negedge())) {
                				sync_clk5_o.write(SC_LOGIC_0);
                			}
                */			
                			} else if (count_int.read().to_uint() == 170) {
                				sync_clk2_o.write(SC_LOGIC_1);
                			} else if (count_int.read().to_uint() == 255) {
                				sync_clk3_o.write(SC_LOGIC_1);
                				sync_clk4_o.write(SC_LOGIC_1);
                			} else if (count_int.read().to_uint() == 281) {
                				sync_clk3_o.write(SC_LOGIC_0);
                			} else if (count_int.read().to_uint() == 310) {
                				sync_clk2_o.write(SC_LOGIC_0);
                			} else if (count_int.read().to_uint() == 395) {
                				sync_clk4_o.write(SC_LOGIC_0);
                			} else if (count_int.read().to_uint() == 400) {
                				sync_clk1_o.write(SC_LOGIC_0);
                			} else if (count_int.read().to_uint() == 470) {
                				sync_clk5_o.write(SC_LOGIC_1);
                			} else if (count_int.read().to_uint() == 610) {
                				sync_clk5_o.write(SC_LOGIC_0);
                			}
                        }
                    } 
                
                    SC_CTOR(sync_pulse_gen) {
                		SC_METHOD(sync);
                        sensitive << mclk_i.pos() << reset.pos();
                		SC_METHOD(counter);
                        sensitive << mclk_i.pos() << reset.pos(); // << sync_en_int;
                        SC_METHOD(comp);
                        sensitive << mclk_i.pos() << reset.pos(); // << sync_en_int << count_int;		
                    }
                
                };
                #endif
                Hy vọng bác sẽ chia sẻ các kỹ thuật tổng hợp từ SystemC sang RTL để mọi người cùng học hỏi.

                Thân mến,

                Comment


                • #9
                  @hithere123, tôi tổng hợp bài trên của bạn dựa vô 100MHZ Xilinx Virtex và đính kèm schema cho từng khối dưới đây.

                  Top - Sync Pulse Gen


                  sync thread


                  counter thread


                  comp thread


                  VHDL code
                  http://www.megaupload.com/?d=3FK8BONJ
                  Last edited by tonyvandinh; 15-07-2011, 23:12.
                  Chúc một ngày vui vẻ
                  Tony
                  email : dientu_vip@yahoo.com

                  Comment


                  • #10
                    Chào bác Tony,

                    Em đọc VHDL thì em đoán từ SystemC bác dùng script để cho ra VHDL sau đó compile VHDL này thành mấy cái sơ đồ như trên? Vì em thấy VHDL trong file đính kèm không giống gate netlist mà vẫn là RTL.

                    Cũng giống như tổng hợp RTL thành gate netlist (pre-layout), sẽ có công cụ kiểm tra để đảm bảo RTL và gate netlist là giống nhau về mặt chức năng. Vậy thì từ bước chuyển SystemC sang RTL, có công cụ nào làm việc này không? Và cách thức làm việc của công cụ này sẽ khác như thế nào? vì cả hai đều là ngôn ngữ mang tính trừu tượng cao.

                    Rất mong bác sẽ giới thiệu thêm các kỹ thuật này để mọi người cùng học hỏi

                    Thân mến,

                    P/S: à mà bác chuyển ngược code của bạn Rommel.de là bác không dùng công cụ tự động đúng không?
                    Last edited by hithere123; 16-07-2011, 12:19.

                    Comment


                    • #11
                      Xem ra bạn Hithere123 đang muốn học synthesize systemC. Ở đây tớ đưa ra một ý kiến cá nhân có thể khác với anh Tony nhưng mà chúng ta đều có thể học hỏi thêm lẫn nhau từ các tranh luận mà.

                      Tớ nghĩ chắc bạn đồng ý với tớ, việc sử dụng các EDA tool để tổng hợp mạch nhằm làm giảm thời gian và công sức thiết kế cũng như tăng chất lượng của thiết kế. Vì vậy các công cụ mới nên tập trung vào phần mà người thiết kế tốn nhiều thời gian và công sức nhất để giải quyết vấn đề. Nói chung tớ nhận thấy rằng trong thiết kế số, thời gian để viết RTL code không phải là quá nhiều. Chủ yếu thời gian và công sức thường là để phác thảo kiến trúc, và làm verification. Phác thảo kiến trúc rất quan trọng vì nó quyết định toàn bộ hoạt động của chip về sau. Trong quá trình phác thảo kiến trúc thì mô phỏng hoạt động của kiến trúc ở mức cao là quan trọng nhất. Ở đây tớ chia ra 2 trường hợp. Trường hợp thứ nhất đơn thuần chỉ là phần cứng. Cái này người ta thường sử dụng matlab hoặc simulink để mô phỏng. Các hoạt động phần cứng như bộ lọc, biến đổi FFT... đếu được matlab mô phỏng cực kỳ tốt. Sau khi có một mô hình hoạt động tốt trên matlab rồi người ta mới chuyển sang RTL. Trường hợp thứ hai là một hệ thống cả phần cứng lẫn phần mềm thường là các hệ thống nhúng (embedded systems). Tớ lấy ví dụ như bạn muốn phát triển một điện thoại VoIP hoạt động trên LTE (LTE chỉ truyền dữ liệu không truyền thoại). Như vậy ở đây trong hệ thống của bạn có những phần chạy trên DSP, có phần chạy trên controller và có phần là ASIC. Về mặt này thì systemC thường được sử dụng. Các đoạn code trên C hoặc C++ được chuyển sang cho systemC, kết hợp thêm việc mô phỏng các khối phần cứng tớ đánh giá cái này thì systemC phù hợp nhất.

                      Việc chuyển code từ mức cao như matlab hay systemC sang RTL theo tớ đánh giá thì đây không phải là một công việc tốn nhiều thời gian và công sức đối với các kỹ sư thiết kế.

                      Phần tốn nhiều công sức nữa là verification. Về mặt này thì tớ nghĩ systemverilog phù hợp hơn systemc. Sở dĩ tớ đánh giá systemverilog phù hợp hơn bởi vì người thiết kế phần cứng thường quên với việc sử dụng verilog. Systemverilog có thể coi là phần mở rộng của verilog nên tích hợp phần design viết bằng verilog, với testbench viết bằng systemverilog rất tiện. Tớ đánh giá systemverilog tốt cho verification vì nó là ngôn ngữ hướng đối tượng. Ta có thể verification từ mức thấp lên mức cao.

                      Bên cạnh việc viết RTL code không phải là phần tốn nhiều thời gian và công sức nhất thì tớ nghĩ rằng hầu hết các kỹ sư thiết kế đều làm quen với verilog hay vhdl nên họ không muốn chuyển đổi sang ngôn ngữ khác. Ngay cả bạn muốn chuyển đổi nhưng nếu như bạn đồng nghiệp của bạn không muốn đổi thì cũng chẳng được. Vậy nên khả năng dùng systemc để thiết kế là không cao.

                      Cái này thì tớ chưa thử bao giờ nhưng tớ biết EDA tools có các công cụ equivalent checking cho phép kiểm tra 2 code tương đương. Cái này có thể kiểm tra 2 code systemc model và verilog để tránh sai sót khi chuyển từ mức cao xuống.

                      Nếu tớ không nhầm thì trong 3 hãng EDA lớn nhất là Cadence, Synopsys, và Mentor Graphics thì chỉ có Mentor là phát triển công cụ tổng hợp cho systemC.

                      Nói tóm lại theo ý tớ thì tổng hợp systemC code chưa chứng minh được tính ưu việt của nó, và trong một tương lai gần tớ không nghĩ nó có thay thể được verilog.

                      Comment


                      • #12
                        Nguyên văn bởi hithere123 Xem bài viết
                        Chào bác Tony,

                        Em đọc VHDL thì em đoán từ SystemC bác dùng script để cho ra VHDL sau đó compile VHDL này thành mấy cái sơ đồ như trên? Vì em thấy VHDL trong file đính kèm không giống gate netlist mà vẫn là RTL.

                        Cũng giống như tổng hợp RTL thành gate netlist (pre-layout), sẽ có công cụ kiểm tra để đảm bảo RTL và gate netlist là giống nhau về mặt chức năng. Vậy thì từ bước chuyển SystemC sang RTL, có công cụ nào làm việc này không? Và cách thức làm việc của công cụ này sẽ khác như thế nào? vì cả hai đều là ngôn ngữ mang tính trừu tượng cao.

                        Rất mong bác sẽ giới thiệu thêm các kỹ thuật này để mọi người cùng học hỏi

                        Thân mến,

                        P/S: à mà bác chuyển ngược code của bạn Rommel.de là bác không dùng công cụ tự động đúng không?
                        @hithere123, code VHDL mà tôi upload là RTL (không lệ thuộc vô một technology nào mặc dù thời gian dự đoán dựa vào Xilinx Virtex). Tôi dùng công cụ tổng hợp của Mentor Graphics. Nếu muốn làm C/RTL equivalent, hãng Calypto có công cụ này và tên là SLEC.

                        Chuyển ngược code của Rommel.de là tôi tự làm theo hiểu biết của tôi. Bạn Rommel.de suy nghĩ về High Level Synthesis (HLS) rất hợp lý. Khi thiết kế còn đơn giản thì người thiết kế bằng RTL sẽ có khuynh hướng dùng những gì mà quen thuộc. Hiện giờ những người làm về system architecture thích HLS hơn vì họ không biết RTL và chuyển matlab model qua C thì dễ dàng hơn. Sở dĩ vấn đề verification trở thành quan trọng là vì không có sự liên kết chặt chẽ giữa system architecture và RTL (chuyển từ matlab hoặc C qua RTL vẫn còn làm bằng tay). Khi thiết kế đã chuẩn, vì mất nhiều thời gian đễ đạt, cho nên rất là lo ngại nếu phải đổi architecture hoặc target technology hoặc cần phải chạy nhanh hơn hoặc ít tốn kém. Những thay đổi này, dù chỉ là nhỏ vẫn có thể đòi hỏi phải làm RTL lại từ đầu. Đây là lý do đã thúc đẩy sự thay đổi về cách thiết kế. Công cụ tổng hợp từ C qua RTL đã xuất hiện cách đây gần 20 năm. Sở dĩ nó không thông dụng vì không hiệu nghiệm. Qua gần 20 năm, kỹ thuật này đã tới lúc trưởng thành và đã được dùng trong rất nhiều thiết kế phức tạp. Trong 2 năm qua Cadence và Synopsys đã nhẩy vô thị trường này. Trước đây chỉ có Mentor Graphics và những hãng EDA nhỏ khác. Nhật bản và Âu Châu đi trước Mỹ về tiếp ứng kỹ thuật này vì Mỹ có rất nhiều sáng chế RTL và có khuynh hướng dùng lại. Hiện nay những thiết kế này không thích hợp và cần phải sửa đổi và nhân tiện đây, họ muốn tìm hiểu thêm về kỹ thuật này.

                        Thời gian sẽ cho biết là nó có thể thay thế RTL hay không. Theo tôi thì biết cả 2 cách thức vẫn tốt hơn
                        Chúc một ngày vui vẻ
                        Tony
                        email : dientu_vip@yahoo.com

                        Comment


                        • #13
                          Chào bạn Rommel.de,

                          Nguyên văn bởi Rommel.de Xem bài viết
                          Xem ra bạn Hithere123 đang muốn học synthesize systemC. Ở đây tớ đưa ra một ý kiến cá nhân có thể khác với anh Tony nhưng mà chúng ta đều có thể học hỏi thêm lẫn nhau từ các tranh luận mà.
                          Mình hỏi bác Tony là vì lờ mờ đoán ra bác ấy chuyên làm về các tool kiểu này. Có được người trực tiếp làm giải thích đỡ hơn phải tự tìm hiểu rất nhiều. Còn chúng ta trao đổi trên này để học hỏi lẫn nhau mình nghĩ là rất tốt, tốt cho rất nhiều người nữa vì dù sao lĩnh vực này ở Việt Nam vẫn được coi là mới. Tuy nhiên cũng không tới mức "tranh luận" đâu, mình thích trao đổi nhẹ nhàng hơn.

                          Nguyên văn bởi Rommel.de Xem bài viết
                          Tớ nghĩ chắc bạn đồng ý với tớ, việc sử dụng các EDA tool để tổng hợp mạch nhằm làm giảm thời gian và công sức thiết kế cũng như tăng chất lượng của thiết kế. Vì vậy các công cụ mới nên tập trung vào phần mà người thiết kế tốn nhiều thời gian và công sức nhất để giải quyết vấn đề. Nói chung tớ nhận thấy rằng trong thiết kế số, thời gian để viết RTL code không phải là quá nhiều. Chủ yếu thời gian và công sức thường là để phác thảo kiến trúc, và làm verification. Phác thảo kiến trúc rất quan trọng vì nó quyết định toàn bộ hoạt động của chip về sau. Trong quá trình phác thảo kiến trúc thì mô phỏng hoạt động của kiến trúc ở mức cao là quan trọng nhất.
                          Đồng ý với bạn về điểm này, mình hay trêu bọn làm ASIC là chúng mày thiết kế kiểu con nhà giàu còn kêu cái gì nữa, toàn "xe xịn" cưỡi mà tool nó làm hết cho bọn mày rồi chà bù cho bọn tao, vẫn phải dùng mấy cái đồ cổ nhiều khi phải dùng cả bút chì.

                          Nguyên văn bởi Rommel.de Xem bài viết
                          Việc chuyển code từ mức cao như matlab hay systemC sang RTL theo tớ đánh giá thì đây không phải là một công việc tốn nhiều thời gian và công sức đối với các kỹ sư thiết kế.
                          Như mình đã nói ở trên, những việc chuyển đổi kiểu này do công cụ đảm nhiệm, nên đứng ở phía người thiết kế thì nó không quan trọng. Ngoài verification thì trong phần back-end (lấy code RTL chuyển sang layout), phần timing và xử lý clock theo mình là tương đối mất nhiều thời gian nhất vì công cụ tự động vẫn "chưa đủ thông minh".

                          Nguyên văn bởi Rommel.de Xem bài viết
                          Phần tốn nhiều công sức nữa là verification. Về mặt này thì tớ nghĩ systemverilog phù hợp hơn systemc. Sở dĩ tớ đánh giá systemverilog phù hợp hơn bởi vì người thiết kế phần cứng thường quên với việc sử dụng verilog. Systemverilog có thể coi là phần mở rộng của verilog nên tích hợp phần design viết bằng verilog, với testbench viết bằng systemverilog rất tiện. Tớ đánh giá systemverilog tốt cho verification vì nó là ngôn ngữ hướng đối tượng. Ta có thể verification từ mức thấp lên mức cao.
                          Theo mình biết, với các thiết kế SoC thì SystemC đã bắt đầu được sử dụng để xây dựng các mô hình cho mạch application rồi. Nếu thiết kế phức tạp hơn nữa, không phải kỹ sư analog hay digital ngồi viết testbench mà để cho mấy bác software ngồi viết testbench thì SystemC sẽ được ưa dùng hơn nữa.

                          Nguyên văn bởi Rommel.de Xem bài viết
                          Cái này thì tớ chưa thử bao giờ nhưng tớ biết EDA tools có các công cụ equivalent checking cho phép kiểm tra 2 code tương đương. Cái này có thể kiểm tra 2 code systemc model và verilog để tránh sai sót khi chuyển từ mức cao xuống.
                          Theo mình biết thì kiểm tra equivalent giữa RTL và gate netlist (sau khi synthesis) đại khái là tool sẽ làm như sau:
                          + cả hai netlist đều được tổng hợp thành các schematic kiểu như bác Tony đưa lên ở bài trước (mạch gồm các gate-logic không phụ thuộc vào công nghệ)
                          + rồi cho cùng một bảng dữ liệu vào đối với cả hai mạch
                          + so sánh hai bàng dữ liệu ra này xem nó có giống nhau không

                          Vì thế mình mới hỏi bác Tony xem kiểm tra giữa SystemC và RTL nó có khác không? Nếu không thì từ SystemC chuyển thắng xuống gate netlist luôn giống như bước synthesis RTL vậy, tội gì phải chuyển từ SystemC xuống RTL rồi lại từ RTL xuống gate-netlist (pre-layout netlist).

                          Một vài dòng trao đổi thêm,
                          Thân mến

                          Comment


                          • #14
                            Vì thế mình mới hỏi bác Tony xem kiểm tra giữa SystemC và RTL nó có khác không? Nếu không thì từ SystemC chuyển thắng xuống gate netlist luôn giống như bước synthesis RTL vậy, tội gì phải chuyển từ SystemC xuống RTL rồi lại từ RTL xuống gate-netlist (pre-layout netlist).
                            Có thể lắm nhưng chưa tới lúc vì thiết kế dùng lại ở RTL còn khá nhiều. Vấn đề này đã được đưa ra để thảo luận và nghiên cứu 2 năm gần đây và những nhà sáng chế từ systemC đều công nhận là không cần phải qua RTL nếu thiết kế không phụ thuộc vào những khối RTL khác.
                            Chúc một ngày vui vẻ
                            Tony
                            email : dientu_vip@yahoo.com

                            Comment


                            • #15
                              Chào bác Tony,

                              Em đang quan tâm tới SystemC-AMS, bác có thể giới thiệu sơ qua về anh này được không? Em có băn khoăn về sự khác nhau giữa kiểu định nghĩa sca và tdf.
                              Ví dụ: em có một nguồn s1 theo chuẩn sca đưa vào một đầu cuộn cảm L1, đầu còn lại em đặt một nguồn s2 cũng theo kiểu sca và được điều khiển đóng ngắt như một switch. Theo nguyên lý cơ bản của cuộn cảm, thì nó cho phép sự thay đổi đột ngột điện áp nhưng không cho phép thay đổi đột ngột dòng điện, đây chính là cái em muốn kiểm tra. Nhưng khi mô phóng thì dường như máy tính bị lỗi giống như convergence trong spice. Khi thay kiểu định dạng nguồn sca bằng tdf thì lại chạy được. Theo như em tìm hiểu thì sca giống tín hiệu tương tự hơn và tdf giống như số hơn vì nó có time step. Tức là dùng sca sẽ mô phỏng giống tương tự hơn. Tuy nhiên có lẽ chính vì thế mà trong mạch mô phỏng trên, máy tính "không tính được" điểm làm việc. Nếu nối điện trở vào nguồn sca thì lại mô phỏng được tuy nhiên nguồn lúc này lại không còn là lý tưởng được nữa.

                              Rất mong bác sẽ chia sẻ một vài điều về vấn đề này!

                              Thấn mến

                              Comment

                              Về tác giả

                              Collapse

                              tonyvandinh A high tech engineer Tìm hiểu thêm về tonyvandinh

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X