1. 程式人生 > >systemC全加器建模

systemC全加器建模

RoCE ^c 時序 col oid 建模 fine def iostream

博主今天剛看完systemC的時序建模和組合建模部分,就開始寫sc代碼了,但遇到了很多錯誤。。。

base.h頭文件:

#ifndef _base_
#define _base_
#include "systemc.h"
#include <iostream>
#endif

關於全加器的定義 full_adder.h :

#include "base.h"
#ifndef _full_adder_
#define _full_adder_
SC_MODULE(Full_Adder)
{
    sc_in<bool>   a , b , carry_in ;
    sc_out<bool>  sum , carry_out ;
    
    void Full_Adder_Proc();
    
    SC_CTOR(Full_Adder){
        SC_METHOD(Full_Adder_Proc);
        sensitive<<a<<b<<carry_in ;
    }
};
#endif

關於全加器的函數 full_adder.cpp :

#include "full_adder.h"
void Full_Adder::Full_Adder_Proc(){
    sum = a^b^carry_in ;
    carry_out = a&carry_in |  b&carry_in | a&b ;
}

關於信號驅動的頭文件 driver.h:

#include "base.h"
#ifndef _driver_
#define _driver_
SC_MODULE(driver)
{
    sc_out<bool > d_a , d_b , d_cin;
    
    void driver_proc();
    
    SC_CTOR(driver){
        SC_METHOD(driver_proc);
    }
};
#endif

關於信號驅動的實現代碼driver.cpp:

#include "driver.h"
void driver::driver_proc(){   
 sc_uint<3> temp;  
       
 temp = 0 ;    
    
  while(1){       
           d_a = temp[0];      
           d_b = temp[1];        
           d_cin = temp[2]; 
          
           wait(5,SC_NS);       
           temp++;    
          };    
}

關於monitor的頭文件:

#include "base.h"
#ifndef _monitor_
#define _monitor_
SC_MODULE(Monitor){
    sc_in<bool> a , b , carry_in , sum , carry_out ;
    
    void Monitor_Proc();
    
    SC_CTOR(Monitor){
            SC_METHOD(Monitor_Proc);
            sensitive<<a<<b<<carry_in<<sum<<carry_out ;
    }
};
#endif

關於monitor的實現:

#include "monitor.h"
void Monitor::Monitor_Proc(){
    std::cout<<" a:"<<a<<" b:"<<b<<" cin:"<<carry_in;
    std::cout<<"sum:"<<sum<<" cout:"<<carry_out<<std::endl;
}

期間博主犯了兩個很傻的錯誤:

(1) 其中一個文件把#ifndef 寫成了 #ifdef

(2) 構造函數SC_CTOR寫成了SC_STOR

導致一直編譯不能通過。。。。。。。。。。

在解決這些問題後,終於正常通過了,正打算看看結果,卻發現:

技術分享圖片

似乎和systemC內建的關鍵字沖突了,後來改了Driver,但還是顯示相同的警告。

由於還沒開始學習如何編寫sc測試平臺,所以暫時還不知道為什麽會這樣。。

暫且把問題留在這吧,等博主過段時間再來解答

systemC全加器建模