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

相关推荐
m0_738206541 小时前
嵌入式学习的第二十二天-数据结构-栈+队列
数据结构·学习
远瞻。2 小时前
【论文阅读】人脸修复(face restoration ) 不同先验代表算法整理2
论文阅读·算法
先做个垃圾出来………5 小时前
哈夫曼树(Huffman Tree)
数据结构·算法
向上的车轮7 小时前
MATLAB学习笔记(七):MATLAB建模城市的雨季防洪排污的问题
笔记·学习·matlab
phoenix@Capricornus7 小时前
反向传播算法——矩阵形式递推公式——ReLU传递函数
算法·机器学习·矩阵
Inverse1627 小时前
C语言_动态内存管理
c语言·数据结构·算法
数据与人工智能律师7 小时前
虚拟主播肖像权保护,数字时代的法律博弈
大数据·网络·人工智能·算法·区块链
前端小崔7 小时前
从零开始学习three.js(18):一文详解three.js中的着色器Shader
前端·javascript·学习·3d·webgl·数据可视化·着色器
wuqingshun3141597 小时前
蓝桥杯 16. 外卖店优先级
c++·算法·职场和发展·蓝桥杯·深度优先
YouQian7728 小时前
2025春训第十九场
算法