SystemC学习(3)— APB_SRAM的建模与测试

SystemC学习(3)--- APB_SRAM的建模与测试

一、前言

二、APB_SRAM建模

编写APB_SRAM模型文件apb_sram.h文件如下所示:

cpp 复制代码
#ifndef __APB_SRAM_H
#define __APB_SRAM_H

#include "systemc.h"

const int ADDR_SIZE = 32;
const int DATA_SIZE = 32;

SC_MODULE(apb_sram){
    sc_in<bool> apb_pclk;
    sc_in<bool> apb_presetn;
    sc_in<bool> apb_psel;
    sc_in<bool> apb_penable;
    sc_in<bool> apb_pwrite;
    sc_in<sc_uint<ADDR_SIZE> > apb_paddr;
    sc_in<sc_uint<DATA_SIZE> > apb_pwdata;
    sc_out<sc_uint<DATA_SIZE> > apb_prdata;
    sc_out<bool> apb_pready;
    sc_out<bool> apb_pslverr;

    sc_bv<DATA_SIZE> mem[4096];

    SC_CTOR(apb_sram){
        SC_METHOD(prc_apb_sram);    
        sensitive << apb_pclk.pos();
        sensitive << apb_presetn.neg();
    }

    void prc_apb_sram(){
        if(!apb_presetn){
            apb_prdata = 0;
            apb_pready = 0;
            apb_pslverr = 0;
        }
        else if((apb_psel.read()==1) && (apb_penable.read()==0) && (apb_pwrite.read()==0)) {
            apb_prdata = mem[(apb_paddr.read()>>2)];
        }
        else if((apb_psel.read()==1) && (apb_penable.read()==1) && (apb_pwrite.read()==0)) {
            apb_pready = 1;
        }
        else if((apb_psel.read()==1) && (apb_penable.read()==1) && (apb_pwrite.read()==1)) {
            mem[(apb_paddr.read()>>2)] = apb_pwdata;
            apb_pready = 1;
        }
        else {
            apb_prdata = apb_prdata;
            apb_pready = 0;
        }
    }
};

#endif

三、测试平台

编写"driver.h"如下所示:

cpp 复制代码
#ifndef __DRIVER_H
#define __DRIVER_H

#include "apb_sram.h"

SC_MODULE(driver){
    sc_in<bool> apb_pclk;
    sc_out<bool> apb_presetn;
    sc_out<bool> apb_psel;
    sc_out<bool> apb_penable;
    sc_out<bool> apb_pwrite;
    sc_out<sc_uint<ADDR_SIZE> > apb_paddr;
    sc_out<sc_uint<DATA_SIZE> > apb_pwdata;
    sc_in<sc_uint<DATA_SIZE> > apb_prdata;
    sc_in<bool> apb_pready;
    sc_in<bool> apb_pslverr;

    SC_CTOR(driver){
        SC_THREAD(prc_test);
        sensitive << apb_pclk.pos();
    }

    void prc_test(){
        apb_presetn.write(0);
        apb_psel.write(0);
        apb_penable.write(0);
        apb_pwrite.write(0);
        apb_paddr.write(0);
        apb_pwdata.write(0);
        wait();
        wait();
        apb_presetn.write(1);
        wait();
        wait();
        // write
        for(int i=0; i<16; i++) {
            apb_psel.write(1);
            apb_penable.write(0);
            apb_pwrite.write(1);
            apb_paddr.write(i*4);
            apb_pwdata.write(i);
            wait();
            apb_penable.write(1);
            wait();
            while(apb_pready.read() != 1){
                wait();
            }
            apb_psel.write(0);
            apb_penable.write(0);
            wait();
            wait();
        }
        // read
        for(int i=0; i<16; i++) {
            apb_psel.write(1);
            apb_penable.write(0);
            apb_pwrite.write(0);
            apb_paddr.write(i*4);
            wait();
            apb_penable.write(1);
            wait();
            while(apb_pready.read() != 1){
                wait();
            }
            apb_psel.write(0);
            apb_penable.write(0);
            wait();
            wait();
        }

        sc_stop();
    }

};

#endif

四、测试运行

使用如下命令进行编译:

bash 复制代码
g++ main.cpp -I${SYSTEMC_HOME}/include/ -L${SYSTEMC_HOME}/lib-linux64 -lsystemc -o run.x

运行命令:

bash 复制代码
./run.x

打开test.vcd 文件可看到波形如下所示:

相关推荐
yuhouxiyang2 分钟前
学习海康VisionMaster之卡尺工具
学习·计算机视觉
Lester_11018 分钟前
嵌入式学习笔记 - HAL_xxx_MspInit(xxx);函数
笔记·学习
龙湾开发23 分钟前
ShaderToy学习笔记 02.圆
笔记·学习
minji...24 分钟前
C语言 函数递归
c语言·开发语言·算法
你好我是咯咯咯26 分钟前
代码随想录算法训练营Day36
算法
uhakadotcom34 分钟前
如何用AI打造高效招聘系统,HR效率提升100%!
后端·算法·面试
虾球xz1 小时前
游戏引擎学习第246天:将 Worker 上下文移到主线程创建
c++·学习·游戏引擎
蓝莓味柯基1 小时前
DevOps:概念与学习路径
运维·学习·devops
赏你个麻辣烫儿1 小时前
机器学习学习笔记
笔记·学习
天哥-天行健1 小时前
Trae+DeepSeek学习Python开发MVC框架程序笔记(一):1个程序实现MVC
学习·mvc