Thông báo

Collapse
No announcement yet.

Tutorial : Căn bản về systemC để mô hình phần cứng

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    Ah, vậy phải làm lệch mấy tín hiệu đó 1 chút ah ?

    wait(DELAY, SC_NS);

    ce = sc_logic(0);
    din = sc_lv<8> (0);

    Comment


    • #17
      Nguyên văn bởi jefflieu Xem bài viết
      Ah, vậy phải làm lệch mấy tín hiệu đó 1 chút ah ?
      Đúng đấy, cứ tưởng tượng như mấy tín hiệu đó đi từ đường ra của những DFF khác mà dùng cùng một xung clock. tb cũng có thể sửa lại để tạo ra CE và DIN từ xung clock và trong trường hợp này mình có thể kô cần độ trễ nữa vì simulator biết là mấy tín hiệu đó biến động sau xung clock.
      Chúc một ngày vui vẻ
      Tony
      email : dientu_vip@yahoo.com

      Comment


      • #18
        Sửa lại tb để khỏi làm trễ CE và DIN

        Jeff có thể dùng cách này để khỏi lệ thuộc vào simulator resolution

        Code:
        #include <systemc.h>
        
        SC_MODULE(DFF){
          sc_in<sc_logic> ce;
          sc_in_clk clk;
          sc_in<sc_lv<8> > din;
          sc_out<sc_lv<8> > dout;
        
          void execute(void)
          {
            if(ce.read()==1)
            {
              dout.write(din.read());
            }
          }
          
          SC_CTOR(DFF) :
            clk("clk"), ce("ce"), din("din"), dout("dout")
          {
            cout<<"DFF created"<<endl;
            SC_METHOD(execute);
            sensitive<<clk.pos();
          }
        };
        
        SC_MODULE(tb)
        {
          sc_in_clk clk;
          sc_out<sc_logic> ce;
          sc_out<sc_lv<8> > din;
          sc_in<sc_lv<8> > dout;
          
          void stim()
          {    
            ce = sc_logic(0);
            din = sc_lv<8> (0);
            
            for (int i=0; i<10; i++)
              wait();
              
            ce = sc_logic(1);
            
            for (int i=0; i<10; i++)
            {
              din = sc_lv<8> (rand() % 256);
              wait();
            }
            sc_stop();
          }
          
          SC_CTOR(tb)
          {
            SC_THREAD(stim);
            sensitive<<clk.pos();
          }
        };
        
        int sc_main(int argc, char *argv[])
        {
          DFF dut("dut");
          tb stim("stim");
          
          sc_signal<sc_logic> ce;
          sc_clock clk("clk", 10, SC_NS);
          sc_signal<sc_lv<8> > din;
          sc_signal<sc_lv<8> > dout;
          
          dut(ce, clk, din, dout);
          stim(clk, ce, din, dout);
            
          sc_start(-1);
          return 0;
        }
        Chúc một ngày vui vẻ
        Tony
        email : dientu_vip@yahoo.com

        Comment


        • #19
          Thanks a ... để từ từ J ngâm cứu tiếp

          Comment


          • #20
            Hi thầy Tony,
            BUF_top_f<N,S>::execute()
            {
            cout<<"-----------------------------------------------"<<endl;
            cout<<"BUF2"<<S<<" Executed. State = "<<state<<endl;
            if(state==-1)
            {
            if(sof_i==SC_LOGIC_1) state=0;
            }else
            if (state==(N/S-1))
            state = 0;
            else
            state = state+1;
            //Register input
            sof_i = sof.read();
            real_i = real_in.read();
            imag_i = imag_in.read();
            cout<<"BUF2"<<S<<" Executed. State = "<<state<<" "<<real_i<<" "<<imag_i<<endl;
            }

            Em đang viết đoạn code này, đoạn này sẽ được trigger ở rising edge của clock, ... Khi em in ra thì thấy giá trị của state ở 2 đoạn COUT đó giống nhau.
            Như vậy tất cả các statement trong function execute đó thực hiện cùng 1 lúc hả?
            Mới dùng SystemC này nó kì kì, đọc qua mấy tutorial tren www.asic-world.com cũng không thấy nói về khái niệm CONCURRENT, SEQUENTIAL như VHDL hoặc block với non-block của Verilog.

            Comment


            • #21
              Nguyên văn bởi jefflieu Xem bài viết
              Hi thầy Tony,
              BUF_top_f<N,S>::execute()
              {
              cout<<"-----------------------------------------------"<<endl;
              cout<<"BUF2"<<S<<" Executed. State = "<<state<<endl;
              if(state==-1)
              {
              if(sof_i==SC_LOGIC_1) state=0;
              }else
              if (state==(N/S-1))
              state = 0;
              else
              state = state+1;
              //Register input
              sof_i = sof.read();
              real_i = real_in.read();
              imag_i = imag_in.read();
              cout<<"BUF2"<<S<<" Executed. State = "<<state<<" "<<real_i<<" "<<imag_i<<endl;
              }

              Em đang viết đoạn code này, đoạn này sẽ được trigger ở rising edge của clock, ... Khi em in ra thì thấy giá trị của state ở 2 đoạn COUT đó giống nhau.
              Như vậy tất cả các statement trong function execute đó thực hiện cùng 1 lúc hả?
              Mới dùng SystemC này nó kì kì, đọc qua mấy tutorial tren www.asic-world.com cũng không thấy nói về khái niệm CONCURRENT, SEQUENTIAL như VHDL hoặc block với non-block của Verilog.
              Hi Jeff,

              Jeff posted có nửa bài thì khó cho tôi hiểu là bị vấn đề gì, Điều mà tôi cần biết ở đây là:

              "state" và sof_i cần phải initialized. Jeff có thể dùng constructor để làm việc này hoặc mang thêm "reset" signal vô hàm "execute".

              Tạm viết lại như sau:

              Code:
              BUF_top_f<N,S>::BUF_top_f()
              {
              	cout << "Constructing BUF_top_f" << endl;
              	state = 0;
              	sof_i = 0;
              }
              
              void BUF_top_f<N,S>::execute()
              {
              	if(state==-1) 
              	{
              		if(sof_i==SC_LOGIC_1) 
              			state=0;
              	} else if (state==(N/S-1)) 
              		state = 0; 
              	else 
              		state = state+1;
              		
              	//Register input
              	sof_i = sof.read();
              	real_i = real_in.read();
              	imag_i = imag_in.read();
              	cout<<"BUF2"<<S<<" Executed. State = "<<state<<" "<<real_i<<" "<<imag_i<<endl;
              }
              Tony
              Chúc một ngày vui vẻ
              Tony
              email : dientu_vip@yahoo.com

              Comment


              • #22
                Nguyên văn bởi jefflieu Xem bài viết
                Em đang viết đoạn code này, đoạn này sẽ được trigger ở rising edge của clock, ... Khi em in ra thì thấy giá trị của state ở 2 đoạn COUT đó giống nhau.
                Như vậy tất cả các statement trong function execute đó thực hiện cùng 1 lúc hả?
                Mới dùng SystemC này nó kì kì, đọc qua mấy tutorial tren www.asic-world.com cũng không thấy nói về khái niệm CONCURRENT, SEQUENTIAL như VHDL hoặc block với non-block của Verilog.
                Theo nguyên tắc, tất cả statement đều hoạt động sequentially. SystemC giới thiệu "multi thread" để mô tả sự đồng biến (concurrency) của hardware. Nếu mình muốn concurrency thì phải tạo ra thêm thread (chia việc). Tất cả mọi thread trong một execution đều cùng khởi động một lúc theo một đơn vị thời gian ảo. Mỗi thread sẽ được tuần tự execute (nếu chỉ chạy trên 1 CPU) arbitrary order. Thread phải tự pipeline lấy cũng giống như làm xong thì vô xếp hàng trở lại. Độ trễ của thread tùy theo trigger (sensitivity) và wait(). Ví dụ như tất cả mọi hoạt động trong "exectue" sẽ xẩy ra tại cạnh của xung clock. Hàm "execute" nên register bằng SC_METHOD với sensitive của cạnh của clock. Khi trigger bởi clock, mọi hoạt động sẽ tiến hành lại từ đầu. Còn nếu dùng SC_THREAD hoặc SC_CTHREAD thì phải tạo while (true) loop với wait(). Dùng wait() để dừng lại cho mỗi trigger (clock). Để khi nào rảnh, tôi sễ cho ví dụ để phân biệt sự khác nhau.

                Tony
                Chúc một ngày vui vẻ
                Tony
                email : dientu_vip@yahoo.com

                Comment


                • #23
                  Chà, phiền a viết lại code quá, sorry anh.

                  Cái Jeff thắc mắc là vầy:
                  void BUF_top_f<N,S>::execute()
                  {
                  cout<<"BUF2"<<S<<" Executed. State = "<<state<<" "<<real_i<<" "<<imag_i<<endl;
                  if (state==(N/S-1))
                  state = 0;
                  else
                  state = state+1;

                  cout<<"BUF2"<<S<<" Executed. State = "<<state<<" "<<real_i<<" "<<imag_i<<endl;
                  }
                  Trong đó Jeff in state 2 lần, kết quả 2 chỗ in cho ra 1 giá trị của state, giá trị được in ra là giá trị của state ngay tại clock.

                  Comment


                  • #24
                    Nguyên văn bởi jefflieu Xem bài viết
                    Chà, phiền a viết lại code quá, sorry anh.

                    Cái Jeff thắc mắc là vầy:

                    Trong đó Jeff in state 2 lần, kết quả 2 chỗ in cho ra 1 giá trị của state, giá trị được in ra là giá trị của state ngay tại clock.
                    Nếu N=S thì state ở 2 nơi đều bằng 0. Jeff coi lại N và S nhe
                    Chúc một ngày vui vẻ
                    Tony
                    email : dientu_vip@yahoo.com

                    Comment


                    • #25
                      Không, trường hợp state khác 0 cũng cho ra state ở 2 chỗ giống nhau, một đoạn output của c.trình.
                      Anh bỏ qua mấy chỗ râu ria,
                      Code:
                      void BUF_top_f<N,S>::execute()
                      {
                      cout<<"BUF2"<<S<<" Executed1. State = "<<state<<" "<<real_i<<" "<<imag_i<<endl;
                      if (state==0)
                      {if(sof_i==SC_LOGIC_1) state=1;}
                      else
                      if (state==(N/S-1)) state = 0; else state = state+1;
                      //Register input
                      sof_i = sof.read();
                      real_i = real_in.read();
                      imag_i = imag_in.read();
                      cout<<"BUF2"<<S<<" Executed2. State = "<<state<<" "<<real_i<<" "<<imag_i<<endl;
                      }
                      BUF21 Executed1. State = 1 1 0
                      BUF21 Executed2. State = 1 1 0

                      BUF21BUF_top_f<8,1>::mult_Wkn
                      BUF21BUF_top_f<8,1>::compute_BUF2
                      BUF21BUF_top_f<8,1>::Wkn_ROM
                      X=0 4 0
                      Shift is called:2 1 0 3
                      Shift is called:0 0 0 0
                      ---------------------
                      State :2
                      Wkn r :0
                      Wkn i :0
                      Sof :0
                      Real i:2
                      Imag i:0
                      Real o:0
                      Imag o:0
                      S i r :2
                      S i i :0
                      S o r :2
                      S o i :0
                      x+x4 r:4
                      x+x4 i:0
                      x-x4 r:0
                      x-x4 i:0
                      ---------------------
                      BUF21 Executed1. State = 2 2 0
                      BUF21 Executed2. State = 2 2 0

                      BUF21BUF_top_f<8,1>::mult_Wkn
                      BUF21BUF_top_f<8,1>::compute_BUF2
                      BUF21BUF_top_f<8,1>::Wkn_ROM
                      X=1 5 0
                      Shift is called:3 2 1 0
                      Shift is called:0 0 0 0
                      :-s sao kì vậy :s

                      Comment


                      • #26
                        Jeff khai báo state là sc_signal<int>.

                        Comment


                        • #27
                          Nguyên văn bởi jefflieu Xem bài viết
                          Jeff khai báo state là sc_signal<int>.
                          Jeff đổi state qua int và thử coi nhe. Vì sc_signal là channel nó không có giá trị trực tiếp
                          Chúc một ngày vui vẻ
                          Tony
                          email : dientu_vip@yahoo.com

                          Comment


                          • #28
                            Jeff nghĩ khi kiểu int sẽ "bình thường" vì nó là kiểu native của C++.
                            Vậy sc_signal<int> khác với int như thế nào? ... thôi để Jeff nghiên cứu tiếp.
                            :-s

                            Comment


                            • #29
                              Nguyên văn bởi jefflieu Xem bài viết
                              Jeff nghĩ khi kiểu int sẽ "bình thường" vì nó là kiểu native của C++.
                              Vậy sc_signal<int> khác với int như thế nào? ... thôi để Jeff nghiên cứu tiếp.
                              :-s
                              sc_signal cũng gần giống như signal ở VHDL. Nó sẽ không được thay đổi nếu thời gian không thay đổi. Còn ở VHDL thì signal sẽ không thay đổi trông cùng một event. "int" có thể coi như giống variable ở VHDL, có thể thay đổi bất cứ lúc nào.

                              Thường thì sc_signal hay được dùng để móc nối các khối với nhau giống như "wire" (dây). Trong cùng một thread dùng C variable. Đường vào và ra thì dùng ports. Móc nối ports với nhau thì dùng channel (signal, fifo và etc...)
                              Chúc một ngày vui vẻ
                              Tony
                              email : dientu_vip@yahoo.com

                              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