-
Notifications
You must be signed in to change notification settings - Fork 19
/
bkram.txt
104 lines (101 loc) · 3.04 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
################################################################################
##
## Filename: 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-2))
@$NBYTES=(1<<(@$THIS.LGMEMSZ))
@NBYTES.FORMAT=0x%08x
@ACCESS=@$(DEVID)_ACCESS
@SLAVE.TYPE=MEMORY
@SLAVE.BUS=wb
@MAIN.INSERT=
memdev #(
.LGMEMSZ(@$(THIS.LGMEMSZ)),
.DW(@$(SLAVE.BUS.WIDTH)),
.EXTRACLOCK(1)
) @$(PREFIX)i(
.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.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 VVAR(_@$(PREFIX)i__DOT__mem)
@$BUSBYTES=@$(SLAVE.BUS.WIDTH)/8
@SIM.LOAD=
char *mem;
start = start & (-(@$(BUSBYTES)));
wlen = (wlen+(@$(BUSBYTES)-1))&(-@$(BUSBYTES));
// Need to byte swap data to get it into the memory
// But ... it's byte swapping at the *WORD* width, not
// the 32-bit width we've built the byteswapbuf() for.
mem = (char *)&m_core->block_ram[start];
for(unsigned k=0; k<wlen; k++) {
unsigned s;
s = (k&(-@$(BUSBYTES)))
|((@$(BUSBYTES)-1-k) & (@$(BUSBYTES)-1));
mem[s] = buf[k];
}