Added HyperRAM submodule (to be hardened as a macro).
diff --git a/.gitmodules b/.gitmodules
index 75fcba6..577155a 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -7,3 +7,6 @@
[submodule "wb_ram_bus_mux"]
path = wb_ram_bus_mux
url = https://github.com/embelon/wb_ram_bus_mux.git
+[submodule "wb_hyperram"]
+ path = wb_hyperram
+ url = https://github.com/embelon/wb_hyperram.git
diff --git a/openlane/user_project_wrapper/config.tcl b/openlane/user_project_wrapper/config.tcl
index 1e90b84..cbe2d2e 100755
--- a/openlane/user_project_wrapper/config.tcl
+++ b/openlane/user_project_wrapper/config.tcl
@@ -39,20 +39,21 @@
## Clock configurations
set ::env(CLOCK_PORT) [list {wb_clk_i user_clock2}]
-set ::env(CLOCK_NET) [list {openram_1kB.openram_clk0 wb_openram_wrapper.wb_clk_i wb_bus_mux.wb_clk_i}]
+set ::env(CLOCK_NET) [list {openram_1kB.openram_clk0 wb_openram_wrapper.wb_clk_i wb_bus_mux.wb_clk_i wb_hyperram.wb_clk_i}]
set ::env(CLOCK_PERIOD) "13"
## Internal Macros
### Macro PDN Connections
set ::env(FP_PDN_ENABLE_MACROS_GRID) "1"
-set ::env(FP_PDN_CORE_RING) "1"
+## set ::env(FP_PDN_CORE_RING) "1"
## set ::env(FP_PDN_ENABLE_GLOBAL_CONNECTIONS) "1"
set ::env(FP_PDN_MACRO_HOOKS) "\
wb_openram_wrapper vccd1 vssd1 \
openram_1kB vccd1 vssd1 \
- wb_bus_mux vccd1 vssd1 "
+ wb_bus_mux vccd1 vssd1 \
+ wb_hyperram vccd1 vssd1 "
set ::env(VDD_NETS) "vccd1 vccd2 vdda1 vdda2"
set ::env(GND_NETS) "vssd1 vssd2 vssa1 vssa2"
@@ -73,16 +74,19 @@
$::env(CARAVEL_ROOT)/verilog/rtl/defines.v \
$script_dir/../../wb_openram_wrapper/src/wb_openram_wrapper.v \
$script_dir/../../wb_ram_bus_mux/src/wb_ram_bus_mux.v \
+ $script_dir/../../wb_hyperram/src/wb_hyperram.v \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/verilog/sky130_sram_1kbyte_1rw1r_32x256_8.v"
set ::env(EXTRA_LEFS) "\
$script_dir/../../wb_openram_wrapper/lef/wb_openram_wrapper.lef \
$script_dir/../../wb_ram_bus_mux/lef/wb_ram_bus_mux.lef \
+ $script_dir/../../wb_hyperram/lef/wb_hyperram.lef \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/lef/sky130_sram_1kbyte_1rw1r_32x256_8.lef"
set ::env(EXTRA_GDS_FILES) "\
$script_dir/../../wb_openram_wrapper/gds/wb_openram_wrapper.gds \
$script_dir/../../wb_ram_bus_mux/gds/wb_ram_bus_mux.gds \
+ $script_dir/../../wb_hyperram/gds/wb_hyperram.gds \
$::env(PDK_ROOT)/$::env(PDK)/libs.ref/sky130_sram_macros/gds/sky130_sram_1kbyte_1rw1r_32x256_8.gds"
# use 4 cores
diff --git a/openlane/user_project_wrapper/macro.cfg b/openlane/user_project_wrapper/macro.cfg
index 82b26d0..63a7bf5 100644
--- a/openlane/user_project_wrapper/macro.cfg
+++ b/openlane/user_project_wrapper/macro.cfg
@@ -1,3 +1,4 @@
openram_1kB 1000 1000 N
wb_openram_wrapper 1700 700 N
wb_bus_mux 2000 600 N
+wb_hyperram 2400 700 N
\ No newline at end of file
diff --git a/verilog/dv/wb_openram/wb_openram.c b/verilog/dv/wb_openram/wb_openram.c
index 488deed..589f1fe 100644
--- a/verilog/dv/wb_openram/wb_openram.c
+++ b/verilog/dv/wb_openram/wb_openram.c
@@ -20,6 +20,7 @@
#include "verilog/dv/caravel/stub.c"
// Caravel allows user project to use 0x30xx_xxxx address space on Wishbone bus
+// OpenRAM
// 0x30c0_0000 till 30c0_03ff -> 256 Words of OpenRAM (1024 Bytes)
#define OPENRAM_BASE_ADDRESS 0x30c00000
#define OPENRAM_SIZE_DWORDS 256ul
@@ -27,6 +28,26 @@
#define OPENRAM_ADDRESS_MASK (OPENRAM_SIZE_BYTES - 1)
#define OPENRAM_MEM(offset) (*(volatile uint32_t*)(OPENRAM_BASE_ADDRESS + (offset & OPENRAM_ADDRESS_MASK)))
+// Caravel allows user project to use 0x30xx_xxxx address space on Wishbone bus
+// HyperRAM has 8MB -> mask is 0x007fffff
+// 0x3000_0000 till 307f_ffff -> RAM / MEM inisde chip
+#define hyperram_mem_base_address 0x30000000
+#define hyperram_mem_mask 0x007fffff
+#define hyperram_mem(offset) (*(volatile uint32_t*)(hyperram_mem_base_address + (offset & hyperram_mem_mask)))
+// 0x3080_00xx -> register space inside chip
+#define hyperram_reg_base_address 0x30800000
+#define hyperram_reg_mask 0x0000ffff
+#define hyperram_reg(num) (*(volatile uint32_t*)(hyperram_reg_base_address + ((2 * num) & hyperram_reg_mask)))
+// 0x3081_00xx -> CSR space for driver / peripheral configuration
+#define hyperram_csr_base_address 0x30810000
+#define hyperram_csr_mask 0x0000ffff
+#define hyperram_csr_latency (*(volatile uint32_t*)(hyperram_csr_base_address + 0x00))
+#define hyperram_csr_tpre_tpost (*(volatile uint32_t*)(hyperram_csr_base_address + 0x04))
+#define hyperram_csr_tcsh (*(volatile uint32_t*)(hyperram_csr_base_address + 0x08))
+#define hyperram_csr_trmax (*(volatile uint32_t*)(hyperram_csr_base_address + 0x0c))
+#define hyperram_csr_status (*(volatile uint32_t*)(hyperram_csr_base_address + 0x10))
+
+
// Generates 32bits wide value out of address, not random
unsigned long generate_value(unsigned long address)
{
@@ -82,9 +103,17 @@
reg_mprj_xfer = 1;
while (reg_mprj_xfer == 1);
+ // reset HyperRAM IP
+ reg_la0_oenb = 0;
+ reg_la0_iena = 0;
+ reg_la0_data = 1;
+ reg_la0_data = 0;
+
// Flag start of the test
reg_mprj_datal = 0xA8000000;
+ // OpenRAM test
+
// Fill memory
for (address = 0; address < OPENRAM_SIZE_DWORDS; address += 32)
{
@@ -103,6 +132,42 @@
}
}
+ // HyperRAM test
+
+ // write register space inside hyperram
+ hyperram_reg(0x2) = 0xa573;
+
+ // write memory, low addresses, default tacc (latency) is 6 cycles (default)
+ hyperram_mem(0x320) = 0xfecdba89;
+ hyperram_mem(0x1234) = 0x13579246;
+
+ // write latency csr
+ // fixed & double latency
+ // tacc = 4 cycles
+ hyperram_csr_latency = 0x34;
+ // read latency csr
+ volatile uint32_t read = hyperram_csr_latency;
+ // if write unsucessful, loop until timeout
+ if (read != 0x34)
+ {
+ reg_mprj_datal = 0xAF000000;
+ return; // instant fail
+ }
+
+ // write memory, high addresses, tacc should be now 4 cycles
+ hyperram_mem(0x123450) = 0x12874562;
+ hyperram_mem(0x7ffff4) = 0x77f77f77;
+
+ // try to read memory and trigger timeout - there's no chip connected
+ read = hyperram_mem(0x135);
+/*
+ read = hyperram_csr_status;
+ if (hyperram_csr_status != 1)
+ {
+ reg_mprj_datal = 0xAF000000;
+ return; // instant fail
+ }
+*/
reg_mprj_datal = 0xAC000000; // pass
}
diff --git a/verilog/dv/wb_openram/wb_openram.hex b/verilog/dv/wb_openram/wb_openram.hex
deleted file mode 100755
index 239832e..0000000
--- a/verilog/dv/wb_openram/wb_openram.hex
+++ /dev/null
@@ -1,54 +0,0 @@
-@00000000
-93 00 00 00 93 01 00 00 13 02 00 00 93 02 00 00
-13 03 00 00 93 03 00 00 13 04 00 00 93 04 00 00
-13 05 00 00 93 05 00 00 13 06 00 00 93 06 00 00
-13 07 00 00 93 07 00 00 13 08 00 00 93 08 00 00
-13 09 00 00 93 09 00 00 13 0A 00 00 93 0A 00 00
-13 0B 00 00 93 0B 00 00 13 0C 00 00 93 0C 00 00
-13 0D 00 00 93 0D 00 00 13 0E 00 00 93 0E 00 00
-13 0F 00 00 93 0F 00 00 17 05 00 00 13 05 85 2D
-93 05 00 00 13 06 00 00 63 D8 C5 00 14 41 94 C1
-11 05 91 05 E3 CC C5 FE 13 05 00 00 93 05 00 00
-63 57 B5 00 23 20 05 00 11 05 E3 4D B5 FE 81 2A
-01 A0 01 00 B7 02 00 28 13 03 00 12 23 90 62 00
-A3 81 02 00 05 C6 21 4F 93 73 F6 0F 93 DE 73 00
-23 80 D2 01 93 EE 0E 01 23 80 D2 01 86 03 93 F3
-F3 0F 7D 1F E3 14 0F FE 23 80 62 00 A1 C9 13 0F
-00 02 83 23 05 00 A1 4F 93 DE F3 01 23 80 D2 01
-93 EE 0E 01 23 80 D2 01 83 CE 02 00 93 FE 2E 00
-93 DE 1E 00 86 03 B3 E3 D3 01 7D 1F 63 17 0F 00
-23 20 75 00 11 05 83 23 05 00 FD 1F E3 96 0F FC
-FD 15 F1 F1 63 04 0F 00 23 20 75 00 13 03 00 08
-A3 81 62 00 82 80 01 00 00 00 01 11 06 CE 22 CC
-00 10 AA 87 A3 07 F4 FE 03 47 F4 FE A9 47 63 14
-F7 00 35 45 DD 37 B7 07 00 20 91 07 03 47 F4 FE
-98 C3 01 00 F2 40 62 44 05 61 82 80 01 11 06 CE
-22 CC 00 10 23 26 A4 FE 19 A8 83 27 C4 FE 13 87
-17 00 23 26 E4 FE 83 C7 07 00 3E 85 7D 37 83 27
-C4 FE 83 C7 07 00 F5 F3 01 00 F2 40 62 44 05 61
-82 80 01 11 22 CE 00 10 23 26 A4 FE 83 27 C4 FE
-93 C7 F7 FF 13 97 37 01 B7 07 F8 1F 7D 8F 83 27
-C4 FE 93 C7 F7 FF 93 96 C7 00 B7 F7 3F 00 F5 8F
-3E 97 83 27 C4 FE 93 C7 F7 FF 93 96 27 00 85 67
-F1 17 F5 8F B9 8F 3E 85 72 44 05 61 82 80 01 11
-06 CE 22 CC 26 CA 00 10 23 24 04 FE B7 07 00 24
-29 67 09 07 98 C3 B7 07 00 26 93 87 07 0A 09 67
-13 07 97 80 98 C3 B7 07 00 26 93 87 C7 09 09 67
-13 07 97 80 98 C3 B7 07 00 26 93 87 87 09 09 67
-13 07 97 80 98 C3 B7 07 00 26 93 87 47 09 09 67
-13 07 97 80 98 C3 B7 07 00 26 93 87 07 09 09 67
-13 07 97 80 98 C3 B7 07 00 26 93 87 C7 08 09 67
-13 07 97 80 98 C3 B7 07 00 26 93 87 87 08 09 67
-13 07 97 80 98 C3 B7 07 00 26 93 87 47 08 09 67
-13 07 97 80 98 C3 B7 07 00 26 05 47 98 C3 01 00
-B7 07 00 26 98 43 85 47 E3 0C F7 FE B7 07 00 26
-B1 07 37 07 00 A8 98 C3 23 26 04 FE 25 A0 83 27
-C4 FE 13 F7 F7 3F B7 07 C0 30 BA 97 BE 84 03 25
-C4 FE C5 35 AA 87 9C C0 83 27 C4 FE 93 87 07 02
-23 26 F4 FE 03 27 C4 FE 93 07 F0 0F E3 F9 E7 FC
-23 26 04 FE 25 A8 83 27 C4 FE 13 F7 F7 3F B7 07
-C0 30 BA 97 84 43 03 25 C4 FE 65 35 AA 87 63 89
-F4 00 B7 07 00 26 B1 07 37 07 00 AF 98 C3 1D A0
-83 27 C4 FE 93 87 07 02 23 26 F4 FE 03 27 C4 FE
-93 07 F0 0F E3 F1 E7 FC B7 07 00 26 B1 07 37 07
-00 AC 98 C3 F2 40 62 44 D2 44 05 61 82 80 00 00
diff --git a/verilog/rtl/uprj_netlists.v b/verilog/rtl/uprj_netlists.v
index fb6fd06..bcf21d7 100644
--- a/verilog/rtl/uprj_netlists.v
+++ b/verilog/rtl/uprj_netlists.v
@@ -23,10 +23,16 @@
`include "gl/user_project_wrapper.v"
`include "../wb_openram_wrapper/src/wb_openram_wrapper.v"
`include "../wb_ram_bus_mux/src/wb_ram_bus_mux.v"
+ `include "../wb_hyperram/src/hyperram.v"
+ `include "../wb_hyperram/src/register_rw.v"
+ `include "../wb_hyperram/src/wb_hyperram.v"
`include "libs.ref/sky130_sram_macros/verilog/sky130_sram_1kbyte_1rw1r_32x256_8.v"
`else
`include "user_project_wrapper.v"
`include "../../wb_openram_wrapper/src/wb_openram_wrapper.v"
`include "../../wb_ram_bus_mux/src/wb_ram_bus_mux.v"
+ `include "../../wb_hyperram/src/hyperram.v"
+ `include "../../wb_hyperram/src/register_rw.v"
+ `include "../../wb_hyperram/src/wb_hyperram.v"
`include "libs.ref/sky130_sram_macros/verilog/sky130_sram_1kbyte_1rw1r_32x256_8.v"
`endif
\ No newline at end of file
diff --git a/verilog/rtl/user_project_wrapper.v b/verilog/rtl/user_project_wrapper.v
index 7418f42..b159322 100644
--- a/verilog/rtl/user_project_wrapper.v
+++ b/verilog/rtl/user_project_wrapper.v
@@ -100,6 +100,15 @@
wire wbs_or_ack;
wire [31:0] wbs_or_dat_o;
+// Signals connecting HyperRAM wrapper to Bus MUX
+wire wbs_hr_stb;
+wire wbs_hr_cyc;
+wire wbs_hr_we;
+wire [3:0] wbs_hr_sel;
+wire [31:0] wbs_hr_dat_i;
+wire wbs_hr_ack;
+wire [31:0] wbs_hr_dat_o;
+
sky130_sram_1kbyte_1rw1r_32x256_8 openram_1kB
(
@@ -147,6 +156,48 @@
.ram_dout0 (openram_din0)
);
+
+wire hb_dq_oen;
+
+wb_hyperram hyperram
+(
+`ifdef USE_POWER_PINS
+ .vccd1 (vccd1), // User area 1 1.8V supply
+ .vssd1 (vssd1), // User area 1 digital ground
+`endif
+
+ .wb_clk_i (wb_clk_i),
+ .wb_rst_i (wb_rst_i),
+
+ .wbs_stb_i (wbs_hr_stb),
+ .wbs_cyc_i (wbs_hr_cyc),
+ .wbs_we_i (wbs_hr_we),
+ .wbs_sel_i (wbs_hr_sel),
+ .wbs_dat_i (wbs_hr_dat_o),
+ .wbs_adr_i (wbs_adr_i),
+ .wbs_ack_o (wbs_hr_ack),
+ .wbs_dat_o (wbs_hr_dat_i),
+
+ .rst_i (la_data_in[0]),
+
+ .hb_rstn_o (io_out[8]),
+ .hb_csn_o (io_out[9]),
+ .hb_clk_o (io_out[10]),
+ .hb_clkn_o (io_out[11]),
+ .hb_rwds_o (io_out[12]),
+ .hb_rwds_oen (io_oeb[12]),
+ .hb_rwds_i (io_in[12]),
+ .hb_dq_o (io_out[20:13]),
+ .hb_dq_oen (hb_dq_oen),
+ .hb_dq_i (io_in[20:13])
+);
+
+assign io_oeb[20:13] = {8{hb_dq_oen}};
+
+// enable outputs for rst, csn, clk, clkn
+assign io_oeb[11:8] = 4'h0;
+
+
wb_ram_bus_mux wb_bus_mux
(
`ifdef USE_POWER_PINS
@@ -165,16 +216,15 @@
.wbs_ufp_adr_i (wbs_adr_i),
.wbs_ufp_ack_o (wbs_ack_o),
.wbs_ufp_dat_o (wbs_dat_o),
-/*
+
// Wishbone HR (Downward Facing Port) - HyperRAM driver
- output wbs_hr_stb_o,
- output wbs_hr_cyc_o,
- output wbs_hr_we_o,
- output [3:0] wbs_hr_sel_o,
- input [31:0] wbs_hr_dat_i,
- input wbs_hr_ack_i,
- output [31:0] wbs_hr_dat_o,
-*/
+ .wbs_hr_stb_o (wbs_hr_stb),
+ .wbs_hr_cyc_o (wbs_hr_cyc),
+ .wbs_hr_we_o (wbs_hr_we),
+ .wbs_hr_sel_o (wbs_hr_sel),
+ .wbs_hr_dat_i (wbs_hr_dat_i),
+ .wbs_hr_ack_i (wbs_hr_ack),
+ .wbs_hr_dat_o (wbs_hr_dat_o),
// Wishbone OR (Downward Facing Port) - OpenRAM
.wbs_or_stb_o (wbs_or_stb),
diff --git a/wb_hyperram b/wb_hyperram
new file mode 160000
index 0000000..3f7b51f
--- /dev/null
+++ b/wb_hyperram
@@ -0,0 +1 @@
+Subproject commit 3f7b51fd6d8a2a68ff8115949e1d3fde66f333f2