www.pudn.com > noc.rar > brom8k.h
/*
* TU Eindhoven
* Eindhoven, The Netherlands
*
* Name : brom8k.h
*
* Author : A.S.Slusarczyk@tue.nl
*
* Date :
*
* Function :
*
*/
#ifndef BROM8K_H_INCLUDED
#define BROM8K_H_INCLUDED
#include "mips.h"
#include "xlxram.h"
// BlockRAM wrapper
SC_MODULE(BROM8KCONV) {
sc_in < sc_bv > addr;
sc_out< sc_bv > dout;
sc_in< sc_bv<1> > en;
sc_in< bool > clk;
sc_out< bool > memwait;
sc_in > DO0, DO1, DO2, DO3;
sc_in > DOP0, DOP1, DOP2, DOP3;
sc_out > ADDR0, ADDR1, ADDR2, ADDR3;
sc_out > DI0, DI1, DI2, DI3;
sc_out > DIP0, DIP1, DIP2, DIP3;
sc_out EN0, EN1, EN2, EN3;
sc_out CLK0, CLK1, CLK2, CLK3;
sc_out WE0, WE1, WE2, WE3;
sc_out SSR0, SSR1, SSR2, SSR3;
void in();
void out();
SC_CTOR(BROM8KCONV) {
SC_METHOD(in);
sensitive << addr << en << clk;
SC_METHOD(out);
sensitive << DO0 << DO1 << DO2 << DO3 << DOP0 << DOP1 << DOP2 << DOP3;
};
};
// Converter for the debugging access
// Debug does not require byte-level access, so converter can be much simpler
SC_MODULE(DBGBROM8KCONV) {
sc_out > DO;
sc_in > ADDR;
sc_in > DI;
sc_in EN;
sc_in CLK;
sc_in WE;
sc_in RST;
sc_in > DO0, DO1, DO2, DO3;
sc_in > DOP0, DOP1, DOP2, DOP3;
sc_out > ADDR0, ADDR1, ADDR2, ADDR3;
sc_out > DI0, DI1, DI2, DI3;
sc_out > DIP0, DIP1, DIP2, DIP3;
sc_out EN0, EN1, EN2, EN3;
sc_out CLK0, CLK1, CLK2, CLK3;
sc_out WE0, WE1, WE2, WE3;
sc_out SSR0, SSR1, SSR2, SSR3;
void in();
void out();
SC_CTOR(DBGBROM8KCONV) {
SC_METHOD(in);
sensitive << ADDR << DI << EN << WE << RST << CLK;
SC_METHOD(out);
sensitive << DO0 << DO1 << DO2 << DO3 << DOP0 << DOP1 << DOP2 << DOP3;
};
};
// the RAM class is just an RTL module connecting BlockRAM with its wrapper(s)
SC_MODULE(ROM8K) {
sc_in < sc_bv > addr;
sc_out< sc_bv > dout;
sc_in< bool > clk;
sc_in< sc_bv<1> > en;
sc_out< bool > memwait;
RAMB16_S9_S9 *bram0;
RAMB16_S9_S9 *bram1, *bram2, *bram3;
BROM8KCONV *conv;
sc_signal > DO0, DO1, DO2, DO3;
sc_signal > DOP0, DOP1, DOP2, DOP3;
sc_signal > ADDR0, ADDR1, ADDR2, ADDR3;
sc_signal > DI0, DI1, DI2, DI3;
sc_signal > DIP0, DIP1, DIP2, DIP3;
sc_signal EN0, EN1, EN2, EN3;
sc_signal CLK0, CLK1, CLK2, CLK3;
sc_signal WE0, WE1, WE2, WE3;
sc_signal SSR0, SSR1, SSR2, SSR3;
DBGBROM8KCONV *dbgconv;
// independent access to the second set of ports for debugging
sc_out > dbgDO;
sc_in > dbgADDR;
sc_in > dbgDI;
sc_in dbgEN;
sc_in dbgCLK;
sc_in dbgWE;
sc_in dbgRST;
sc_signal > dDO0, dDO1, dDO2, dDO3;
sc_signal > dDOP0, dDOP1, dDOP2, dDOP3;
sc_signal > dADDR0, dADDR1, dADDR2, dADDR3;
sc_signal > dDI0, dDI1, dDI2, dDI3;
sc_signal > dDIP0, dDIP1, dDIP2, dDIP3;
sc_signal dEN0, dEN1, dEN2, dEN3;
sc_signal dCLK0, dCLK1, dCLK2, dCLK3;
sc_signal dWE0, dWE1, dWE2, dWE3;
sc_signal dSSR0, dSSR1, dSSR2, dSSR3;
#ifndef VERILOG
void mem_init(const char *filename, int size=ROMSIZE);
void mem_dump(const char *filename, int size=ROMSIZE);
#endif
SC_CTOR(ROM8K) {
bram0 = new RAMB16_S9_S9("bram0");
bram1 = new RAMB16_S9_S9("bram1");
bram2 = new RAMB16_S9_S9("bram2");
bram3 = new RAMB16_S9_S9("bram3");
conv = new BROM8KCONV("conv");
bram1->DOA(DO1); conv->DO1(DO1);
bram0->DOA(DO0); conv->DO0(DO0);
bram1->DOPA(DOP1); conv->DOP1(DOP1);
bram0->DOPA(DOP0); conv->DOP0(DOP0);
bram1->ADDRA(ADDR1); conv->ADDR1(ADDR1);
bram0->ADDRA(ADDR0); conv->ADDR0(ADDR0);
bram1->DIA(DI1); conv->DI1(DI1);
bram0->DIA(DI0); conv->DI0(DI0);
bram1->DIPA(DIP1); conv->DIP1(DIP1);
bram0->DIPA(DIP0); conv->DIP0(DIP0);
bram1->ENA(EN1); conv->EN1(EN1);
bram0->ENA(EN0); conv->EN0(EN0);
bram1->CLKA(CLK1); conv->CLK1(CLK1);
bram0->CLKA(CLK0); conv->CLK0(CLK0);
bram1->WEA(WE1); conv->WE1(WE1);
bram0->WEA(WE0); conv->WE0(WE0);
bram1->SSRA(SSR1); conv->SSR1(SSR1);
bram0->SSRA(SSR0); conv->SSR0(SSR0);
bram3->DOA(DO3); conv->DO3(DO3);
bram2->DOA(DO2); conv->DO2(DO2);
bram3->DOPA(DOP3); conv->DOP3(DOP3);
bram2->DOPA(DOP2); conv->DOP2(DOP2);
bram3->ADDRA(ADDR3); conv->ADDR3(ADDR3);
bram2->ADDRA(ADDR2); conv->ADDR2(ADDR2);
bram3->DIA(DI3); conv->DI3(DI3);
bram2->DIA(DI2); conv->DI2(DI2);
bram3->DIPA(DIP3); conv->DIP3(DIP3);
bram2->DIPA(DIP2); conv->DIP2(DIP2);
bram3->ENA(EN3); conv->EN3(EN3);
bram2->ENA(EN2); conv->EN2(EN2);
bram3->CLKA(CLK3); conv->CLK3(CLK3);
bram2->CLKA(CLK2); conv->CLK2(CLK2);
bram3->WEA(WE3); conv->WE3(WE3);
bram2->WEA(WE2); conv->WE2(WE2);
bram3->SSRA(SSR3); conv->SSR3(SSR3);
bram2->SSRA(SSR2); conv->SSR2(SSR2);
conv->addr(addr);
conv->dout(dout);
conv->clk(clk);
conv->memwait(memwait);
conv->en(en);
dbgconv = new DBGBROM8KCONV("dbgconv");
dbgconv->DO(dbgDO);
dbgconv->ADDR(dbgADDR);
dbgconv->DI(dbgDI);
dbgconv->EN(dbgEN);
dbgconv->CLK(dbgCLK);
dbgconv->WE(dbgWE);
dbgconv->RST(dbgRST);
bram1->DOB(dDO1); dbgconv->DO1(dDO1);
bram0->DOB(dDO0); dbgconv->DO0(dDO0);
bram1->DOPB(dDOP1); dbgconv->DOP1(dDOP1);
bram0->DOPB(dDOP0); dbgconv->DOP0(dDOP0);
bram1->ADDRB(dADDR1); dbgconv->ADDR1(dADDR1);
bram0->ADDRB(dADDR0); dbgconv->ADDR0(dADDR0);
bram1->DIB(dDI1); dbgconv->DI1(dDI1);
bram0->DIB(dDI0); dbgconv->DI0(dDI0);
bram1->DIPB(dDIP1); dbgconv->DIP1(dDIP1);
bram0->DIPB(dDIP0); dbgconv->DIP0(dDIP0);
bram1->ENB(dEN1); dbgconv->EN1(dEN1);
bram0->ENB(dEN0); dbgconv->EN0(dEN0);
bram1->CLKB(dCLK1); dbgconv->CLK1(dCLK1);
bram0->CLKB(dCLK0); dbgconv->CLK0(dCLK0);
bram1->WEB(dWE1); dbgconv->WE1(dWE1);
bram0->WEB(dWE0); dbgconv->WE0(dWE0);
bram1->SSRB(dSSR1); dbgconv->SSR1(dSSR1);
bram0->SSRB(dSSR0); dbgconv->SSR0(dSSR0);
bram3->DOB(dDO3); dbgconv->DO3(dDO3);
bram2->DOB(dDO2); dbgconv->DO2(dDO2);
bram3->DOPB(dDOP3); dbgconv->DOP3(dDOP3);
bram2->DOPB(dDOP2); dbgconv->DOP2(dDOP2);
bram3->ADDRB(dADDR3); dbgconv->ADDR3(dADDR3);
bram2->ADDRB(dADDR2); dbgconv->ADDR2(dADDR2);
bram3->DIB(dDI3); dbgconv->DI3(dDI3);
bram2->DIB(dDI2); dbgconv->DI2(dDI2);
bram3->DIPB(dDIP3); dbgconv->DIP3(dDIP3);
bram2->DIPB(dDIP2); dbgconv->DIP2(dDIP2);
bram3->ENB(dEN3); dbgconv->EN3(dEN3);
bram2->ENB(dEN2); dbgconv->EN2(dEN2);
bram3->CLKB(dCLK3); dbgconv->CLK3(dCLK3);
bram2->CLKB(dCLK2); dbgconv->CLK2(dCLK2);
bram3->WEB(dWE3); dbgconv->WE3(dWE3);
bram2->WEB(dWE2); dbgconv->WE2(dWE2);
bram3->SSRB(dSSR3); dbgconv->SSR3(dSSR3);
bram2->SSRB(dSSR2); dbgconv->SSR2(dSSR2);
};
};
#endif