-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathbkram.txt
122 lines (116 loc) · 3.47 KB
/
bkram.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
################################################################################
##
## Filename: auto-data/bkram.txt
##
## Project: AutoFPGA, a utility for composing FPGA designs from peripherals
## {{{
## Purpose: To define the interface to a generic block RAM device for the
## purposes of autofpga.
##
## Creator: Dan Gisselquist, Ph.D.
## Gisselquist Technology, LLC
##
################################################################################
## }}}
## Copyright (C) 2017-2024, Gisselquist Technology, LLC
## {{{
## This program is free software (firmware): you can redistribute it and/or
## modify it under the terms of the GNU General Public License as published
## by the Free Software Foundation, either version 3 of the License, or (at
## your option) any later version.
##
## This program is distributed in the hope that it will be useful, but WITHOUT
## ANY WARRANTY; without even the implied warranty of MERCHANTIBILITY or
## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
## for more details.
##
## You should have received a copy of the GNU General Public License along
## with this program. (It's in the $(ROOT)/doc directory. Run make with no
## target there if the PDF file isn't present.) If not, see
## <http://www.gnu.org/licenses/> for a copy.
## }}}
## License: GPL, v3, as defined and found on www.gnu.org,
## {{{
## http://www.gnu.org/licenses/gpl.html
##
##
################################################################################
##
## }}}
@PREFIX=bkram
@DEVID=BKRAM
@$LGMEMSZ=20
@LGMEMSZ.FORMAT=%d
@$NADDR=(1<<(@$(THIS.LGMEMSZ)))/(@$(SLAVE.BUS.WIDTH)/8)
@$NBYTES=(1<<(@$THIS.LGMEMSZ))
@NBYTES.FORMAT=0x%08x
@ACCESS=@$(DEVID)_ACCESS
@SLAVE.TYPE=MEMORY
@SLAVE.BUS=wbwide
@MAIN.INSERT=
memdev #(
.LGMEMSZ(@$(THIS.LGMEMSZ)),
.DW(@$(SLAVE.BUS.WIDTH)),
.EXTRACLOCK(1)
) u_@$(PREFIX) (
.i_clk(@$(SLAVE.BUS.CLOCK.WIRE)),
.i_reset(@$(SLAVE.BUS.CLOCK.RESET)),
@$(SLAVE.ANSIPORTLIST)
);
@REGS.N=1
@REGS.0= 0 R_@$(DEVID) RAM
@REGDEFS.H.DEFNS=
#define @$(DEVID)BASE @$[0x%08x](REGBASE)
#define @$(DEVID)LEN @$NBYTES
@BDEF.OSDEF=_BOARD_HAS_@$(DEVID)
@MEM.NAME= @$(PREFIX)
@BDEF.OSVAL=extern char _@$(MEM.NAME)[@$NBYTES];
@LD.PERM= wx
@LD.NAME= @$(MEM.NAME)
@RTL.MAKE.GROUP= @$(DEVID)
@RTL.MAKE.SUBD=
@RTL.MAKE.FILES= memdev.v
@$NADDRHX = @$NADDR
@NADDRHX.FORMAT= 0x%x
@SIM.INCLUDE=
#include "byteswap.h"
@SIM.DEFINES=
#ifndef VVAR
#ifdef ROOT_VERILATOR
#include "Vmain___024root.h"
#define VVAR(A) rootp->main__DOT_ ## A
#elif defined(NEW_VERILATOR)
#define VVAR(A) main__DOT_ ## A
#else
#define VVAR(A) v__DOT_ ## A
#endif
#endif
#define block_ram rootp->main__DOT__u_@$(PREFIX)__DOT__mem.m_storage
@$BUSBYTES=@$(SLAVE.BUS.WIDTH)/8
@SLAVE.ORDER=1
@SIM.LOAD=
start = start & (-4);
wlen = (wlen+3)&(-4);
// Need to byte swap data to get it into the memory
if (@$(SLAVE.BUS.WIDTH) == 32) {
char *bswapd = new char[len+8];
memcpy(bswapd, &buf[offset], wlen);
byteswapbuf(len>>2, (uint32_t *)bswapd);
memcpy(&m_core->block_ram[start], bswapd, wlen);
delete[] bswapd;
} else {
for(unsigned jk=0; jk<wlen; jk=jk+1) {
unsigned word_addr, subword_addr;
unsigned *wp;
char *cp;
word_addr = start+jk;
word_addr /= @$(SLAVE.BUS.WIDTH)/8;
wp = m_core->block_ram[word_addr];
cp = (char *)wp;
subword_addr = start+jk;
subword_addr = ~subword_addr;
subword_addr &= @$(SLAVE.BUS.WIDTH)/8-1;
// subword_addr = @$(SLAVE.BUS.WIDTH)/8-subword_addr;
cp[subword_addr] = buf[offset+jk];
}
}