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 文件可看到波形如下所示:

相关推荐
烂蜻蜓3 分钟前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
OYangxf4 分钟前
图论----拓扑排序
算法·图论
我要昵称干什么13 分钟前
基于S函数的simulink仿真
人工智能·算法
Three~stone24 分钟前
MySQL学习集--DDL
数据库·sql·学习
齐尹秦35 分钟前
HTML 音频(Audio)学习笔记
学习
AndrewHZ38 分钟前
【图像处理基石】什么是tone mapping?
图像处理·人工智能·算法·计算机视觉·hdr
念九_ysl38 分钟前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法
守正出琦40 分钟前
日期类的实现
数据结构·c++·算法
ChoSeitaku43 分钟前
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
c++·算法·蓝桥杯
瞌睡不来1 小时前
(学习总结32)Linux 基础 IO
linux·学习·io