博主今天刚看完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全加器建模_全加器

似乎和systemC内建的关键字冲突了,后来改了Driver,但还是显示相同的警告。

由于还没开始学习如何编写sc测试平台,所以暂时还不知道为什么会这样。。

暂且把问题留在这吧,等博主过段时间再来解答


今天博主看完了systemc的RTL级编程,默然明白错在哪了:

(1)SC_METHOD是一个需要返回的进程方法,不能做无限制的循环,所以需要改成SC_THREAD,只有这种线程方法才可以挂起。

(2)其次测试平台还需要遵循systemC的测试平台编写格式,之前的编写中sc_start语句都没有出现,所以仿真也没有开始。

下面是修改过的main.cpp代码:

int sc_main(int argc , char * argv[])
{       //    signal defination    
        sc_signal<bool> a_s , b_s , c_in_s , c_out_s , sum_s; 
               
        //  instance the component    
        simulus sim("simulus");    
        sim(a_s,b_s,c_in_s);        
        
        full_adder fa("full_adder");    
        fa(a_s , b_s , c_in_s , c_out_s , sum_s);        
        
        monitor mon("monitor");    
        mon(a_s , b_s , c_in_s , c_out_s , sum_s);        
        
        sc_start(1000,SC_NS);    
        
        return 0 ;
}

仿真结果:

  SystemC 2.3.1-Accellera --- Jun 22 2016 09:40:28

        Copyright (c) 1996-2014 by all Contributors,

        ALL RIGHTS RESERVED

#     a    b    c_in    c_out    sum 

#     0    0    0        0        0

#     a    b    c_in    c_out    sum 

#     1    0    0        0        1

#     a    b    c_in    c_out    sum 

#     1    1    0        1        0

#     a    b    c_in    c_out    sum 

#     0    0    1        0        1

#     a    b    c_in    c_out    sum 

#     1    0    1        1        0

#     a    b    c_in    c_out    sum 

#     1    1    1        1        1