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

相关推荐
阿Y加油吧6 分钟前
二刷 LeetCode:动态规划经典双题复盘
算法·leetcode·动态规划
上弦月-编程21 分钟前
C语言指针超详细教程——从入门到精通(面向初学者)
java·数据结构·算法
莫等闲-23 分钟前
代码随想录一刷记录Day44——leetcode1143.最长公共子序列 53. 最大子序和
数据结构·c++·算法·leetcode·动态规划
不灭锦鲤23 分钟前
网络安全学习第101天
学习
生成论实验室24 分钟前
《事件关系阴阳博弈动力学:识势应势之道》第七篇:社会与情感关系——连接、表达与共鸣
人工智能·算法·架构·交互·创业创新
承渊政道27 分钟前
【动态规划算法】(背包问题经典模型与解题套路)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法
yyy(十一月限定版)1 小时前
数电1对应latex代码
算法
jieyucx1 小时前
Go语言切片:动态灵活的数据序列
算法·golang·指针·顺序表·数组·结构体·切片
我头发多我先学1 小时前
C++ 红黑树:从规则到实现,手把手带你写一棵红黑树
数据结构·c++·算法
遗憾随她而去.1 小时前
Java学习(一)
java·开发语言·学习