Skip to content

Commit fc79f6f

Browse files
gatecatrobtaylor
authored andcommitted
Adding export of I2C and SPIMemIO (QSPI XIP) IP for Verification (#25)
* export: Add SPIMemIO verilog export Signed-off-by: gatecat <[email protected]> * export: Add I2C verilog export Signed-off-by: gatecat <[email protected]> --------- Signed-off-by: gatecat <[email protected]>
1 parent 7b4d7a6 commit fc79f6f

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

my_design/ips/export_spi_flash.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
from amaranth import *
2+
from amaranth.lib import wiring
3+
from amaranth.lib.wiring import In, Out, flipped, connect
4+
from amaranth.utils import exact_log2
5+
6+
from amaranth_orchard.memory.spimemio import SPIMemIO, QSPIPins
7+
from amaranth_soc import csr, wishbone
8+
9+
# QSPI flash module Verilog export so it can be verified with pyuvm/verilator
10+
11+
# TODO: we wouldn't need this wrapper if SPIMemIO had flash as part of its signature
12+
class SPIMemIOWrapper(wiring.Component):
13+
def __init__(self):
14+
super().__init__({
15+
"flash": Out(QSPIPins.Signature()),
16+
"ctrl_bus": In(csr.Signature(addr_width=exact_log2(4), data_width=8)),
17+
"data_bus": In(wishbone.Signature(addr_width=exact_log2(4*1024*1024), data_width=32,
18+
granularity=8)),
19+
})
20+
def elaborate(self, platform):
21+
m = Module()
22+
m.submodules.memio = memio = SPIMemIO(name="spiflash", flash=self.flash)
23+
wiring.connect(m, flipped(self.ctrl_bus), memio.ctrl_bus)
24+
wiring.connect(m, flipped(self.data_bus), memio.data_bus)
25+
return m
26+
27+
if __name__ == '__main__':
28+
from amaranth.back import verilog
29+
from pathlib import Path
30+
spi = SPIMemIOWrapper()
31+
Path("build/export/ips").mkdir(parents=True, exist_ok=True)
32+
with open("build/export/ips/spimemio_ip.v", "w") as f:
33+
f.write(verilog.convert(spi, name="spimemio_ip"))

my_design/ips/i2c.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,11 @@ def elaborate(self, platform):
100100
self._status.f.ack.r_data.eq(i2c.ack_o),
101101
]
102102
return m
103+
104+
if __name__ == '__main__':
105+
from amaranth.back import verilog
106+
from pathlib import Path
107+
i2c = I2CPeripheral(name="i2c")
108+
Path("build/export/ips").mkdir(parents=True, exist_ok=True)
109+
with open("build/export/ips/i2c.v", "w") as f:
110+
f.write(verilog.convert(i2c, name="i2c_peripheral"))

0 commit comments

Comments
 (0)