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

相关推荐
聚客AI12 小时前
🙋‍♀️Transformer训练与推理全流程:从输入处理到输出生成
人工智能·算法·llm
大怪v14 小时前
前端:人工智能?我也会啊!来个花活,😎😎😎“自动驾驶”整起!
前端·javascript·算法
惯导马工16 小时前
【论文导读】ORB-SLAM3:An Accurate Open-Source Library for Visual, Visual-Inertial and
深度学习·算法
骑自行车的码农17 小时前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了18 小时前
AcWing学习——双指针算法
c++·算法
moonlifesudo18 小时前
322:零钱兑换(三种方法)
算法
NAGNIP1 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队2 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法