Skip to content

Commit 6e67bd6

Browse files
committed
fpga/mqnic/fb4CGg3: Add DRAM support on fb4CGg3
Signed-off-by: Alex Forencich <alex@alexforencich.com>
1 parent f1884b9 commit 6e67bd6

File tree

26 files changed

+3769
-118
lines changed

26 files changed

+3769
-118
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Timing constraints for FPGA boot logic
2+
3+
set_property ASYNC_REG TRUE [get_cells "fpga_boot_sync_reg_0_reg fpga_boot_sync_reg_1_reg"]
4+
set_false_path -to [get_pins "fpga_boot_sync_reg_0_reg/D"]

fpga/mqnic/fb4CGg3/fpga_100g/fpga.xdc

Lines changed: 525 additions & 12 deletions
Large diffs are not rendered by default.

fpga/mqnic/fb4CGg3/fpga_100g/fpga/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ FPGA_ARCH = virtexuplus
99
# Files for synthesis
1010
SYN_FILES = rtl/fpga.v
1111
SYN_FILES += rtl/fpga_core.v
12+
SYN_FILES += rtl/bmc_spi.v
1213
SYN_FILES += rtl/sync_signal.v
1314
SYN_FILES += rtl/common/mqnic_core_pcie_us.v
1415
SYN_FILES += rtl/common/mqnic_core_pcie.v
@@ -114,6 +115,7 @@ SYN_FILES += lib/pcie/rtl/pulse_merge.v
114115
# XDC files
115116
XDC_FILES = fpga.xdc
116117
XDC_FILES += placement.xdc
118+
XDC_FILES += boot.xdc
117119
XDC_FILES += lib/axis/syn/vivado/axis_async_fifo.tcl
118120
XDC_FILES += lib/axis/syn/vivado/sync_reset.tcl
119121
XDC_FILES += lib/eth/syn/vivado/ptp_clock_cdc.tcl
@@ -129,6 +131,8 @@ XDC_FILES += ../../../common/syn/vivado/led_sreg_driver.tcl
129131
IP_TCL_FILES = ip/pcie4_uscale_plus_0.tcl
130132
IP_TCL_FILES += ip/cmac_usplus.tcl
131133
IP_TCL_FILES += ip/cmac_gty.tcl
134+
#IP_TCL_FILES += ip/ddr4_0.tcl
135+
#IP_TCL_FILES += ip/ddr4_sodimm_0.tcl
132136

133137
# Configuration
134138
CONFIG_TCL_FILES = ./config.tcl

fpga/mqnic/fb4CGg3/fpga_100g/fpga/config.tcl

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@ dict set params MAX_RX_SIZE "9214"
108108
dict set params TX_RAM_SIZE "131072"
109109
dict set params RX_RAM_SIZE "131072"
110110

111+
# RAM configuration
112+
dict set params DDR_CH "4"
113+
dict set params DDR_ENABLE "0"
114+
dict set params AXI_DDR_ID_WIDTH "8"
115+
dict set params AXI_DDR_MAX_BURST_LEN "256"
116+
111117
# Application block configuration
112118
dict set params APP_ID "32'h00000000"
113119
dict set params APP_ENABLE "0"
@@ -151,6 +157,43 @@ dict set params STAT_PCIE_ENABLE "1"
151157
dict set params STAT_INC_WIDTH "24"
152158
dict set params STAT_ID_WIDTH "12"
153159

160+
# DDR4 MIG settings
161+
if {[dict get $params DDR_ENABLE]} {
162+
# components (DDR4 A, DDR4 B)
163+
set ddr4 [get_ips ddr4_0]
164+
165+
# performance-related configuration
166+
set_property CONFIG.C0.DDR4_AxiArbitrationScheme {RD_PRI_REG} $ddr4
167+
set_property CONFIG.C0.DDR4_AUTO_AP_COL_A3 {true} $ddr4
168+
set_property CONFIG.C0.DDR4_Mem_Add_Map {ROW_COLUMN_BANK_INTLV} $ddr4
169+
170+
# set AXI ID width
171+
set_property CONFIG.C0.DDR4_AxiIDWidth [dict get $params AXI_DDR_ID_WIDTH] $ddr4
172+
173+
# extract AXI configuration
174+
dict set params AXI_DDR_DATA_WIDTH [get_property CONFIG.C0.DDR4_AxiDataWidth $ddr4]
175+
dict set params AXI_DDR_ADDR_WIDTH [get_property CONFIG.C0.DDR4_AxiAddressWidth $ddr4]
176+
dict set params AXI_DDR_NARROW_BURST [expr [get_property CONFIG.C0.DDR4_AxiNarrowBurst $ddr4] && 1]
177+
178+
if {[dict get $params DDR_CH] > 2} {
179+
# SO-DIMMs (DDR4 SODMM A, DDR4 SODIMM B)
180+
set ddr4 [get_ips ddr4_sodimm_0]
181+
182+
# performance-related configuration
183+
set_property CONFIG.C0.DDR4_AxiArbitrationScheme {RD_PRI_REG} $ddr4
184+
set_property CONFIG.C0.DDR4_AUTO_AP_COL_A3 {true} $ddr4
185+
set_property CONFIG.C0.DDR4_Mem_Add_Map {ROW_COLUMN_BANK_INTLV} $ddr4
186+
187+
# set AXI ID width
188+
set_property CONFIG.C0.DDR4_AxiIDWidth [dict get $params AXI_DDR_ID_WIDTH] $ddr4
189+
190+
# extract AXI configuration
191+
dict set params AXI_DDR_DATA_WIDTH [get_property CONFIG.C0.DDR4_AxiDataWidth $ddr4]
192+
dict set params AXI_DDR_ADDR_WIDTH [expr max([get_property CONFIG.C0.DDR4_AxiAddressWidth $ddr4], [dict get $params AXI_DDR_ADDR_WIDTH])]
193+
dict set params AXI_DDR_NARROW_BURST [expr [get_property CONFIG.C0.DDR4_AxiNarrowBurst $ddr4] && [dict get $params AXI_DDR_NARROW_BURST]]
194+
}
195+
}
196+
154197
# PCIe IP core settings
155198
set pcie [get_ips pcie4_uscale_plus_0]
156199

fpga/mqnic/fb4CGg3/fpga_100g/fpga_app_dma_bench/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ FPGA_ARCH = virtexuplus
99
# Files for synthesis
1010
SYN_FILES = rtl/fpga.v
1111
SYN_FILES += rtl/fpga_core.v
12+
SYN_FILES += rtl/bmc_spi.v
1213
SYN_FILES += rtl/sync_signal.v
1314
SYN_FILES += rtl/common/mqnic_core_pcie_us.v
1415
SYN_FILES += rtl/common/mqnic_core_pcie.v
@@ -121,6 +122,7 @@ SYN_FILES += lib/pcie/rtl/pulse_merge.v
121122
# XDC files
122123
XDC_FILES = fpga.xdc
123124
XDC_FILES += placement.xdc
125+
XDC_FILES += boot.xdc
124126
XDC_FILES += lib/axi/syn/vivado/axi_vfifo_raw.tcl
125127
XDC_FILES += lib/axi/syn/vivado/axi_vfifo_raw_wr.tcl
126128
XDC_FILES += lib/axi/syn/vivado/axi_vfifo_raw_rd.tcl
@@ -140,6 +142,8 @@ XDC_FILES += app/dma_bench/syn/vivado/dram_test_ch.tcl
140142
IP_TCL_FILES = ip/pcie4_uscale_plus_0.tcl
141143
IP_TCL_FILES += ip/cmac_usplus.tcl
142144
IP_TCL_FILES += ip/cmac_gty.tcl
145+
IP_TCL_FILES += ip/ddr4_0.tcl
146+
IP_TCL_FILES += ip/ddr4_sodimm_0.tcl
143147

144148
# Configuration
145149
CONFIG_TCL_FILES = ./config.tcl

fpga/mqnic/fb4CGg3/fpga_100g/fpga_app_dma_bench/config.tcl

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,12 @@ dict set params MAX_RX_SIZE "9214"
108108
dict set params TX_RAM_SIZE "131072"
109109
dict set params RX_RAM_SIZE "131072"
110110

111+
# RAM configuration
112+
dict set params DDR_CH "4"
113+
dict set params DDR_ENABLE "1"
114+
dict set params AXI_DDR_ID_WIDTH "8"
115+
dict set params AXI_DDR_MAX_BURST_LEN "256"
116+
111117
# Application block configuration
112118
dict set params APP_ID "32'h12348001"
113119
dict set params APP_ENABLE "1"
@@ -151,6 +157,43 @@ dict set params STAT_PCIE_ENABLE "1"
151157
dict set params STAT_INC_WIDTH "24"
152158
dict set params STAT_ID_WIDTH "12"
153159

160+
# DDR4 MIG settings
161+
if {[dict get $params DDR_ENABLE]} {
162+
# components (DDR4 A, DDR4 B)
163+
set ddr4 [get_ips ddr4_0]
164+
165+
# performance-related configuration
166+
set_property CONFIG.C0.DDR4_AxiArbitrationScheme {RD_PRI_REG} $ddr4
167+
set_property CONFIG.C0.DDR4_AUTO_AP_COL_A3 {true} $ddr4
168+
set_property CONFIG.C0.DDR4_Mem_Add_Map {ROW_COLUMN_BANK_INTLV} $ddr4
169+
170+
# set AXI ID width
171+
set_property CONFIG.C0.DDR4_AxiIDWidth [dict get $params AXI_DDR_ID_WIDTH] $ddr4
172+
173+
# extract AXI configuration
174+
dict set params AXI_DDR_DATA_WIDTH [get_property CONFIG.C0.DDR4_AxiDataWidth $ddr4]
175+
dict set params AXI_DDR_ADDR_WIDTH [get_property CONFIG.C0.DDR4_AxiAddressWidth $ddr4]
176+
dict set params AXI_DDR_NARROW_BURST [expr [get_property CONFIG.C0.DDR4_AxiNarrowBurst $ddr4] && 1]
177+
178+
if {[dict get $params DDR_CH] > 2} {
179+
# SO-DIMMs (DDR4 SODMM A, DDR4 SODIMM B)
180+
set ddr4 [get_ips ddr4_sodimm_0]
181+
182+
# performance-related configuration
183+
set_property CONFIG.C0.DDR4_AxiArbitrationScheme {RD_PRI_REG} $ddr4
184+
set_property CONFIG.C0.DDR4_AUTO_AP_COL_A3 {true} $ddr4
185+
set_property CONFIG.C0.DDR4_Mem_Add_Map {ROW_COLUMN_BANK_INTLV} $ddr4
186+
187+
# set AXI ID width
188+
set_property CONFIG.C0.DDR4_AxiIDWidth [dict get $params AXI_DDR_ID_WIDTH] $ddr4
189+
190+
# extract AXI configuration
191+
dict set params AXI_DDR_DATA_WIDTH [get_property CONFIG.C0.DDR4_AxiDataWidth $ddr4]
192+
dict set params AXI_DDR_ADDR_WIDTH [expr max([get_property CONFIG.C0.DDR4_AxiAddressWidth $ddr4], [dict get $params AXI_DDR_ADDR_WIDTH])]
193+
dict set params AXI_DDR_NARROW_BURST [expr [get_property CONFIG.C0.DDR4_AxiNarrowBurst $ddr4] && [dict get $params AXI_DDR_NARROW_BURST]]
194+
}
195+
}
196+
154197
# PCIe IP core settings
155198
set pcie [get_ips pcie4_uscale_plus_0]
156199

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
create_ip -name ddr4 -vendor xilinx.com -library ip -module_name ddr4_0
3+
4+
set_property -dict [list \
5+
CONFIG.C0.DDR4_AxiSelection {true} \
6+
CONFIG.C0.DDR4_AxiDataWidth {512} \
7+
CONFIG.C0.DDR4_AxiIDWidth {8} \
8+
CONFIG.C0.DDR4_AxiArbitrationScheme {RD_PRI_REG} \
9+
CONFIG.C0.DDR4_TimePeriod {833} \
10+
CONFIG.C0.DDR4_InputClockPeriod {3750} \
11+
CONFIG.C0.DDR4_MemoryType {Components} \
12+
CONFIG.C0.DDR4_MemoryPart {MT40A512M16HA-083E} \
13+
CONFIG.C0.DDR4_DataWidth {64} \
14+
CONFIG.C0.DDR4_AUTO_AP_COL_A3 {true} \
15+
CONFIG.C0.DDR4_CasLatency {16} \
16+
CONFIG.C0.DDR4_CasWriteLatency {12} \
17+
CONFIG.C0.DDR4_Mem_Add_Map {ROW_COLUMN_BANK_INTLV}
18+
] [get_ips ddr4_0]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
create_ip -name ddr4 -vendor xilinx.com -library ip -module_name ddr4_sodimm_0
3+
4+
set_property -dict [list \
5+
CONFIG.C0.DDR4_AxiSelection {true} \
6+
CONFIG.C0.DDR4_AxiDataWidth {512} \
7+
CONFIG.C0.DDR4_AxiIDWidth {8} \
8+
CONFIG.C0.DDR4_AxiArbitrationScheme {RD_PRI_REG} \
9+
CONFIG.C0.DDR4_TimePeriod {833} \
10+
CONFIG.C0.DDR4_InputClockPeriod {3750} \
11+
CONFIG.C0.DDR4_MemoryType {SODIMMs} \
12+
CONFIG.C0.DDR4_MemoryPart {MTA8ATF1G64HZ-2G3} \
13+
CONFIG.C0.DDR4_DataWidth {64} \
14+
CONFIG.C0.DDR4_AUTO_AP_COL_A3 {true} \
15+
CONFIG.C0.DDR4_CasLatency {17} \
16+
CONFIG.C0.DDR4_CasWriteLatency {12} \
17+
CONFIG.C0.DDR4_Mem_Add_Map {ROW_COLUMN_BANK_INTLV}
18+
] [get_ips ddr4_sodimm_0]

0 commit comments

Comments
 (0)